CAUTION - File contains old violation objects. These violations are no longer supported & will not be loaded. Please run DRC after opening this file in order to refresh the violations.
+
+
+
Summer 09
+
CAUTION - Existing testpoint rules and settings are used as fabrication testpoint information.
+
+
+
Release 12
+
CAUTION - Air Gap Width previously controlled by Clearance rule is now controlled by Polygon Connect Style rule's newly introduced Air Gap Width (set to default value). Suggest reviewing each Polygon Connect Style rule's Air Gap Width attribute for correctness.
+
+
+
Release 13
+
CAUTION - Silkscreen Over Component Pads Rules are converted to Silk To Solder Mask Clearance Rules. Suggest examining rule scopes for accuracy.
+
+
+
+
This file was generated by an earlier version of the software
CAUTION - File contains old violation objects. These violations are no longer supported & will not be loaded. Please run DRC after opening this file in order to refresh the violations.
+
+
+
Summer 09
+
CAUTION - Existing testpoint rules and settings are used as fabrication testpoint information.
+
+
+
Release 12
+
CAUTION - Air Gap Width previously controlled by Clearance rule is now controlled by Polygon Connect Style rule's newly introduced Air Gap Width (set to default value). Suggest reviewing each Polygon Connect Style rule's Air Gap Width attribute for correctness.
+
+
+
Release 13
+
CAUTION - Silkscreen Over Component Pads Rules are converted to Silk To Solder Mask Clearance Rules. Suggest examining rule scopes for accuracy.
+
+
+
+
This file was generated by an earlier version of the software
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F10x_CONF_H
+#define __STM32F10x_CONF_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Uncomment the line below to enable peripheral header file inclusion */
+//#include "stm32f10x_adc.h"
+//#include "stm32f10x_bkp.h"
+//#include "stm32f10x_can.h"
+//#include "stm32f10x_crc.h"
+//#include "stm32f10x_dac.h"
+#include "stm32f10x_dbgmcu.h"
+//#include "stm32f10x_dma.h"
+#include "stm32f10x_exti.h"
+#include "stm32f10x_flash.h"
+//#include "stm32f10x_fsmc.h"
+#include "stm32f10x_gpio.h"
+//#include "stm32f10x_i2c.h"
+//#include "stm32f10x_iwdg.h"
+#include "stm32f10x_pwr.h"
+#include "stm32f10x_rcc.h"
+//#include "stm32f10x_rtc.h"
+//#include "stm32f10x_sdio.h"
+#include "stm32f10x_spi.h"
+#include "stm32f10x_tim.h"
+#include "stm32f10x_usart.h"
+//#include "stm32f10x_wwdg.h"
+#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Uncomment the line below to expanse the "assert_param" macro in the
+ Standard Peripheral Library drivers code */
+/* #define USE_FULL_ASSERT 1 */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+
+/*******************************************************************************
+* Macro Name : assert_param
+* Description : The assert_param macro is used for function's parameters check.
+* Input : - expr: If expr is false, it calls assert_failed function
+* which reports the name of the source file and the source
+* line number of the call that failed.
+* If expr is true, it returns no value.
+* Return : None
+*******************************************************************************/
+ #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0)
+#endif /* USE_FULL_ASSERT */
+
+#endif /* __STM32F10x_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/cmsis_boot/system_stm32f10x.c b/2.Firmware/STM32/Firmware/cmsis_boot/system_stm32f10x.c
new file mode 100644
index 0000000..836e616
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/cmsis_boot/system_stm32f10x.c
@@ -0,0 +1,1104 @@
+/**
+ ******************************************************************************
+ * @file system_stm32f10x.c
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File.
+ *
+ * 1. This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier
+ * factors, AHB/APBx prescalers and Flash settings).
+ * This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32f10x_xx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ * 2. After each device reset the HSI (8 MHz) is used as system clock source.
+ * Then SystemInit() function is called, in "startup_stm32f10x_xx.s" file, to
+ * configure the system clock before to branch to main program.
+ *
+ * 3. If the system clock source selected by user fails to startup, the SystemInit()
+ * function will do nothing and HSI still used as system clock source. User can
+ * add some code to deal with this issue inside the SetSysClock() function.
+ *
+ * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depedning on
+ * the product used), refer to "HSE_VALUE" define in "stm32f10x.h" file.
+ * When HSE is used as system clock source, directly or through PLL, and you
+ * are using different crystal you have to adapt the HSE value to your own
+ * configuration.
+ *
+ ******************************************************************************
+ * @attention
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F10x_CONF_H
+#define __STM32F10x_CONF_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Uncomment the line below to enable peripheral header file inclusion */
+//#include "stm32f10x_adc.h"
+//#include "stm32f10x_bkp.h"
+//#include "stm32f10x_can.h"
+//#include "stm32f10x_crc.h"
+//#include "stm32f10x_dac.h"
+#include "stm32f10x_dbgmcu.h"
+//#include "stm32f10x_dma.h"
+#include "stm32f10x_exti.h"
+#include "stm32f10x_flash.h"
+//#include "stm32f10x_fsmc.h"
+#include "stm32f10x_gpio.h"
+//#include "stm32f10x_i2c.h"
+//#include "stm32f10x_iwdg.h"
+#include "stm32f10x_pwr.h"
+#include "stm32f10x_rcc.h"
+//#include "stm32f10x_rtc.h"
+//#include "stm32f10x_sdio.h"
+#include "stm32f10x_spi.h"
+#include "stm32f10x_tim.h"
+#include "stm32f10x_usart.h"
+//#include "stm32f10x_wwdg.h"
+#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Uncomment the line below to expanse the "assert_param" macro in the
+ Standard Peripheral Library drivers code */
+/* #define USE_FULL_ASSERT 1 */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+
+/*******************************************************************************
+* Macro Name : assert_param
+* Description : The assert_param macro is used for function's parameters check.
+* Input : - expr: If expr is false, it calls assert_failed function
+* which reports the name of the source file and the source
+* line number of the call that failed.
+* If expr is true, it returns no value.
+* Return : None
+*******************************************************************************/
+ #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0)
+#endif /* USE_FULL_ASSERT */
+
+#endif /* __STM32F10x_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_lib/inc/misc.h b/2.Firmware/STM32/Firmware/stm_lib/inc/misc.h
new file mode 100644
index 0000000..9a6bd07
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_lib/inc/misc.h
@@ -0,0 +1,220 @@
+/**
+ ******************************************************************************
+ * @file misc.h
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 11-March-2011
+ * @brief This file contains all the functions prototypes for the miscellaneous
+ * firmware library functions (add-on to CMSIS functions).
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F10x_FSMC_H
+#define __STM32F10x_FSMC_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/** @addtogroup STM32F10x_StdPeriph_Driver
+ * @{
+ */
+
+/** @addtogroup FSMC
+ * @{
+ */
+
+/** @defgroup FSMC_Exported_Types
+ * @{
+ */
+
+/**
+ * @brief Timing parameters For NOR/SRAM Banks
+ */
+
+typedef struct
+{
+ uint32_t FSMC_AddressSetupTime; /*!< Defines the number of HCLK cycles to configure
+ the duration of the address setup time.
+ This parameter can be a value between 0 and 0xF.
+ @note: It is not used with synchronous NOR Flash memories. */
+
+ uint32_t FSMC_AddressHoldTime; /*!< Defines the number of HCLK cycles to configure
+ the duration of the address hold time.
+ This parameter can be a value between 0 and 0xF.
+ @note: It is not used with synchronous NOR Flash memories.*/
+
+ uint32_t FSMC_DataSetupTime; /*!< Defines the number of HCLK cycles to configure
+ the duration of the data setup time.
+ This parameter can be a value between 0 and 0xFF.
+ @note: It is used for SRAMs, ROMs and asynchronous multiplexed NOR Flash memories. */
+
+ uint32_t FSMC_BusTurnAroundDuration; /*!< Defines the number of HCLK cycles to configure
+ the duration of the bus turnaround.
+ This parameter can be a value between 0 and 0xF.
+ @note: It is only used for multiplexed NOR Flash memories. */
+
+ uint32_t FSMC_CLKDivision; /*!< Defines the period of CLK clock output signal, expressed in number of HCLK cycles.
+ This parameter can be a value between 1 and 0xF.
+ @note: This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses. */
+
+ uint32_t FSMC_DataLatency; /*!< Defines the number of memory clock cycles to issue
+ to the memory before getting the first data.
+ The value of this parameter depends on the memory type as shown below:
+ - It must be set to 0 in case of a CRAM
+ - It is don't care in asynchronous NOR, SRAM or ROM accesses
+ - It may assume a value between 0 and 0xF in NOR Flash memories
+ with synchronous burst mode enable */
+
+ uint32_t FSMC_AccessMode; /*!< Specifies the asynchronous access mode.
+ This parameter can be a value of @ref FSMC_Access_Mode */
+}FSMC_NORSRAMTimingInitTypeDef;
+
+/**
+ * @brief FSMC NOR/SRAM Init structure definition
+ */
+
+typedef struct
+{
+ uint32_t FSMC_Bank; /*!< Specifies the NOR/SRAM memory bank that will be used.
+ This parameter can be a value of @ref FSMC_NORSRAM_Bank */
+
+ uint32_t FSMC_DataAddressMux; /*!< Specifies whether the address and data values are
+ multiplexed on the databus or not.
+ This parameter can be a value of @ref FSMC_Data_Address_Bus_Multiplexing */
+
+ uint32_t FSMC_MemoryType; /*!< Specifies the type of external memory attached to
+ the corresponding memory bank.
+ This parameter can be a value of @ref FSMC_Memory_Type */
+
+ uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width.
+ This parameter can be a value of @ref FSMC_Data_Width */
+
+ uint32_t FSMC_BurstAccessMode; /*!< Enables or disables the burst access mode for Flash memory,
+ valid only with synchronous burst Flash memories.
+ This parameter can be a value of @ref FSMC_Burst_Access_Mode */
+
+ uint32_t FSMC_AsynchronousWait; /*!< Enables or disables wait signal during asynchronous transfers,
+ valid only with asynchronous Flash memories.
+ This parameter can be a value of @ref FSMC_AsynchronousWait */
+
+ uint32_t FSMC_WaitSignalPolarity; /*!< Specifies the wait signal polarity, valid only when accessing
+ the Flash memory in burst mode.
+ This parameter can be a value of @ref FSMC_Wait_Signal_Polarity */
+
+ uint32_t FSMC_WrapMode; /*!< Enables or disables the Wrapped burst access mode for Flash
+ memory, valid only when accessing Flash memories in burst mode.
+ This parameter can be a value of @ref FSMC_Wrap_Mode */
+
+ uint32_t FSMC_WaitSignalActive; /*!< Specifies if the wait signal is asserted by the memory one
+ clock cycle before the wait state or during the wait state,
+ valid only when accessing memories in burst mode.
+ This parameter can be a value of @ref FSMC_Wait_Timing */
+
+ uint32_t FSMC_WriteOperation; /*!< Enables or disables the write operation in the selected bank by the FSMC.
+ This parameter can be a value of @ref FSMC_Write_Operation */
+
+ uint32_t FSMC_WaitSignal; /*!< Enables or disables the wait-state insertion via wait
+ signal, valid for Flash memory access in burst mode.
+ This parameter can be a value of @ref FSMC_Wait_Signal */
+
+ uint32_t FSMC_ExtendedMode; /*!< Enables or disables the extended mode.
+ This parameter can be a value of @ref FSMC_Extended_Mode */
+
+ uint32_t FSMC_WriteBurst; /*!< Enables or disables the write burst operation.
+ This parameter can be a value of @ref FSMC_Write_Burst */
+
+ FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; /*!< Timing Parameters for write and read access if the ExtendedMode is not used*/
+
+ FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; /*!< Timing Parameters for write access if the ExtendedMode is used*/
+}FSMC_NORSRAMInitTypeDef;
+
+/**
+ * @brief Timing parameters For FSMC NAND and PCCARD Banks
+ */
+
+typedef struct
+{
+ uint32_t FSMC_SetupTime; /*!< Defines the number of HCLK cycles to setup address before
+ the command assertion for NAND-Flash read or write access
+ to common/Attribute or I/O memory space (depending on
+ the memory space timing to be configured).
+ This parameter can be a value between 0 and 0xFF.*/
+
+ uint32_t FSMC_WaitSetupTime; /*!< Defines the minimum number of HCLK cycles to assert the
+ command for NAND-Flash read or write access to
+ common/Attribute or I/O memory space (depending on the
+ memory space timing to be configured).
+ This parameter can be a number between 0x00 and 0xFF */
+
+ uint32_t FSMC_HoldSetupTime; /*!< Defines the number of HCLK clock cycles to hold address
+ (and data for write access) after the command deassertion
+ for NAND-Flash read or write access to common/Attribute
+ or I/O memory space (depending on the memory space timing
+ to be configured).
+ This parameter can be a number between 0x00 and 0xFF */
+
+ uint32_t FSMC_HiZSetupTime; /*!< Defines the number of HCLK clock cycles during which the
+ databus is kept in HiZ after the start of a NAND-Flash
+ write access to common/Attribute or I/O memory space (depending
+ on the memory space timing to be configured).
+ This parameter can be a number between 0x00 and 0xFF */
+}FSMC_NAND_PCCARDTimingInitTypeDef;
+
+/**
+ * @brief FSMC NAND Init structure definition
+ */
+
+typedef struct
+{
+ uint32_t FSMC_Bank; /*!< Specifies the NAND memory bank that will be used.
+ This parameter can be a value of @ref FSMC_NAND_Bank */
+
+ uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the NAND Memory Bank.
+ This parameter can be any value of @ref FSMC_Wait_feature */
+
+ uint32_t FSMC_MemoryDataWidth; /*!< Specifies the external memory device width.
+ This parameter can be any value of @ref FSMC_Data_Width */
+
+ uint32_t FSMC_ECC; /*!< Enables or disables the ECC computation.
+ This parameter can be any value of @ref FSMC_ECC */
+
+ uint32_t FSMC_ECCPageSize; /*!< Defines the page size for the extended ECC.
+ This parameter can be any value of @ref FSMC_ECC_Page_Size */
+
+ uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the
+ delay between CLE low and RE low.
+ This parameter can be a value between 0 and 0xFF. */
+
+ uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the
+ delay between ALE low and RE low.
+ This parameter can be a number between 0x0 and 0xFF */
+
+ FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */
+
+ FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */
+}FSMC_NANDInitTypeDef;
+
+/**
+ * @brief FSMC PCCARD Init structure definition
+ */
+
+typedef struct
+{
+ uint32_t FSMC_Waitfeature; /*!< Enables or disables the Wait feature for the Memory Bank.
+ This parameter can be any value of @ref FSMC_Wait_feature */
+
+ uint32_t FSMC_TCLRSetupTime; /*!< Defines the number of HCLK cycles to configure the
+ delay between CLE low and RE low.
+ This parameter can be a value between 0 and 0xFF. */
+
+ uint32_t FSMC_TARSetupTime; /*!< Defines the number of HCLK cycles to configure the
+ delay between ALE low and RE low.
+ This parameter can be a number between 0x0 and 0xFF */
+
+
+ FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_CommonSpaceTimingStruct; /*!< FSMC Common Space Timing */
+
+ FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_AttributeSpaceTimingStruct; /*!< FSMC Attribute Space Timing */
+
+ FSMC_NAND_PCCARDTimingInitTypeDef* FSMC_IOSpaceTimingStruct; /*!< FSMC IO Space Timing */
+}FSMC_PCCARDInitTypeDef;
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Exported_Constants
+ * @{
+ */
+
+/** @defgroup FSMC_NORSRAM_Bank
+ * @{
+ */
+#define FSMC_Bank1_NORSRAM1 ((uint32_t)0x00000000)
+#define FSMC_Bank1_NORSRAM2 ((uint32_t)0x00000002)
+#define FSMC_Bank1_NORSRAM3 ((uint32_t)0x00000004)
+#define FSMC_Bank1_NORSRAM4 ((uint32_t)0x00000006)
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_NAND_Bank
+ * @{
+ */
+#define FSMC_Bank2_NAND ((uint32_t)0x00000010)
+#define FSMC_Bank3_NAND ((uint32_t)0x00000100)
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_PCCARD_Bank
+ * @{
+ */
+#define FSMC_Bank4_PCCARD ((uint32_t)0x00001000)
+/**
+ * @}
+ */
+
+#define IS_FSMC_NORSRAM_BANK(BANK) (((BANK) == FSMC_Bank1_NORSRAM1) || \
+ ((BANK) == FSMC_Bank1_NORSRAM2) || \
+ ((BANK) == FSMC_Bank1_NORSRAM3) || \
+ ((BANK) == FSMC_Bank1_NORSRAM4))
+
+#define IS_FSMC_NAND_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \
+ ((BANK) == FSMC_Bank3_NAND))
+
+#define IS_FSMC_GETFLAG_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \
+ ((BANK) == FSMC_Bank3_NAND) || \
+ ((BANK) == FSMC_Bank4_PCCARD))
+
+#define IS_FSMC_IT_BANK(BANK) (((BANK) == FSMC_Bank2_NAND) || \
+ ((BANK) == FSMC_Bank3_NAND) || \
+ ((BANK) == FSMC_Bank4_PCCARD))
+
+/** @defgroup NOR_SRAM_Controller
+ * @{
+ */
+
+/** @defgroup FSMC_Data_Address_Bus_Multiplexing
+ * @{
+ */
+
+#define FSMC_DataAddressMux_Disable ((uint32_t)0x00000000)
+#define FSMC_DataAddressMux_Enable ((uint32_t)0x00000002)
+#define IS_FSMC_MUX(MUX) (((MUX) == FSMC_DataAddressMux_Disable) || \
+ ((MUX) == FSMC_DataAddressMux_Enable))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Memory_Type
+ * @{
+ */
+
+#define FSMC_MemoryType_SRAM ((uint32_t)0x00000000)
+#define FSMC_MemoryType_PSRAM ((uint32_t)0x00000004)
+#define FSMC_MemoryType_NOR ((uint32_t)0x00000008)
+#define IS_FSMC_MEMORY(MEMORY) (((MEMORY) == FSMC_MemoryType_SRAM) || \
+ ((MEMORY) == FSMC_MemoryType_PSRAM)|| \
+ ((MEMORY) == FSMC_MemoryType_NOR))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Data_Width
+ * @{
+ */
+
+#define FSMC_MemoryDataWidth_8b ((uint32_t)0x00000000)
+#define FSMC_MemoryDataWidth_16b ((uint32_t)0x00000010)
+#define IS_FSMC_MEMORY_WIDTH(WIDTH) (((WIDTH) == FSMC_MemoryDataWidth_8b) || \
+ ((WIDTH) == FSMC_MemoryDataWidth_16b))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Burst_Access_Mode
+ * @{
+ */
+
+#define FSMC_BurstAccessMode_Disable ((uint32_t)0x00000000)
+#define FSMC_BurstAccessMode_Enable ((uint32_t)0x00000100)
+#define IS_FSMC_BURSTMODE(STATE) (((STATE) == FSMC_BurstAccessMode_Disable) || \
+ ((STATE) == FSMC_BurstAccessMode_Enable))
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_AsynchronousWait
+ * @{
+ */
+#define FSMC_AsynchronousWait_Disable ((uint32_t)0x00000000)
+#define FSMC_AsynchronousWait_Enable ((uint32_t)0x00008000)
+#define IS_FSMC_ASYNWAIT(STATE) (((STATE) == FSMC_AsynchronousWait_Disable) || \
+ ((STATE) == FSMC_AsynchronousWait_Enable))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Wait_Signal_Polarity
+ * @{
+ */
+
+#define FSMC_WaitSignalPolarity_Low ((uint32_t)0x00000000)
+#define FSMC_WaitSignalPolarity_High ((uint32_t)0x00000200)
+#define IS_FSMC_WAIT_POLARITY(POLARITY) (((POLARITY) == FSMC_WaitSignalPolarity_Low) || \
+ ((POLARITY) == FSMC_WaitSignalPolarity_High))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Wrap_Mode
+ * @{
+ */
+
+#define FSMC_WrapMode_Disable ((uint32_t)0x00000000)
+#define FSMC_WrapMode_Enable ((uint32_t)0x00000400)
+#define IS_FSMC_WRAP_MODE(MODE) (((MODE) == FSMC_WrapMode_Disable) || \
+ ((MODE) == FSMC_WrapMode_Enable))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Wait_Timing
+ * @{
+ */
+
+#define FSMC_WaitSignalActive_BeforeWaitState ((uint32_t)0x00000000)
+#define FSMC_WaitSignalActive_DuringWaitState ((uint32_t)0x00000800)
+#define IS_FSMC_WAIT_SIGNAL_ACTIVE(ACTIVE) (((ACTIVE) == FSMC_WaitSignalActive_BeforeWaitState) || \
+ ((ACTIVE) == FSMC_WaitSignalActive_DuringWaitState))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Write_Operation
+ * @{
+ */
+
+#define FSMC_WriteOperation_Disable ((uint32_t)0x00000000)
+#define FSMC_WriteOperation_Enable ((uint32_t)0x00001000)
+#define IS_FSMC_WRITE_OPERATION(OPERATION) (((OPERATION) == FSMC_WriteOperation_Disable) || \
+ ((OPERATION) == FSMC_WriteOperation_Enable))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Wait_Signal
+ * @{
+ */
+
+#define FSMC_WaitSignal_Disable ((uint32_t)0x00000000)
+#define FSMC_WaitSignal_Enable ((uint32_t)0x00002000)
+#define IS_FSMC_WAITE_SIGNAL(SIGNAL) (((SIGNAL) == FSMC_WaitSignal_Disable) || \
+ ((SIGNAL) == FSMC_WaitSignal_Enable))
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Extended_Mode
+ * @{
+ */
+
+#define FSMC_ExtendedMode_Disable ((uint32_t)0x00000000)
+#define FSMC_ExtendedMode_Enable ((uint32_t)0x00004000)
+
+#define IS_FSMC_EXTENDED_MODE(MODE) (((MODE) == FSMC_ExtendedMode_Disable) || \
+ ((MODE) == FSMC_ExtendedMode_Enable))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Write_Burst
+ * @{
+ */
+
+#define FSMC_WriteBurst_Disable ((uint32_t)0x00000000)
+#define FSMC_WriteBurst_Enable ((uint32_t)0x00080000)
+#define IS_FSMC_WRITE_BURST(BURST) (((BURST) == FSMC_WriteBurst_Disable) || \
+ ((BURST) == FSMC_WriteBurst_Enable))
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Address_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_ADDRESS_SETUP_TIME(TIME) ((TIME) <= 0xF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Address_Hold_Time
+ * @{
+ */
+
+#define IS_FSMC_ADDRESS_HOLD_TIME(TIME) ((TIME) <= 0xF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Data_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_DATASETUP_TIME(TIME) (((TIME) > 0) && ((TIME) <= 0xFF))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Bus_Turn_around_Duration
+ * @{
+ */
+
+#define IS_FSMC_TURNAROUND_TIME(TIME) ((TIME) <= 0xF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_CLK_Division
+ * @{
+ */
+
+#define IS_FSMC_CLK_DIV(DIV) ((DIV) <= 0xF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Data_Latency
+ * @{
+ */
+
+#define IS_FSMC_DATA_LATENCY(LATENCY) ((LATENCY) <= 0xF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Access_Mode
+ * @{
+ */
+
+#define FSMC_AccessMode_A ((uint32_t)0x00000000)
+#define FSMC_AccessMode_B ((uint32_t)0x10000000)
+#define FSMC_AccessMode_C ((uint32_t)0x20000000)
+#define FSMC_AccessMode_D ((uint32_t)0x30000000)
+#define IS_FSMC_ACCESS_MODE(MODE) (((MODE) == FSMC_AccessMode_A) || \
+ ((MODE) == FSMC_AccessMode_B) || \
+ ((MODE) == FSMC_AccessMode_C) || \
+ ((MODE) == FSMC_AccessMode_D))
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup NAND_PCCARD_Controller
+ * @{
+ */
+
+/** @defgroup FSMC_Wait_feature
+ * @{
+ */
+
+#define FSMC_Waitfeature_Disable ((uint32_t)0x00000000)
+#define FSMC_Waitfeature_Enable ((uint32_t)0x00000002)
+#define IS_FSMC_WAIT_FEATURE(FEATURE) (((FEATURE) == FSMC_Waitfeature_Disable) || \
+ ((FEATURE) == FSMC_Waitfeature_Enable))
+
+/**
+ * @}
+ */
+
+
+/** @defgroup FSMC_ECC
+ * @{
+ */
+
+#define FSMC_ECC_Disable ((uint32_t)0x00000000)
+#define FSMC_ECC_Enable ((uint32_t)0x00000040)
+#define IS_FSMC_ECC_STATE(STATE) (((STATE) == FSMC_ECC_Disable) || \
+ ((STATE) == FSMC_ECC_Enable))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_ECC_Page_Size
+ * @{
+ */
+
+#define FSMC_ECCPageSize_256Bytes ((uint32_t)0x00000000)
+#define FSMC_ECCPageSize_512Bytes ((uint32_t)0x00020000)
+#define FSMC_ECCPageSize_1024Bytes ((uint32_t)0x00040000)
+#define FSMC_ECCPageSize_2048Bytes ((uint32_t)0x00060000)
+#define FSMC_ECCPageSize_4096Bytes ((uint32_t)0x00080000)
+#define FSMC_ECCPageSize_8192Bytes ((uint32_t)0x000A0000)
+#define IS_FSMC_ECCPAGE_SIZE(SIZE) (((SIZE) == FSMC_ECCPageSize_256Bytes) || \
+ ((SIZE) == FSMC_ECCPageSize_512Bytes) || \
+ ((SIZE) == FSMC_ECCPageSize_1024Bytes) || \
+ ((SIZE) == FSMC_ECCPageSize_2048Bytes) || \
+ ((SIZE) == FSMC_ECCPageSize_4096Bytes) || \
+ ((SIZE) == FSMC_ECCPageSize_8192Bytes))
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_TCLR_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_TCLR_TIME(TIME) ((TIME) <= 0xFF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_TAR_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_TAR_TIME(TIME) ((TIME) <= 0xFF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_SETUP_TIME(TIME) ((TIME) <= 0xFF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Wait_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_WAIT_TIME(TIME) ((TIME) <= 0xFF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Hold_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_HOLD_TIME(TIME) ((TIME) <= 0xFF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_HiZ_Setup_Time
+ * @{
+ */
+
+#define IS_FSMC_HIZ_TIME(TIME) ((TIME) <= 0xFF)
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Interrupt_sources
+ * @{
+ */
+
+#define FSMC_IT_RisingEdge ((uint32_t)0x00000008)
+#define FSMC_IT_Level ((uint32_t)0x00000010)
+#define FSMC_IT_FallingEdge ((uint32_t)0x00000020)
+#define IS_FSMC_IT(IT) ((((IT) & (uint32_t)0xFFFFFFC7) == 0x00000000) && ((IT) != 0x00000000))
+#define IS_FSMC_GET_IT(IT) (((IT) == FSMC_IT_RisingEdge) || \
+ ((IT) == FSMC_IT_Level) || \
+ ((IT) == FSMC_IT_FallingEdge))
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Flags
+ * @{
+ */
+
+#define FSMC_FLAG_RisingEdge ((uint32_t)0x00000001)
+#define FSMC_FLAG_Level ((uint32_t)0x00000002)
+#define FSMC_FLAG_FallingEdge ((uint32_t)0x00000004)
+#define FSMC_FLAG_FEMPT ((uint32_t)0x00000040)
+#define IS_FSMC_GET_FLAG(FLAG) (((FLAG) == FSMC_FLAG_RisingEdge) || \
+ ((FLAG) == FSMC_FLAG_Level) || \
+ ((FLAG) == FSMC_FLAG_FallingEdge) || \
+ ((FLAG) == FSMC_FLAG_FEMPT))
+
+#define IS_FSMC_CLEAR_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFFFFF8) == 0x00000000) && ((FLAG) != 0x00000000))
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Exported_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup FSMC_Exported_Functions
+ * @{
+ */
+
+void FSMC_NORSRAMDeInit(uint32_t FSMC_Bank);
+void FSMC_NANDDeInit(uint32_t FSMC_Bank);
+void FSMC_PCCARDDeInit(void);
+void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct);
+void FSMC_NANDInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct);
+void FSMC_PCCARDInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct);
+void FSMC_NORSRAMStructInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct);
+void FSMC_NANDStructInit(FSMC_NANDInitTypeDef* FSMC_NANDInitStruct);
+void FSMC_PCCARDStructInit(FSMC_PCCARDInitTypeDef* FSMC_PCCARDInitStruct);
+void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState);
+void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState);
+void FSMC_PCCARDCmd(FunctionalState NewState);
+void FSMC_NANDECCCmd(uint32_t FSMC_Bank, FunctionalState NewState);
+uint32_t FSMC_GetECC(uint32_t FSMC_Bank);
+void FSMC_ITConfig(uint32_t FSMC_Bank, uint32_t FSMC_IT, FunctionalState NewState);
+FlagStatus FSMC_GetFlagStatus(uint32_t FSMC_Bank, uint32_t FSMC_FLAG);
+void FSMC_ClearFlag(uint32_t FSMC_Bank, uint32_t FSMC_FLAG);
+ITStatus FSMC_GetITStatus(uint32_t FSMC_Bank, uint32_t FSMC_IT);
+void FSMC_ClearITPendingBit(uint32_t FSMC_Bank, uint32_t FSMC_IT);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32F10x_FSMC_H */
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_lib/inc/stm32f10x_gpio.h b/2.Firmware/STM32/Firmware/stm_lib/inc/stm32f10x_gpio.h
new file mode 100644
index 0000000..dd28da8
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_lib/inc/stm32f10x_gpio.h
@@ -0,0 +1,385 @@
+/**
+ ******************************************************************************
+ * @file stm32f10x_gpio.h
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 11-March-2011
+ * @brief This file contains all the functions prototypes for the GPIO
+ * firmware library.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F10x_I2C_H
+#define __STM32F10x_I2C_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x.h"
+
+/** @addtogroup STM32F10x_StdPeriph_Driver
+ * @{
+ */
+
+/** @addtogroup I2C
+ * @{
+ */
+
+/** @defgroup I2C_Exported_Types
+ * @{
+ */
+
+/**
+ * @brief I2C Init structure definition
+ */
+
+typedef struct
+{
+ uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency.
+ This parameter must be set to a value lower than 400kHz */
+
+ uint16_t I2C_Mode; /*!< Specifies the I2C mode.
+ This parameter can be a value of @ref I2C_mode */
+
+ uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle.
+ This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */
+
+ uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address.
+ This parameter can be a 7-bit or 10-bit address. */
+
+ uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement.
+ This parameter can be a value of @ref I2C_acknowledgement */
+
+ uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged.
+ This parameter can be a value of @ref I2C_acknowledged_address */
+}I2C_InitTypeDef;
+
+/**
+ * @}
+ */
+
+
+/** @defgroup I2C_Exported_Constants
+ * @{
+ */
+
+#define IS_I2C_ALL_PERIPH(PERIPH) (((PERIPH) == I2C1) || \
+ ((PERIPH) == I2C2))
+/** @defgroup I2C_mode
+ * @{
+ */
+
+#define I2C_Mode_I2C ((uint16_t)0x0000)
+#define I2C_Mode_SMBusDevice ((uint16_t)0x0002)
+#define I2C_Mode_SMBusHost ((uint16_t)0x000A)
+#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \
+ ((MODE) == I2C_Mode_SMBusDevice) || \
+ ((MODE) == I2C_Mode_SMBusHost))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_duty_cycle_in_fast_mode
+ * @{
+ */
+
+#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */
+#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */
+#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \
+ ((CYCLE) == I2C_DutyCycle_2))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_acknowledgement
+ * @{
+ */
+
+#define I2C_Ack_Enable ((uint16_t)0x0400)
+#define I2C_Ack_Disable ((uint16_t)0x0000)
+#define IS_I2C_ACK_STATE(STATE) (((STATE) == I2C_Ack_Enable) || \
+ ((STATE) == I2C_Ack_Disable))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_transfer_direction
+ * @{
+ */
+
+#define I2C_Direction_Transmitter ((uint8_t)0x00)
+#define I2C_Direction_Receiver ((uint8_t)0x01)
+#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \
+ ((DIRECTION) == I2C_Direction_Receiver))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_acknowledged_address
+ * @{
+ */
+
+#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000)
+#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000)
+#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \
+ ((ADDRESS) == I2C_AcknowledgedAddress_10bit))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_registers
+ * @{
+ */
+
+#define I2C_Register_CR1 ((uint8_t)0x00)
+#define I2C_Register_CR2 ((uint8_t)0x04)
+#define I2C_Register_OAR1 ((uint8_t)0x08)
+#define I2C_Register_OAR2 ((uint8_t)0x0C)
+#define I2C_Register_DR ((uint8_t)0x10)
+#define I2C_Register_SR1 ((uint8_t)0x14)
+#define I2C_Register_SR2 ((uint8_t)0x18)
+#define I2C_Register_CCR ((uint8_t)0x1C)
+#define I2C_Register_TRISE ((uint8_t)0x20)
+#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \
+ ((REGISTER) == I2C_Register_CR2) || \
+ ((REGISTER) == I2C_Register_OAR1) || \
+ ((REGISTER) == I2C_Register_OAR2) || \
+ ((REGISTER) == I2C_Register_DR) || \
+ ((REGISTER) == I2C_Register_SR1) || \
+ ((REGISTER) == I2C_Register_SR2) || \
+ ((REGISTER) == I2C_Register_CCR) || \
+ ((REGISTER) == I2C_Register_TRISE))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_SMBus_alert_pin_level
+ * @{
+ */
+
+#define I2C_SMBusAlert_Low ((uint16_t)0x2000)
+#define I2C_SMBusAlert_High ((uint16_t)0xDFFF)
+#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \
+ ((ALERT) == I2C_SMBusAlert_High))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_PEC_position
+ * @{
+ */
+
+#define I2C_PECPosition_Next ((uint16_t)0x0800)
+#define I2C_PECPosition_Current ((uint16_t)0xF7FF)
+#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \
+ ((POSITION) == I2C_PECPosition_Current))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_NCAK_position
+ * @{
+ */
+
+#define I2C_NACKPosition_Next ((uint16_t)0x0800)
+#define I2C_NACKPosition_Current ((uint16_t)0xF7FF)
+#define IS_I2C_NACK_POSITION(POSITION) (((POSITION) == I2C_NACKPosition_Next) || \
+ ((POSITION) == I2C_NACKPosition_Current))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_interrupts_definition
+ * @{
+ */
+
+#define I2C_IT_BUF ((uint16_t)0x0400)
+#define I2C_IT_EVT ((uint16_t)0x0200)
+#define I2C_IT_ERR ((uint16_t)0x0100)
+#define IS_I2C_CONFIG_IT(IT) ((((IT) & (uint16_t)0xF8FF) == 0x00) && ((IT) != 0x00))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_interrupts_definition
+ * @{
+ */
+
+#define I2C_IT_SMBALERT ((uint32_t)0x01008000)
+#define I2C_IT_TIMEOUT ((uint32_t)0x01004000)
+#define I2C_IT_PECERR ((uint32_t)0x01001000)
+#define I2C_IT_OVR ((uint32_t)0x01000800)
+#define I2C_IT_AF ((uint32_t)0x01000400)
+#define I2C_IT_ARLO ((uint32_t)0x01000200)
+#define I2C_IT_BERR ((uint32_t)0x01000100)
+#define I2C_IT_TXE ((uint32_t)0x06000080)
+#define I2C_IT_RXNE ((uint32_t)0x06000040)
+#define I2C_IT_STOPF ((uint32_t)0x02000010)
+#define I2C_IT_ADD10 ((uint32_t)0x02000008)
+#define I2C_IT_BTF ((uint32_t)0x02000004)
+#define I2C_IT_ADDR ((uint32_t)0x02000002)
+#define I2C_IT_SB ((uint32_t)0x02000001)
+
+#define IS_I2C_CLEAR_IT(IT) ((((IT) & (uint16_t)0x20FF) == 0x00) && ((IT) != (uint16_t)0x00))
+
+#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \
+ ((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \
+ ((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \
+ ((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \
+ ((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \
+ ((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \
+ ((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_flags_definition
+ * @{
+ */
+
+/**
+ * @brief SR2 register flags
+ */
+
+#define I2C_FLAG_DUALF ((uint32_t)0x00800000)
+#define I2C_FLAG_SMBHOST ((uint32_t)0x00400000)
+#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00200000)
+#define I2C_FLAG_GENCALL ((uint32_t)0x00100000)
+#define I2C_FLAG_TRA ((uint32_t)0x00040000)
+#define I2C_FLAG_BUSY ((uint32_t)0x00020000)
+#define I2C_FLAG_MSL ((uint32_t)0x00010000)
+
+/**
+ * @brief SR1 register flags
+ */
+
+#define I2C_FLAG_SMBALERT ((uint32_t)0x10008000)
+#define I2C_FLAG_TIMEOUT ((uint32_t)0x10004000)
+#define I2C_FLAG_PECERR ((uint32_t)0x10001000)
+#define I2C_FLAG_OVR ((uint32_t)0x10000800)
+#define I2C_FLAG_AF ((uint32_t)0x10000400)
+#define I2C_FLAG_ARLO ((uint32_t)0x10000200)
+#define I2C_FLAG_BERR ((uint32_t)0x10000100)
+#define I2C_FLAG_TXE ((uint32_t)0x10000080)
+#define I2C_FLAG_RXNE ((uint32_t)0x10000040)
+#define I2C_FLAG_STOPF ((uint32_t)0x10000010)
+#define I2C_FLAG_ADD10 ((uint32_t)0x10000008)
+#define I2C_FLAG_BTF ((uint32_t)0x10000004)
+#define I2C_FLAG_ADDR ((uint32_t)0x10000002)
+#define I2C_FLAG_SB ((uint32_t)0x10000001)
+
+#define IS_I2C_CLEAR_FLAG(FLAG) ((((FLAG) & (uint16_t)0x20FF) == 0x00) && ((FLAG) != (uint16_t)0x00))
+
+#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \
+ ((FLAG) == I2C_FLAG_SMBDEFAULT) || ((FLAG) == I2C_FLAG_GENCALL) || \
+ ((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \
+ ((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \
+ ((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \
+ ((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \
+ ((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \
+ ((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \
+ ((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \
+ ((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \
+ ((FLAG) == I2C_FLAG_SB))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Events
+ * @{
+ */
+
+/*========================================
+
+ I2C Master Events (Events grouped in order of communication)
+ ==========================================*/
+/**
+ * @brief Communication start
+ *
+ * After sending the START condition (I2C_GenerateSTART() function) the master
+ * has to wait for this event. It means that the Start condition has been correctly
+ * released on the I2C bus (the bus is free, no other devices is communicating).
+ *
+ */
+/* --EV5 */
+#define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) /* BUSY, MSL and SB flag */
+
+/**
+ * @brief Address Acknowledge
+ *
+ * After checking on EV5 (start condition correctly released on the bus), the
+ * master sends the address of the slave(s) with which it will communicate
+ * (I2C_Send7bitAddress() function, it also determines the direction of the communication:
+ * Master transmitter or Receiver). Then the master has to wait that a slave acknowledges
+ * his address. If an acknowledge is sent on the bus, one of the following events will
+ * be set:
+ *
+ * 1) In case of Master Receiver (7-bit addressing): the I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED
+ * event is set.
+ *
+ * 2) In case of Master Transmitter (7-bit addressing): the I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
+ * is set
+ *
+ * 3) In case of 10-Bit addressing mode, the master (just after generating the START
+ * and checking on EV5) has to send the header of 10-bit addressing mode (I2C_SendData()
+ * function). Then master should wait on EV9. It means that the 10-bit addressing
+ * header has been correctly sent on the bus. Then master should send the second part of
+ * the 10-bit address (LSB) using the function I2C_Send7bitAddress(). Then master
+ * should wait for event EV6.
+ *
+ */
+
+/* --EV6 */
+#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */
+#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((uint32_t)0x00030002) /* BUSY, MSL and ADDR flags */
+/* --EV9 */
+#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((uint32_t)0x00030008) /* BUSY, MSL and ADD10 flags */
+
+/**
+ * @brief Communication events
+ *
+ * If a communication is established (START condition generated and slave address
+ * acknowledged) then the master has to check on one of the following events for
+ * communication procedures:
+ *
+ * 1) Master Receiver mode: The master has to wait on the event EV7 then to read
+ * the data received from the slave (I2C_ReceiveData() function).
+ *
+ * 2) Master Transmitter mode: The master has to send data (I2C_SendData()
+ * function) then to wait on event EV8 or EV8_2.
+ * These two events are similar:
+ * - EV8 means that the data has been written in the data register and is
+ * being shifted out.
+ * - EV8_2 means that the data has been physically shifted out and output
+ * on the bus.
+ * In most cases, using EV8 is sufficient for the application.
+ * Using EV8_2 leads to a slower communication but ensure more reliable test.
+ * EV8_2 is also more suitable than EV8 for testing on the last data transmission
+ * (before Stop condition generation).
+ *
+ * @note In case the user software does not guarantee that this event EV7 is
+ * managed before the current byte end of transfer, then user may check on EV7
+ * and BTF flag at the same time (ie. (I2C_EVENT_MASTER_BYTE_RECEIVED | I2C_FLAG_BTF)).
+ * In this case the communication may be slower.
+ *
+ */
+
+/* Master RECEIVER mode -----------------------------*/
+/* --EV7 */
+#define I2C_EVENT_MASTER_BYTE_RECEIVED ((uint32_t)0x00030040) /* BUSY, MSL and RXNE flags */
+
+/* Master TRANSMITTER mode --------------------------*/
+/* --EV8 */
+#define I2C_EVENT_MASTER_BYTE_TRANSMITTING ((uint32_t)0x00070080) /* TRA, BUSY, MSL, TXE flags */
+/* --EV8_2 */
+#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((uint32_t)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags */
+
+
+/*========================================
+
+ I2C Slave Events (Events grouped in order of communication)
+ ==========================================*/
+
+/**
+ * @brief Communication start events
+ *
+ * Wait on one of these events at the start of the communication. It means that
+ * the I2C peripheral detected a Start condition on the bus (generated by master
+ * device) followed by the peripheral address. The peripheral generates an ACK
+ * condition on the bus (if the acknowledge feature is enabled through function
+ * I2C_AcknowledgeConfig()) and the events listed above are set :
+ *
+ * 1) In normal case (only one address managed by the slave), when the address
+ * sent by the master matches the own address of the peripheral (configured by
+ * I2C_OwnAddress1 field) the I2C_EVENT_SLAVE_XXX_ADDRESS_MATCHED event is set
+ * (where XXX could be TRANSMITTER or RECEIVER).
+ *
+ * 2) In case the address sent by the master matches the second address of the
+ * peripheral (configured by the function I2C_OwnAddress2Config() and enabled
+ * by the function I2C_DualAddressCmd()) the events I2C_EVENT_SLAVE_XXX_SECONDADDRESS_MATCHED
+ * (where XXX could be TRANSMITTER or RECEIVER) are set.
+ *
+ * 3) In case the address sent by the master is General Call (address 0x00) and
+ * if the General Call is enabled for the peripheral (using function I2C_GeneralCallCmd())
+ * the following event is set I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED.
+ *
+ */
+
+/* --EV1 (all the events below are variants of EV1) */
+/* 1) Case of One Single Address managed by the slave */
+#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002) /* BUSY and ADDR flags */
+#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082) /* TRA, BUSY, TXE and ADDR flags */
+
+/* 2) Case of Dual address managed by the slave */
+#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000) /* DUALF and BUSY flags */
+#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080) /* DUALF, TRA, BUSY and TXE flags */
+
+/* 3) Case of General Call enabled for the slave */
+#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000) /* GENCALL and BUSY flags */
+
+/**
+ * @brief Communication events
+ *
+ * Wait on one of these events when EV1 has already been checked and:
+ *
+ * - Slave RECEIVER mode:
+ * - EV2: When the application is expecting a data byte to be received.
+ * - EV4: When the application is expecting the end of the communication: master
+ * sends a stop condition and data transmission is stopped.
+ *
+ * - Slave Transmitter mode:
+ * - EV3: When a byte has been transmitted by the slave and the application is expecting
+ * the end of the byte transmission. The two events I2C_EVENT_SLAVE_BYTE_TRANSMITTED and
+ * I2C_EVENT_SLAVE_BYTE_TRANSMITTING are similar. The second one can optionally be
+ * used when the user software doesn't guarantee the EV3 is managed before the
+ * current byte end of transfer.
+ * - EV3_2: When the master sends a NACK in order to tell slave that data transmission
+ * shall end (before sending the STOP condition). In this case slave has to stop sending
+ * data bytes and expect a Stop condition on the bus.
+ *
+ * @note In case the user software does not guarantee that the event EV2 is
+ * managed before the current byte end of transfer, then user may check on EV2
+ * and BTF flag at the same time (ie. (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_BTF)).
+ * In this case the communication may be slower.
+ *
+ */
+
+/* Slave RECEIVER mode --------------------------*/
+/* --EV2 */
+#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040) /* BUSY and RXNE flags */
+/* --EV4 */
+#define I2C_EVENT_SLAVE_STOP_DETECTED ((uint32_t)0x00000010) /* STOPF flag */
+
+/* Slave TRANSMITTER mode -----------------------*/
+/* --EV3 */
+#define I2C_EVENT_SLAVE_BYTE_TRANSMITTED ((uint32_t)0x00060084) /* TRA, BUSY, TXE and BTF flags */
+#define I2C_EVENT_SLAVE_BYTE_TRANSMITTING ((uint32_t)0x00060080) /* TRA, BUSY and TXE flags */
+/* --EV3_2 */
+#define I2C_EVENT_SLAVE_ACK_FAILURE ((uint32_t)0x00000400) /* AF flag */
+
+/*=========================== End of Events Description ==========================================*/
+
+#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \
+ ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \
+ ((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED) || \
+ ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED) || \
+ ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \
+ ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \
+ ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \
+ ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \
+ ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \
+ ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \
+ ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \
+ ((EVENT) == I2C_EVENT_SLAVE_STOP_DETECTED) || \
+ ((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \
+ ((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \
+ ((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \
+ ((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \
+ ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \
+ ((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTING) || \
+ ((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \
+ ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE))
+/**
+ * @}
+ */
+
+/** @defgroup I2C_own_address1
+ * @{
+ */
+
+#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF)
+/**
+ * @}
+ */
+
+/** @defgroup I2C_clock_speed
+ * @{
+ */
+
+#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000))
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Exported_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Exported_Functions
+ * @{
+ */
+
+void I2C_DeInit(I2C_TypeDef* I2Cx);
+void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);
+void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);
+void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address);
+void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState);
+void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);
+uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);
+void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);
+uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register);
+void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition);
+void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert);
+void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition);
+void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState);
+uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx);
+void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
+void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle);
+
+/**
+ * @brief
+ ****************************************************************************************
+ *
+ * I2C State Monitoring Functions
+ *
+ ****************************************************************************************
+ * This I2C driver provides three different ways for I2C state monitoring
+ * depending on the application requirements and constraints:
+ *
+ *
+ * 1) Basic state monitoring:
+ * Using I2C_CheckEvent() function:
+ * It compares the status registers (SR1 and SR2) content to a given event
+ * (can be the combination of one or more flags).
+ * It returns SUCCESS if the current status includes the given flags
+ * and returns ERROR if one or more flags are missing in the current status.
+ * - When to use:
+ * - This function is suitable for most applications as well as for startup
+ * activity since the events are fully described in the product reference manual
+ * (RM0008).
+ * - It is also suitable for users who need to define their own events.
+ * - Limitations:
+ * - If an error occurs (ie. error flags are set besides to the monitored flags),
+ * the I2C_CheckEvent() function may return SUCCESS despite the communication
+ * hold or corrupted real state.
+ * In this case, it is advised to use error interrupts to monitor the error
+ * events and handle them in the interrupt IRQ handler.
+ *
+ * @note
+ * For error management, it is advised to use the following functions:
+ * - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR).
+ * - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs.
+ * Where x is the peripheral instance (I2C1, I2C2 ...)
+ * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into I2Cx_ER_IRQHandler()
+ * in order to determine which error occurred.
+ * - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd()
+ * and/or I2C_GenerateStop() in order to clear the error flag and source,
+ * and return to correct communication status.
+ *
+ *
+ * 2) Advanced state monitoring:
+ * Using the function I2C_GetLastEvent() which returns the image of both status
+ * registers in a single word (uint32_t) (Status Register 2 value is shifted left
+ * by 16 bits and concatenated to Status Register 1).
+ * - When to use:
+ * - This function is suitable for the same applications above but it allows to
+ * overcome the limitations of I2C_GetFlagStatus() function (see below).
+ * The returned value could be compared to events already defined in the
+ * library (stm32f10x_i2c.h) or to custom values defined by user.
+ * - This function is suitable when multiple flags are monitored at the same time.
+ * - At the opposite of I2C_CheckEvent() function, this function allows user to
+ * choose when an event is accepted (when all events flags are set and no
+ * other flags are set or just when the needed flags are set like
+ * I2C_CheckEvent() function).
+ * - Limitations:
+ * - User may need to define his own events.
+ * - Same remark concerning the error management is applicable for this
+ * function if user decides to check only regular communication flags (and
+ * ignores error flags).
+ *
+ *
+ * 3) Flag-based state monitoring:
+ * Using the function I2C_GetFlagStatus() which simply returns the status of
+ * one single flag (ie. I2C_FLAG_RXNE ...).
+ * - When to use:
+ * - This function could be used for specific applications or in debug phase.
+ * - It is suitable when only one flag checking is needed (most I2C events
+ * are monitored through multiple flags).
+ * - Limitations:
+ * - When calling this function, the Status register is accessed. Some flags are
+ * cleared when the status register is accessed. So checking the status
+ * of one Flag, may clear other ones.
+ * - Function may need to be called twice or more in order to monitor one
+ * single event.
+ *
+ */
+
+/**
+ *
+ * 1) Basic state monitoring
+ *******************************************************************************
+ */
+ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);
+/**
+ *
+ * 2) Advanced state monitoring
+ *******************************************************************************
+ */
+uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx);
+/**
+ *
+ * 3) Flag-based state monitoring
+ *******************************************************************************
+ */
+FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);
+/**
+ *
+ *******************************************************************************
+ */
+
+void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG);
+ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT);
+void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__STM32F10x_I2C_H */
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_lib/inc/stm32f10x_iwdg.h b/2.Firmware/STM32/Firmware/stm_lib/inc/stm32f10x_iwdg.h
new file mode 100644
index 0000000..25b0bb5
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_lib/inc/stm32f10x_iwdg.h
@@ -0,0 +1,140 @@
+/**
+ ******************************************************************************
+ * @file stm32f10x_iwdg.h
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 11-March-2011
+ * @brief This file contains all the functions prototypes for the IWDG
+ * firmware library.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_flash.h"
+
+/** @addtogroup STM32F10x_StdPeriph_Driver
+ * @{
+ */
+
+/** @defgroup FLASH
+ * @brief FLASH driver modules
+ * @{
+ */
+
+/** @defgroup FLASH_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup FLASH_Private_Defines
+ * @{
+ */
+
+/* Flash Access Control Register bits */
+#define ACR_LATENCY_Mask ((uint32_t)0x00000038)
+#define ACR_HLFCYA_Mask ((uint32_t)0xFFFFFFF7)
+#define ACR_PRFTBE_Mask ((uint32_t)0xFFFFFFEF)
+
+/* Flash Access Control Register bits */
+#define ACR_PRFTBS_Mask ((uint32_t)0x00000020)
+
+/* Flash Control Register bits */
+#define CR_PG_Set ((uint32_t)0x00000001)
+#define CR_PG_Reset ((uint32_t)0x00001FFE)
+#define CR_PER_Set ((uint32_t)0x00000002)
+#define CR_PER_Reset ((uint32_t)0x00001FFD)
+#define CR_MER_Set ((uint32_t)0x00000004)
+#define CR_MER_Reset ((uint32_t)0x00001FFB)
+#define CR_OPTPG_Set ((uint32_t)0x00000010)
+#define CR_OPTPG_Reset ((uint32_t)0x00001FEF)
+#define CR_OPTER_Set ((uint32_t)0x00000020)
+#define CR_OPTER_Reset ((uint32_t)0x00001FDF)
+#define CR_STRT_Set ((uint32_t)0x00000040)
+#define CR_LOCK_Set ((uint32_t)0x00000080)
+
+/* FLASH Mask */
+#define RDPRT_Mask ((uint32_t)0x00000002)
+#define WRP0_Mask ((uint32_t)0x000000FF)
+#define WRP1_Mask ((uint32_t)0x0000FF00)
+#define WRP2_Mask ((uint32_t)0x00FF0000)
+#define WRP3_Mask ((uint32_t)0xFF000000)
+#define OB_USER_BFB2 ((uint16_t)0x0008)
+
+/* FLASH Keys */
+#define RDP_Key ((uint16_t)0x00A5)
+#define FLASH_KEY1 ((uint32_t)0x45670123)
+#define FLASH_KEY2 ((uint32_t)0xCDEF89AB)
+
+/* FLASH BANK address */
+#define FLASH_BANK1_END_ADDRESS ((uint32_t)0x807FFFF)
+
+/* Delay definition */
+#define EraseTimeout ((uint32_t)0x000B0000)
+#define ProgramTimeout ((uint32_t)0x00002000)
+/**
+ * @}
+ */
+
+/** @defgroup FLASH_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup FLASH_Private_Variables
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup FLASH_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup FLASH_Private_Functions
+ * @{
+ */
+
+/**
+@code
+
+ This driver provides functions to configure and program the Flash memory of all STM32F10x devices,
+ including the latest STM32F10x_XL density devices.
+
+ STM32F10x_XL devices feature up to 1 Mbyte with dual bank architecture for read-while-write (RWW) capability:
+ - bank1: fixed size of 512 Kbytes (256 pages of 2Kbytes each)
+ - bank2: up to 512 Kbytes (up to 256 pages of 2Kbytes each)
+ While other STM32F10x devices features only one bank with memory up to 512 Kbytes.
+
+ In version V3.3.0, some functions were updated and new ones were added to support
+ STM32F10x_XL devices. Thus some functions manages all devices, while other are
+ dedicated for XL devices only.
+
+ The table below presents the list of available functions depending on the used STM32F10x devices.
+
+ ***************************************************
+ * Legacy functions used for all STM32F10x devices *
+ ***************************************************
+ +----------------------------------------------------------------------------------------------------------------------------------+
+ | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
+ | | devices | devices | |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_SetLatency | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_HalfCycleAccessCmd | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_PrefetchBufferCmd | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_Unlock | Yes | Yes | - For STM32F10X_XL devices: unlock Bank1 and Bank2. |
+ | | | | - For other devices: unlock Bank1 and it is equivalent |
+ | | | | to FLASH_UnlockBank1 function. |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_Lock | Yes | Yes | - For STM32F10X_XL devices: lock Bank1 and Bank2. |
+ | | | | - For other devices: lock Bank1 and it is equivalent |
+ | | | | to FLASH_LockBank1 function. |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_ErasePage | Yes | Yes | - For STM32F10x_XL devices: erase a page in Bank1 and Bank2 |
+ | | | | - For other devices: erase a page in Bank1 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_EraseAllPages | Yes | Yes | - For STM32F10x_XL devices: erase all pages in Bank1 and Bank2 |
+ | | | | - For other devices: erase all pages in Bank1 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_EraseOptionBytes | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_ProgramWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_ProgramHalfWord | Yes | Yes | Updated to program up to 1MByte (depending on the used device) |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_ProgramOptionByteData | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_EnableWriteProtection | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_ReadOutProtection | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_UserOptionByteConfig | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_GetUserOptionByte | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_GetWriteProtectionOptionByte | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_GetReadOutProtectionStatus | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_GetPrefetchBufferStatus | Yes | Yes | No change |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_ITConfig | Yes | Yes | - For STM32F10x_XL devices: enable Bank1 and Bank2's interrupts|
+ | | | | - For other devices: enable Bank1's interrupts |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_GetFlagStatus | Yes | Yes | - For STM32F10x_XL devices: return Bank1 and Bank2's flag status|
+ | | | | - For other devices: return Bank1's flag status |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_ClearFlag | Yes | Yes | - For STM32F10x_XL devices: clear Bank1 and Bank2's flag |
+ | | | | - For other devices: clear Bank1's flag |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_GetStatus | Yes | Yes | - Return the status of Bank1 (for all devices) |
+ | | | | equivalent to FLASH_GetBank1Status function |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_WaitForLastOperation | Yes | Yes | - Wait for Bank1 last operation (for all devices) |
+ | | | | equivalent to: FLASH_WaitForLastBank1Operation function |
+ +----------------------------------------------------------------------------------------------------------------------------------+
+
+ ************************************************************************************************************************
+ * New functions used for all STM32F10x devices to manage Bank1: *
+ * - These functions are mainly useful for STM32F10x_XL density devices, to have separate control for Bank1 and bank2 *
+ * - For other devices, these functions are optional (covered by functions listed above) *
+ ************************************************************************************************************************
+ +----------------------------------------------------------------------------------------------------------------------------------+
+ | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
+ | | devices | devices | |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_UnlockBank1 | Yes | Yes | - Unlock Bank1 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_LockBank1 | Yes | Yes | - Lock Bank1 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_EraseAllBank1Pages | Yes | Yes | - Erase all pages in Bank1 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_GetBank1Status | Yes | Yes | - Return the status of Bank1 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_WaitForLastBank1Operation | Yes | Yes | - Wait for Bank1 last operation |
+ +----------------------------------------------------------------------------------------------------------------------------------+
+
+ *****************************************************************************
+ * New Functions used only with STM32F10x_XL density devices to manage Bank2 *
+ *****************************************************************************
+ +----------------------------------------------------------------------------------------------------------------------------------+
+ | Functions prototypes |STM32F10x_XL|Other STM32F10x| Comments |
+ | | devices | devices | |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_UnlockBank2 | Yes | No | - Unlock Bank2 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ |FLASH_LockBank2 | Yes | No | - Lock Bank2 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_EraseAllBank2Pages | Yes | No | - Erase all pages in Bank2 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_GetBank2Status | Yes | No | - Return the status of Bank2 |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_WaitForLastBank2Operation | Yes | No | - Wait for Bank2 last operation |
+ |----------------------------------------------------------------------------------------------------------------------------------|
+ | FLASH_BootConfig | Yes | No | - Configure to boot from Bank1 or Bank2 |
+ +----------------------------------------------------------------------------------------------------------------------------------+
+@endcode
+*/
+
+
+/**
+ * @brief Sets the code latency value.
+ * @note This function can be used for all STM32F10x devices.
+ * @param FLASH_Latency: specifies the FLASH Latency value.
+ * This parameter can be one of the following values:
+ * @arg FLASH_Latency_0: FLASH Zero Latency cycle
+ * @arg FLASH_Latency_1: FLASH One Latency cycle
+ * @arg FLASH_Latency_2: FLASH Two Latency cycles
+ * @retval None
+ */
+void FLASH_SetLatency(uint32_t FLASH_Latency)
+{
+ uint32_t tmpreg = 0;
+
+ /* Check the parameters */
+ assert_param(IS_FLASH_LATENCY(FLASH_Latency));
+
+ /* Read the ACR register */
+ tmpreg = FLASH->ACR;
+
+ /* Sets the Latency value */
+ tmpreg &= ACR_LATENCY_Mask;
+ tmpreg |= FLASH_Latency;
+
+ /* Write the ACR register */
+ FLASH->ACR = tmpreg;
+}
+
+/**
+ * @brief Enables or disables the Half cycle flash access.
+ * @note This function can be used for all STM32F10x devices.
+ * @param FLASH_HalfCycleAccess: specifies the FLASH Half cycle Access mode.
+ * This parameter can be one of the following values:
+ * @arg FLASH_HalfCycleAccess_Enable: FLASH Half Cycle Enable
+ * @arg FLASH_HalfCycleAccess_Disable: FLASH Half Cycle Disable
+ * @retval None
+ */
+void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess)
+{
+ /* Check the parameters */
+ assert_param(IS_FLASH_HALFCYCLEACCESS_STATE(FLASH_HalfCycleAccess));
+
+ /* Enable or disable the Half cycle access */
+ FLASH->ACR &= ACR_HLFCYA_Mask;
+ FLASH->ACR |= FLASH_HalfCycleAccess;
+}
+
+/**
+ * @brief Enables or disables the Prefetch Buffer.
+ * @note This function can be used for all STM32F10x devices.
+ * @param FLASH_PrefetchBuffer: specifies the Prefetch buffer status.
+ * This parameter can be one of the following values:
+ * @arg FLASH_PrefetchBuffer_Enable: FLASH Prefetch Buffer Enable
+ * @arg FLASH_PrefetchBuffer_Disable: FLASH Prefetch Buffer Disable
+ * @retval None
+ */
+void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer)
+{
+ /* Check the parameters */
+ assert_param(IS_FLASH_PREFETCHBUFFER_STATE(FLASH_PrefetchBuffer));
+
+ /* Enable or disable the Prefetch Buffer */
+ FLASH->ACR &= ACR_PRFTBE_Mask;
+ FLASH->ACR |= FLASH_PrefetchBuffer;
+}
+
+/**
+ * @brief Unlocks the FLASH Program Erase Controller.
+ * @note This function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices this function unlocks Bank1 and Bank2.
+ * - For all other devices it unlocks Bank1 and it is equivalent
+ * to FLASH_UnlockBank1 function..
+ * @param None
+ * @retval None
+ */
+void FLASH_Unlock(void)
+{
+ /* Authorize the FPEC of Bank1 Access */
+ FLASH->KEYR = FLASH_KEY1;
+ FLASH->KEYR = FLASH_KEY2;
+
+#ifdef STM32F10X_XL
+ /* Authorize the FPEC of Bank2 Access */
+ FLASH->KEYR2 = FLASH_KEY1;
+ FLASH->KEYR2 = FLASH_KEY2;
+#endif /* STM32F10X_XL */
+}
+/**
+ * @brief Unlocks the FLASH Bank1 Program Erase Controller.
+ * @note This function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices this function unlocks Bank1.
+ * - For all other devices it unlocks Bank1 and it is
+ * equivalent to FLASH_Unlock function.
+ * @param None
+ * @retval None
+ */
+void FLASH_UnlockBank1(void)
+{
+ /* Authorize the FPEC of Bank1 Access */
+ FLASH->KEYR = FLASH_KEY1;
+ FLASH->KEYR = FLASH_KEY2;
+}
+
+#ifdef STM32F10X_XL
+/**
+ * @brief Unlocks the FLASH Bank2 Program Erase Controller.
+ * @note This function can be used only for STM32F10X_XL density devices.
+ * @param None
+ * @retval None
+ */
+void FLASH_UnlockBank2(void)
+{
+ /* Authorize the FPEC of Bank2 Access */
+ FLASH->KEYR2 = FLASH_KEY1;
+ FLASH->KEYR2 = FLASH_KEY2;
+
+}
+#endif /* STM32F10X_XL */
+
+/**
+ * @brief Locks the FLASH Program Erase Controller.
+ * @note This function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices this function Locks Bank1 and Bank2.
+ * - For all other devices it Locks Bank1 and it is equivalent
+ * to FLASH_LockBank1 function.
+ * @param None
+ * @retval None
+ */
+void FLASH_Lock(void)
+{
+ /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */
+ FLASH->CR |= CR_LOCK_Set;
+
+#ifdef STM32F10X_XL
+ /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */
+ FLASH->CR2 |= CR_LOCK_Set;
+#endif /* STM32F10X_XL */
+}
+
+/**
+ * @brief Locks the FLASH Bank1 Program Erase Controller.
+ * @note this function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices this function Locks Bank1.
+ * - For all other devices it Locks Bank1 and it is equivalent
+ * to FLASH_Lock function.
+ * @param None
+ * @retval None
+ */
+void FLASH_LockBank1(void)
+{
+ /* Set the Lock Bit to lock the FPEC and the CR of Bank1 */
+ FLASH->CR |= CR_LOCK_Set;
+}
+
+#ifdef STM32F10X_XL
+/**
+ * @brief Locks the FLASH Bank2 Program Erase Controller.
+ * @note This function can be used only for STM32F10X_XL density devices.
+ * @param None
+ * @retval None
+ */
+void FLASH_LockBank2(void)
+{
+ /* Set the Lock Bit to lock the FPEC and the CR of Bank2 */
+ FLASH->CR2 |= CR_LOCK_Set;
+}
+#endif /* STM32F10X_XL */
+
+/**
+ * @brief Erases a specified FLASH page.
+ * @note This function can be used for all STM32F10x devices.
+ * @param Page_Address: The page address to be erased.
+ * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ /* Check the parameters */
+ assert_param(IS_FLASH_ADDRESS(Page_Address));
+
+#ifdef STM32F10X_XL
+ if(Page_Address < FLASH_BANK1_END_ADDRESS)
+ {
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(EraseTimeout);
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase the page */
+ FLASH->CR|= CR_PER_Set;
+ FLASH->AR = Page_Address;
+ FLASH->CR|= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(EraseTimeout);
+
+ /* Disable the PER Bit */
+ FLASH->CR &= CR_PER_Reset;
+ }
+ }
+ else
+ {
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(EraseTimeout);
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase the page */
+ FLASH->CR2|= CR_PER_Set;
+ FLASH->AR2 = Page_Address;
+ FLASH->CR2|= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(EraseTimeout);
+
+ /* Disable the PER Bit */
+ FLASH->CR2 &= CR_PER_Reset;
+ }
+ }
+#else
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase the page */
+ FLASH->CR|= CR_PER_Set;
+ FLASH->AR = Page_Address;
+ FLASH->CR|= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+
+ /* Disable the PER Bit */
+ FLASH->CR &= CR_PER_Reset;
+ }
+#endif /* STM32F10X_XL */
+
+ /* Return the Erase Status */
+ return status;
+}
+
+/**
+ * @brief Erases all FLASH pages.
+ * @note This function can be used for all STM32F10x devices.
+ * @param None
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_EraseAllPages(void)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+
+#ifdef STM32F10X_XL
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(EraseTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase all pages */
+ FLASH->CR |= CR_MER_Set;
+ FLASH->CR |= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(EraseTimeout);
+
+ /* Disable the MER Bit */
+ FLASH->CR &= CR_MER_Reset;
+ }
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase all pages */
+ FLASH->CR2 |= CR_MER_Set;
+ FLASH->CR2 |= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(EraseTimeout);
+
+ /* Disable the MER Bit */
+ FLASH->CR2 &= CR_MER_Reset;
+ }
+#else
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase all pages */
+ FLASH->CR |= CR_MER_Set;
+ FLASH->CR |= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+
+ /* Disable the MER Bit */
+ FLASH->CR &= CR_MER_Reset;
+ }
+#endif /* STM32F10X_XL */
+
+ /* Return the Erase Status */
+ return status;
+}
+
+/**
+ * @brief Erases all Bank1 FLASH pages.
+ * @note This function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices this function erases all Bank1 pages.
+ * - For all other devices it erases all Bank1 pages and it is equivalent
+ * to FLASH_EraseAllPages function.
+ * @param None
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_EraseAllBank1Pages(void)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(EraseTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase all pages */
+ FLASH->CR |= CR_MER_Set;
+ FLASH->CR |= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(EraseTimeout);
+
+ /* Disable the MER Bit */
+ FLASH->CR &= CR_MER_Reset;
+ }
+ /* Return the Erase Status */
+ return status;
+}
+
+#ifdef STM32F10X_XL
+/**
+ * @brief Erases all Bank2 FLASH pages.
+ * @note This function can be used only for STM32F10x_XL density devices.
+ * @param None
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_EraseAllBank2Pages(void)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(EraseTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to erase all pages */
+ FLASH->CR2 |= CR_MER_Set;
+ FLASH->CR2 |= CR_STRT_Set;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(EraseTimeout);
+
+ /* Disable the MER Bit */
+ FLASH->CR2 &= CR_MER_Reset;
+ }
+ /* Return the Erase Status */
+ return status;
+}
+#endif /* STM32F10X_XL */
+
+/**
+ * @brief Erases the FLASH option bytes.
+ * @note This functions erases all option bytes except the Read protection (RDP).
+ * @note This function can be used for all STM32F10x devices.
+ * @param None
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_EraseOptionBytes(void)
+{
+ uint16_t rdptmp = RDP_Key;
+
+ FLASH_Status status = FLASH_COMPLETE;
+
+ /* Get the actual read protection Option Byte value */
+ if(FLASH_GetReadOutProtectionStatus() != RESET)
+ {
+ rdptmp = 0x00;
+ }
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+ if(status == FLASH_COMPLETE)
+ {
+ /* Authorize the small information block programming */
+ FLASH->OPTKEYR = FLASH_KEY1;
+ FLASH->OPTKEYR = FLASH_KEY2;
+
+ /* if the previous operation is completed, proceed to erase the option bytes */
+ FLASH->CR |= CR_OPTER_Set;
+ FLASH->CR |= CR_STRT_Set;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the erase operation is completed, disable the OPTER Bit */
+ FLASH->CR &= CR_OPTER_Reset;
+
+ /* Enable the Option Bytes Programming operation */
+ FLASH->CR |= CR_OPTPG_Set;
+ /* Restore the last read protection Option Byte value */
+ OB->RDP = (uint16_t)rdptmp;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status != FLASH_TIMEOUT)
+ {
+ /* if the program operation is completed, disable the OPTPG Bit */
+ FLASH->CR &= CR_OPTPG_Reset;
+ }
+ }
+ else
+ {
+ if (status != FLASH_TIMEOUT)
+ {
+ /* Disable the OPTPG Bit */
+ FLASH->CR &= CR_OPTPG_Reset;
+ }
+ }
+ }
+ /* Return the erase status */
+ return status;
+}
+
+/**
+ * @brief Programs a word at a specified address.
+ * @note This function can be used for all STM32F10x devices.
+ * @param Address: specifies the address to be programmed.
+ * @param Data: specifies the data to be programmed.
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ __IO uint32_t tmp = 0;
+
+ /* Check the parameters */
+ assert_param(IS_FLASH_ADDRESS(Address));
+
+#ifdef STM32F10X_XL
+ if(Address < FLASH_BANK1_END_ADDRESS - 2)
+ {
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new first
+ half word */
+ FLASH->CR |= CR_PG_Set;
+
+ *(__IO uint16_t*)Address = (uint16_t)Data;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new second
+ half word */
+ tmp = Address + 2;
+
+ *(__IO uint16_t*) tmp = Data >> 16;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+ else
+ {
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+ }
+ }
+ else if(Address == (FLASH_BANK1_END_ADDRESS - 1))
+ {
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new first
+ half word */
+ FLASH->CR |= CR_PG_Set;
+
+ *(__IO uint16_t*)Address = (uint16_t)Data;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+ else
+ {
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new second
+ half word */
+ FLASH->CR2 |= CR_PG_Set;
+ tmp = Address + 2;
+
+ *(__IO uint16_t*) tmp = Data >> 16;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR2 &= CR_PG_Reset;
+ }
+ else
+ {
+ /* Disable the PG Bit */
+ FLASH->CR2 &= CR_PG_Reset;
+ }
+ }
+ else
+ {
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new first
+ half word */
+ FLASH->CR2 |= CR_PG_Set;
+
+ *(__IO uint16_t*)Address = (uint16_t)Data;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new second
+ half word */
+ tmp = Address + 2;
+
+ *(__IO uint16_t*) tmp = Data >> 16;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR2 &= CR_PG_Reset;
+ }
+ else
+ {
+ /* Disable the PG Bit */
+ FLASH->CR2 &= CR_PG_Reset;
+ }
+ }
+ }
+#else
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new first
+ half word */
+ FLASH->CR |= CR_PG_Set;
+
+ *(__IO uint16_t*)Address = (uint16_t)Data;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new second
+ half word */
+ tmp = Address + 2;
+
+ *(__IO uint16_t*) tmp = Data >> 16;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+ else
+ {
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+ }
+#endif /* STM32F10X_XL */
+
+ /* Return the Program Status */
+ return status;
+}
+
+/**
+ * @brief Programs a half word at a specified address.
+ * @note This function can be used for all STM32F10x devices.
+ * @param Address: specifies the address to be programmed.
+ * @param Data: specifies the data to be programmed.
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ /* Check the parameters */
+ assert_param(IS_FLASH_ADDRESS(Address));
+
+#ifdef STM32F10X_XL
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(Address < FLASH_BANK1_END_ADDRESS)
+ {
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new data */
+ FLASH->CR |= CR_PG_Set;
+
+ *(__IO uint16_t*)Address = Data;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank1Operation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+ }
+ else
+ {
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new data */
+ FLASH->CR2 |= CR_PG_Set;
+
+ *(__IO uint16_t*)Address = Data;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastBank2Operation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR2 &= CR_PG_Reset;
+ }
+ }
+#else
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the previous operation is completed, proceed to program the new data */
+ FLASH->CR |= CR_PG_Set;
+
+ *(__IO uint16_t*)Address = Data;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ /* Disable the PG Bit */
+ FLASH->CR &= CR_PG_Reset;
+ }
+#endif /* STM32F10X_XL */
+
+ /* Return the Program Status */
+ return status;
+}
+
+/**
+ * @brief Programs a half word at a specified Option Byte Data address.
+ * @note This function can be used for all STM32F10x devices.
+ * @param Address: specifies the address to be programmed.
+ * This parameter can be 0x1FFFF804 or 0x1FFFF806.
+ * @param Data: specifies the data to be programmed.
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ /* Check the parameters */
+ assert_param(IS_OB_DATA_ADDRESS(Address));
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* Authorize the small information block programming */
+ FLASH->OPTKEYR = FLASH_KEY1;
+ FLASH->OPTKEYR = FLASH_KEY2;
+ /* Enables the Option Bytes Programming operation */
+ FLASH->CR |= CR_OPTPG_Set;
+ *(__IO uint16_t*)Address = Data;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+ if(status != FLASH_TIMEOUT)
+ {
+ /* if the program operation is completed, disable the OPTPG Bit */
+ FLASH->CR &= CR_OPTPG_Reset;
+ }
+ }
+ /* Return the Option Byte Data Program Status */
+ return status;
+}
+
+/**
+ * @brief Write protects the desired pages
+ * @note This function can be used for all STM32F10x devices.
+ * @param FLASH_Pages: specifies the address of the pages to be write protected.
+ * This parameter can be:
+ * @arg For @b STM32_Low-density_devices: value between FLASH_WRProt_Pages0to3 and FLASH_WRProt_Pages28to31
+ * @arg For @b STM32_Medium-density_devices: value between FLASH_WRProt_Pages0to3
+ * and FLASH_WRProt_Pages124to127
+ * @arg For @b STM32_High-density_devices: value between FLASH_WRProt_Pages0to1 and
+ * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to255
+ * @arg For @b STM32_Connectivity_line_devices: value between FLASH_WRProt_Pages0to1 and
+ * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to127
+ * @arg For @b STM32_XL-density_devices: value between FLASH_WRProt_Pages0to1 and
+ * FLASH_WRProt_Pages60to61 or FLASH_WRProt_Pages62to511
+ * @arg FLASH_WRProt_AllPages
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
+{
+ uint16_t WRP0_Data = 0xFFFF, WRP1_Data = 0xFFFF, WRP2_Data = 0xFFFF, WRP3_Data = 0xFFFF;
+
+ FLASH_Status status = FLASH_COMPLETE;
+
+ /* Check the parameters */
+ assert_param(IS_FLASH_WRPROT_PAGE(FLASH_Pages));
+
+ FLASH_Pages = (uint32_t)(~FLASH_Pages);
+ WRP0_Data = (uint16_t)(FLASH_Pages & WRP0_Mask);
+ WRP1_Data = (uint16_t)((FLASH_Pages & WRP1_Mask) >> 8);
+ WRP2_Data = (uint16_t)((FLASH_Pages & WRP2_Mask) >> 16);
+ WRP3_Data = (uint16_t)((FLASH_Pages & WRP3_Mask) >> 24);
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* Authorizes the small information block programming */
+ FLASH->OPTKEYR = FLASH_KEY1;
+ FLASH->OPTKEYR = FLASH_KEY2;
+ FLASH->CR |= CR_OPTPG_Set;
+ if(WRP0_Data != 0xFF)
+ {
+ OB->WRP0 = WRP0_Data;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+ }
+ if((status == FLASH_COMPLETE) && (WRP1_Data != 0xFF))
+ {
+ OB->WRP1 = WRP1_Data;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+ }
+ if((status == FLASH_COMPLETE) && (WRP2_Data != 0xFF))
+ {
+ OB->WRP2 = WRP2_Data;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+ }
+
+ if((status == FLASH_COMPLETE)&& (WRP3_Data != 0xFF))
+ {
+ OB->WRP3 = WRP3_Data;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+ }
+
+ if(status != FLASH_TIMEOUT)
+ {
+ /* if the program operation is completed, disable the OPTPG Bit */
+ FLASH->CR &= CR_OPTPG_Reset;
+ }
+ }
+ /* Return the write protection operation Status */
+ return status;
+}
+
+/**
+ * @brief Enables or disables the read out protection.
+ * @note If the user has already programmed the other option bytes before calling
+ * this function, he must re-program them since this function erases all option bytes.
+ * @note This function can be used for all STM32F10x devices.
+ * @param Newstate: new state of the ReadOut Protection.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ /* Check the parameters */
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+ if(status == FLASH_COMPLETE)
+ {
+ /* Authorizes the small information block programming */
+ FLASH->OPTKEYR = FLASH_KEY1;
+ FLASH->OPTKEYR = FLASH_KEY2;
+ FLASH->CR |= CR_OPTER_Set;
+ FLASH->CR |= CR_STRT_Set;
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+ if(status == FLASH_COMPLETE)
+ {
+ /* if the erase operation is completed, disable the OPTER Bit */
+ FLASH->CR &= CR_OPTER_Reset;
+ /* Enable the Option Bytes Programming operation */
+ FLASH->CR |= CR_OPTPG_Set;
+ if(NewState != DISABLE)
+ {
+ OB->RDP = 0x00;
+ }
+ else
+ {
+ OB->RDP = RDP_Key;
+ }
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(EraseTimeout);
+
+ if(status != FLASH_TIMEOUT)
+ {
+ /* if the program operation is completed, disable the OPTPG Bit */
+ FLASH->CR &= CR_OPTPG_Reset;
+ }
+ }
+ else
+ {
+ if(status != FLASH_TIMEOUT)
+ {
+ /* Disable the OPTER Bit */
+ FLASH->CR &= CR_OPTER_Reset;
+ }
+ }
+ }
+ /* Return the protection operation Status */
+ return status;
+}
+
+/**
+ * @brief Programs the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY.
+ * @note This function can be used for all STM32F10x devices.
+ * @param OB_IWDG: Selects the IWDG mode
+ * This parameter can be one of the following values:
+ * @arg OB_IWDG_SW: Software IWDG selected
+ * @arg OB_IWDG_HW: Hardware IWDG selected
+ * @param OB_STOP: Reset event when entering STOP mode.
+ * This parameter can be one of the following values:
+ * @arg OB_STOP_NoRST: No reset generated when entering in STOP
+ * @arg OB_STOP_RST: Reset generated when entering in STOP
+ * @param OB_STDBY: Reset event when entering Standby mode.
+ * This parameter can be one of the following values:
+ * @arg OB_STDBY_NoRST: No reset generated when entering in STANDBY
+ * @arg OB_STDBY_RST: Reset generated when entering in STANDBY
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+
+ /* Check the parameters */
+ assert_param(IS_OB_IWDG_SOURCE(OB_IWDG));
+ assert_param(IS_OB_STOP_SOURCE(OB_STOP));
+ assert_param(IS_OB_STDBY_SOURCE(OB_STDBY));
+
+ /* Authorize the small information block programming */
+ FLASH->OPTKEYR = FLASH_KEY1;
+ FLASH->OPTKEYR = FLASH_KEY2;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* Enable the Option Bytes Programming operation */
+ FLASH->CR |= CR_OPTPG_Set;
+
+ OB->USER = OB_IWDG | (uint16_t)(OB_STOP | (uint16_t)(OB_STDBY | ((uint16_t)0xF8)));
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+ if(status != FLASH_TIMEOUT)
+ {
+ /* if the program operation is completed, disable the OPTPG Bit */
+ FLASH->CR &= CR_OPTPG_Reset;
+ }
+ }
+ /* Return the Option Byte program Status */
+ return status;
+}
+
+#ifdef STM32F10X_XL
+/**
+ * @brief Configures to boot from Bank1 or Bank2.
+ * @note This function can be used only for STM32F10x_XL density devices.
+ * @param FLASH_BOOT: select the FLASH Bank to boot from.
+ * This parameter can be one of the following values:
+ * @arg FLASH_BOOT_Bank1: At startup, if boot pins are set in boot from user Flash
+ * position and this parameter is selected the device will boot from Bank1(Default).
+ * @arg FLASH_BOOT_Bank2: At startup, if boot pins are set in boot from user Flash
+ * position and this parameter is selected the device will boot from Bank2 or Bank1,
+ * depending on the activation of the bank. The active banks are checked in
+ * the following order: Bank2, followed by Bank1.
+ * The active bank is recognized by the value programmed at the base address
+ * of the respective bank (corresponding to the initial stack pointer value
+ * in the interrupt vector table).
+ * For more information, please refer to AN2606 from www.st.com.
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_BootConfig(uint16_t FLASH_BOOT)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+ assert_param(IS_FLASH_BOOT(FLASH_BOOT));
+ /* Authorize the small information block programming */
+ FLASH->OPTKEYR = FLASH_KEY1;
+ FLASH->OPTKEYR = FLASH_KEY2;
+
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+
+ if(status == FLASH_COMPLETE)
+ {
+ /* Enable the Option Bytes Programming operation */
+ FLASH->CR |= CR_OPTPG_Set;
+
+ if(FLASH_BOOT == FLASH_BOOT_Bank1)
+ {
+ OB->USER |= OB_USER_BFB2;
+ }
+ else
+ {
+ OB->USER &= (uint16_t)(~(uint16_t)(OB_USER_BFB2));
+ }
+ /* Wait for last operation to be completed */
+ status = FLASH_WaitForLastOperation(ProgramTimeout);
+ if(status != FLASH_TIMEOUT)
+ {
+ /* if the program operation is completed, disable the OPTPG Bit */
+ FLASH->CR &= CR_OPTPG_Reset;
+ }
+ }
+ /* Return the Option Byte program Status */
+ return status;
+}
+#endif /* STM32F10X_XL */
+
+/**
+ * @brief Returns the FLASH User Option Bytes values.
+ * @note This function can be used for all STM32F10x devices.
+ * @param None
+ * @retval The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1)
+ * and RST_STDBY(Bit2).
+ */
+uint32_t FLASH_GetUserOptionByte(void)
+{
+ /* Return the User Option Byte */
+ return (uint32_t)(FLASH->OBR >> 2);
+}
+
+/**
+ * @brief Returns the FLASH Write Protection Option Bytes Register value.
+ * @note This function can be used for all STM32F10x devices.
+ * @param None
+ * @retval The FLASH Write Protection Option Bytes Register value
+ */
+uint32_t FLASH_GetWriteProtectionOptionByte(void)
+{
+ /* Return the Flash write protection Register value */
+ return (uint32_t)(FLASH->WRPR);
+}
+
+/**
+ * @brief Checks whether the FLASH Read Out Protection Status is set or not.
+ * @note This function can be used for all STM32F10x devices.
+ * @param None
+ * @retval FLASH ReadOut Protection Status(SET or RESET)
+ */
+FlagStatus FLASH_GetReadOutProtectionStatus(void)
+{
+ FlagStatus readoutstatus = RESET;
+ if ((FLASH->OBR & RDPRT_Mask) != (uint32_t)RESET)
+ {
+ readoutstatus = SET;
+ }
+ else
+ {
+ readoutstatus = RESET;
+ }
+ return readoutstatus;
+}
+
+/**
+ * @brief Checks whether the FLASH Prefetch Buffer status is set or not.
+ * @note This function can be used for all STM32F10x devices.
+ * @param None
+ * @retval FLASH Prefetch Buffer Status (SET or RESET).
+ */
+FlagStatus FLASH_GetPrefetchBufferStatus(void)
+{
+ FlagStatus bitstatus = RESET;
+
+ if ((FLASH->ACR & ACR_PRFTBS_Mask) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ /* Return the new state of FLASH Prefetch Buffer Status (SET or RESET) */
+ return bitstatus;
+}
+
+/**
+ * @brief Enables or disables the specified FLASH interrupts.
+ * @note This function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices, enables or disables the specified FLASH interrupts
+ for Bank1 and Bank2.
+ * - For other devices it enables or disables the specified FLASH interrupts for Bank1.
+ * @param FLASH_IT: specifies the FLASH interrupt sources to be enabled or disabled.
+ * This parameter can be any combination of the following values:
+ * @arg FLASH_IT_ERROR: FLASH Error Interrupt
+ * @arg FLASH_IT_EOP: FLASH end of operation Interrupt
+ * @param NewState: new state of the specified Flash interrupts.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState)
+{
+#ifdef STM32F10X_XL
+ /* Check the parameters */
+ assert_param(IS_FLASH_IT(FLASH_IT));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if((FLASH_IT & 0x80000000) != 0x0)
+ {
+ if(NewState != DISABLE)
+ {
+ /* Enable the interrupt sources */
+ FLASH->CR2 |= (FLASH_IT & 0x7FFFFFFF);
+ }
+ else
+ {
+ /* Disable the interrupt sources */
+ FLASH->CR2 &= ~(uint32_t)(FLASH_IT & 0x7FFFFFFF);
+ }
+ }
+ else
+ {
+ if(NewState != DISABLE)
+ {
+ /* Enable the interrupt sources */
+ FLASH->CR |= FLASH_IT;
+ }
+ else
+ {
+ /* Disable the interrupt sources */
+ FLASH->CR &= ~(uint32_t)FLASH_IT;
+ }
+ }
+#else
+ /* Check the parameters */
+ assert_param(IS_FLASH_IT(FLASH_IT));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if(NewState != DISABLE)
+ {
+ /* Enable the interrupt sources */
+ FLASH->CR |= FLASH_IT;
+ }
+ else
+ {
+ /* Disable the interrupt sources */
+ FLASH->CR &= ~(uint32_t)FLASH_IT;
+ }
+#endif /* STM32F10X_XL */
+}
+
+/**
+ * @brief Checks whether the specified FLASH flag is set or not.
+ * @note This function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices, this function checks whether the specified
+ * Bank1 or Bank2 flag is set or not.
+ * - For other devices, it checks whether the specified Bank1 flag is
+ * set or not.
+ * @param FLASH_FLAG: specifies the FLASH flag to check.
+ * This parameter can be one of the following values:
+ * @arg FLASH_FLAG_BSY: FLASH Busy flag
+ * @arg FLASH_FLAG_PGERR: FLASH Program error flag
+ * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag
+ * @arg FLASH_FLAG_EOP: FLASH End of Operation flag
+ * @arg FLASH_FLAG_OPTERR: FLASH Option Byte error flag
+ * @retval The new state of FLASH_FLAG (SET or RESET).
+ */
+FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG)
+{
+ FlagStatus bitstatus = RESET;
+
+#ifdef STM32F10X_XL
+ /* Check the parameters */
+ assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ;
+ if(FLASH_FLAG == FLASH_FLAG_OPTERR)
+ {
+ if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ }
+ else
+ {
+ if((FLASH_FLAG & 0x80000000) != 0x0)
+ {
+ if((FLASH->SR2 & FLASH_FLAG) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ }
+ else
+ {
+ if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ }
+ }
+#else
+ /* Check the parameters */
+ assert_param(IS_FLASH_GET_FLAG(FLASH_FLAG)) ;
+ if(FLASH_FLAG == FLASH_FLAG_OPTERR)
+ {
+ if((FLASH->OBR & FLASH_FLAG_OPTERR) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ }
+ else
+ {
+ if((FLASH->SR & FLASH_FLAG) != (uint32_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ }
+#endif /* STM32F10X_XL */
+
+ /* Return the new state of FLASH_FLAG (SET or RESET) */
+ return bitstatus;
+}
+
+/**
+ * @brief Clears the FLASH's pending flags.
+ * @note This function can be used for all STM32F10x devices.
+ * - For STM32F10X_XL devices, this function clears Bank1 or Bank2抯 pending flags
+ * - For other devices, it clears Bank1抯 pending flags.
+ * @param FLASH_FLAG: specifies the FLASH flags to clear.
+ * This parameter can be any combination of the following values:
+ * @arg FLASH_FLAG_PGERR: FLASH Program error flag
+ * @arg FLASH_FLAG_WRPRTERR: FLASH Write protected error flag
+ * @arg FLASH_FLAG_EOP: FLASH End of Operation flag
+ * @retval None
+ */
+void FLASH_ClearFlag(uint32_t FLASH_FLAG)
+{
+#ifdef STM32F10X_XL
+ /* Check the parameters */
+ assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ;
+
+ if((FLASH_FLAG & 0x80000000) != 0x0)
+ {
+ /* Clear the flags */
+ FLASH->SR2 = FLASH_FLAG;
+ }
+ else
+ {
+ /* Clear the flags */
+ FLASH->SR = FLASH_FLAG;
+ }
+
+#else
+ /* Check the parameters */
+ assert_param(IS_FLASH_CLEAR_FLAG(FLASH_FLAG)) ;
+
+ /* Clear the flags */
+ FLASH->SR = FLASH_FLAG;
+#endif /* STM32F10X_XL */
+}
+
+/**
+ * @brief Returns the FLASH Status.
+ * @note This function can be used for all STM32F10x devices, it is equivalent
+ * to FLASH_GetBank1Status function.
+ * @param None
+ * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP or FLASH_COMPLETE
+ */
+FLASH_Status FLASH_GetStatus(void)
+{
+ FLASH_Status flashstatus = FLASH_COMPLETE;
+
+ if((FLASH->SR & FLASH_FLAG_BSY) == FLASH_FLAG_BSY)
+ {
+ flashstatus = FLASH_BUSY;
+ }
+ else
+ {
+ if((FLASH->SR & FLASH_FLAG_PGERR) != 0)
+ {
+ flashstatus = FLASH_ERROR_PG;
+ }
+ else
+ {
+ if((FLASH->SR & FLASH_FLAG_WRPRTERR) != 0 )
+ {
+ flashstatus = FLASH_ERROR_WRP;
+ }
+ else
+ {
+ flashstatus = FLASH_COMPLETE;
+ }
+ }
+ }
+ /* Return the Flash Status */
+ return flashstatus;
+}
+
+/**
+ * @brief Returns the FLASH Bank1 Status.
+ * @note This function can be used for all STM32F10x devices, it is equivalent
+ * to FLASH_GetStatus function.
+ * @param None
+ * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP or FLASH_COMPLETE
+ */
+FLASH_Status FLASH_GetBank1Status(void)
+{
+ FLASH_Status flashstatus = FLASH_COMPLETE;
+
+ if((FLASH->SR & FLASH_FLAG_BANK1_BSY) == FLASH_FLAG_BSY)
+ {
+ flashstatus = FLASH_BUSY;
+ }
+ else
+ {
+ if((FLASH->SR & FLASH_FLAG_BANK1_PGERR) != 0)
+ {
+ flashstatus = FLASH_ERROR_PG;
+ }
+ else
+ {
+ if((FLASH->SR & FLASH_FLAG_BANK1_WRPRTERR) != 0 )
+ {
+ flashstatus = FLASH_ERROR_WRP;
+ }
+ else
+ {
+ flashstatus = FLASH_COMPLETE;
+ }
+ }
+ }
+ /* Return the Flash Status */
+ return flashstatus;
+}
+
+#ifdef STM32F10X_XL
+/**
+ * @brief Returns the FLASH Bank2 Status.
+ * @note This function can be used for STM32F10x_XL density devices.
+ * @param None
+ * @retval FLASH Status: The returned value can be: FLASH_BUSY, FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP or FLASH_COMPLETE
+ */
+FLASH_Status FLASH_GetBank2Status(void)
+{
+ FLASH_Status flashstatus = FLASH_COMPLETE;
+
+ if((FLASH->SR2 & (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF))
+ {
+ flashstatus = FLASH_BUSY;
+ }
+ else
+ {
+ if((FLASH->SR2 & (FLASH_FLAG_BANK2_PGERR & 0x7FFFFFFF)) != 0)
+ {
+ flashstatus = FLASH_ERROR_PG;
+ }
+ else
+ {
+ if((FLASH->SR2 & (FLASH_FLAG_BANK2_WRPRTERR & 0x7FFFFFFF)) != 0 )
+ {
+ flashstatus = FLASH_ERROR_WRP;
+ }
+ else
+ {
+ flashstatus = FLASH_COMPLETE;
+ }
+ }
+ }
+ /* Return the Flash Status */
+ return flashstatus;
+}
+#endif /* STM32F10X_XL */
+/**
+ * @brief Waits for a Flash operation to complete or a TIMEOUT to occur.
+ * @note This function can be used for all STM32F10x devices,
+ * it is equivalent to FLASH_WaitForLastBank1Operation.
+ * - For STM32F10X_XL devices this function waits for a Bank1 Flash operation
+ * to complete or a TIMEOUT to occur.
+ * - For all other devices it waits for a Flash operation to complete
+ * or a TIMEOUT to occur.
+ * @param Timeout: FLASH programming Timeout
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+
+ /* Check for the Flash Status */
+ status = FLASH_GetBank1Status();
+ /* Wait for a Flash operation to complete or a TIMEOUT to occur */
+ while((status == FLASH_BUSY) && (Timeout != 0x00))
+ {
+ status = FLASH_GetBank1Status();
+ Timeout--;
+ }
+ if(Timeout == 0x00 )
+ {
+ status = FLASH_TIMEOUT;
+ }
+ /* Return the operation status */
+ return status;
+}
+
+/**
+ * @brief Waits for a Flash operation on Bank1 to complete or a TIMEOUT to occur.
+ * @note This function can be used for all STM32F10x devices,
+ * it is equivalent to FLASH_WaitForLastOperation.
+ * @param Timeout: FLASH programming Timeout
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+
+ /* Check for the Flash Status */
+ status = FLASH_GetBank1Status();
+ /* Wait for a Flash operation to complete or a TIMEOUT to occur */
+ while((status == FLASH_FLAG_BANK1_BSY) && (Timeout != 0x00))
+ {
+ status = FLASH_GetBank1Status();
+ Timeout--;
+ }
+ if(Timeout == 0x00 )
+ {
+ status = FLASH_TIMEOUT;
+ }
+ /* Return the operation status */
+ return status;
+}
+
+#ifdef STM32F10X_XL
+/**
+ * @brief Waits for a Flash operation on Bank2 to complete or a TIMEOUT to occur.
+ * @note This function can be used only for STM32F10x_XL density devices.
+ * @param Timeout: FLASH programming Timeout
+ * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG,
+ * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.
+ */
+FLASH_Status FLASH_WaitForLastBank2Operation(uint32_t Timeout)
+{
+ FLASH_Status status = FLASH_COMPLETE;
+
+ /* Check for the Flash Status */
+ status = FLASH_GetBank2Status();
+ /* Wait for a Flash operation to complete or a TIMEOUT to occur */
+ while((status == (FLASH_FLAG_BANK2_BSY & 0x7FFFFFFF)) && (Timeout != 0x00))
+ {
+ status = FLASH_GetBank2Status();
+ Timeout--;
+ }
+ if(Timeout == 0x00 )
+ {
+ status = FLASH_TIMEOUT;
+ }
+ /* Return the operation status */
+ return status;
+}
+#endif /* STM32F10X_XL */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_fsmc.c b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_fsmc.c
new file mode 100644
index 0000000..51669ee
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_fsmc.c
@@ -0,0 +1,866 @@
+/**
+ ******************************************************************************
+ * @file stm32f10x_fsmc.c
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 11-March-2011
+ * @brief This file provides all the FSMC firmware functions.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_i2c.h"
+#include "stm32f10x_rcc.h"
+
+
+/** @addtogroup STM32F10x_StdPeriph_Driver
+ * @{
+ */
+
+/** @defgroup I2C
+ * @brief I2C driver modules
+ * @{
+ */
+
+/** @defgroup I2C_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Private_Defines
+ * @{
+ */
+
+/* I2C SPE mask */
+#define CR1_PE_Set ((uint16_t)0x0001)
+#define CR1_PE_Reset ((uint16_t)0xFFFE)
+
+/* I2C START mask */
+#define CR1_START_Set ((uint16_t)0x0100)
+#define CR1_START_Reset ((uint16_t)0xFEFF)
+
+/* I2C STOP mask */
+#define CR1_STOP_Set ((uint16_t)0x0200)
+#define CR1_STOP_Reset ((uint16_t)0xFDFF)
+
+/* I2C ACK mask */
+#define CR1_ACK_Set ((uint16_t)0x0400)
+#define CR1_ACK_Reset ((uint16_t)0xFBFF)
+
+/* I2C ENGC mask */
+#define CR1_ENGC_Set ((uint16_t)0x0040)
+#define CR1_ENGC_Reset ((uint16_t)0xFFBF)
+
+/* I2C SWRST mask */
+#define CR1_SWRST_Set ((uint16_t)0x8000)
+#define CR1_SWRST_Reset ((uint16_t)0x7FFF)
+
+/* I2C PEC mask */
+#define CR1_PEC_Set ((uint16_t)0x1000)
+#define CR1_PEC_Reset ((uint16_t)0xEFFF)
+
+/* I2C ENPEC mask */
+#define CR1_ENPEC_Set ((uint16_t)0x0020)
+#define CR1_ENPEC_Reset ((uint16_t)0xFFDF)
+
+/* I2C ENARP mask */
+#define CR1_ENARP_Set ((uint16_t)0x0010)
+#define CR1_ENARP_Reset ((uint16_t)0xFFEF)
+
+/* I2C NOSTRETCH mask */
+#define CR1_NOSTRETCH_Set ((uint16_t)0x0080)
+#define CR1_NOSTRETCH_Reset ((uint16_t)0xFF7F)
+
+/* I2C registers Masks */
+#define CR1_CLEAR_Mask ((uint16_t)0xFBF5)
+
+/* I2C DMAEN mask */
+#define CR2_DMAEN_Set ((uint16_t)0x0800)
+#define CR2_DMAEN_Reset ((uint16_t)0xF7FF)
+
+/* I2C LAST mask */
+#define CR2_LAST_Set ((uint16_t)0x1000)
+#define CR2_LAST_Reset ((uint16_t)0xEFFF)
+
+/* I2C FREQ mask */
+#define CR2_FREQ_Reset ((uint16_t)0xFFC0)
+
+/* I2C ADD0 mask */
+#define OAR1_ADD0_Set ((uint16_t)0x0001)
+#define OAR1_ADD0_Reset ((uint16_t)0xFFFE)
+
+/* I2C ENDUAL mask */
+#define OAR2_ENDUAL_Set ((uint16_t)0x0001)
+#define OAR2_ENDUAL_Reset ((uint16_t)0xFFFE)
+
+/* I2C ADD2 mask */
+#define OAR2_ADD2_Reset ((uint16_t)0xFF01)
+
+/* I2C F/S mask */
+#define CCR_FS_Set ((uint16_t)0x8000)
+
+/* I2C CCR mask */
+#define CCR_CCR_Set ((uint16_t)0x0FFF)
+
+/* I2C FLAG mask */
+#define FLAG_Mask ((uint32_t)0x00FFFFFF)
+
+/* I2C Interrupt Enable mask */
+#define ITEN_Mask ((uint32_t)0x07000000)
+
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Private_Variables
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup I2C_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Deinitializes the I2Cx peripheral registers to their default reset values.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @retval None
+ */
+void I2C_DeInit(I2C_TypeDef* I2Cx)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+
+ if (I2Cx == I2C1)
+ {
+ /* Enable I2C1 reset state */
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
+ /* Release I2C1 from reset state */
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
+ }
+ else
+ {
+ /* Enable I2C2 reset state */
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
+ /* Release I2C2 from reset state */
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
+ }
+}
+
+/**
+ * @brief Initializes the I2Cx peripheral according to the specified
+ * parameters in the I2C_InitStruct.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_InitStruct: pointer to a I2C_InitTypeDef structure that
+ * contains the configuration information for the specified I2C peripheral.
+ * @retval None
+ */
+void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct)
+{
+ uint16_t tmpreg = 0, freqrange = 0;
+ uint16_t result = 0x04;
+ uint32_t pclk1 = 8000000;
+ RCC_ClocksTypeDef rcc_clocks;
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_CLOCK_SPEED(I2C_InitStruct->I2C_ClockSpeed));
+ assert_param(IS_I2C_MODE(I2C_InitStruct->I2C_Mode));
+ assert_param(IS_I2C_DUTY_CYCLE(I2C_InitStruct->I2C_DutyCycle));
+ assert_param(IS_I2C_OWN_ADDRESS1(I2C_InitStruct->I2C_OwnAddress1));
+ assert_param(IS_I2C_ACK_STATE(I2C_InitStruct->I2C_Ack));
+ assert_param(IS_I2C_ACKNOWLEDGE_ADDRESS(I2C_InitStruct->I2C_AcknowledgedAddress));
+
+/*---------------------------- I2Cx CR2 Configuration ------------------------*/
+ /* Get the I2Cx CR2 value */
+ tmpreg = I2Cx->CR2;
+ /* Clear frequency FREQ[5:0] bits */
+ tmpreg &= CR2_FREQ_Reset;
+ /* Get pclk1 frequency value */
+ RCC_GetClocksFreq(&rcc_clocks);
+ pclk1 = rcc_clocks.PCLK1_Frequency;
+ /* Set frequency bits depending on pclk1 value */
+ freqrange = (uint16_t)(pclk1 / 1000000);
+ tmpreg |= freqrange;
+ /* Write to I2Cx CR2 */
+ I2Cx->CR2 = tmpreg;
+
+/*---------------------------- I2Cx CCR Configuration ------------------------*/
+ /* Disable the selected I2C peripheral to configure TRISE */
+ I2Cx->CR1 &= CR1_PE_Reset;
+ /* Reset tmpreg value */
+ /* Clear F/S, DUTY and CCR[11:0] bits */
+ tmpreg = 0;
+
+ /* Configure speed in standard mode */
+ if (I2C_InitStruct->I2C_ClockSpeed <= 100000)
+ {
+ /* Standard mode speed calculate */
+ result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed << 1));
+ /* Test if CCR value is under 0x4*/
+ if (result < 0x04)
+ {
+ /* Set minimum allowed value */
+ result = 0x04;
+ }
+ /* Set speed value for standard mode */
+ tmpreg |= result;
+ /* Set Maximum Rise Time for standard mode */
+ I2Cx->TRISE = freqrange + 1;
+ }
+ /* Configure speed in fast mode */
+ else /*(I2C_InitStruct->I2C_ClockSpeed <= 400000)*/
+ {
+ if (I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_2)
+ {
+ /* Fast mode speed calculate: Tlow/Thigh = 2 */
+ result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 3));
+ }
+ else /*I2C_InitStruct->I2C_DutyCycle == I2C_DutyCycle_16_9*/
+ {
+ /* Fast mode speed calculate: Tlow/Thigh = 16/9 */
+ result = (uint16_t)(pclk1 / (I2C_InitStruct->I2C_ClockSpeed * 25));
+ /* Set DUTY bit */
+ result |= I2C_DutyCycle_16_9;
+ }
+
+ /* Test if CCR value is under 0x1*/
+ if ((result & CCR_CCR_Set) == 0)
+ {
+ /* Set minimum allowed value */
+ result |= (uint16_t)0x0001;
+ }
+ /* Set speed value and set F/S bit for fast mode */
+ tmpreg |= (uint16_t)(result | CCR_FS_Set);
+ /* Set Maximum Rise Time for fast mode */
+ I2Cx->TRISE = (uint16_t)(((freqrange * (uint16_t)300) / (uint16_t)1000) + (uint16_t)1);
+ }
+
+ /* Write to I2Cx CCR */
+ I2Cx->CCR = tmpreg;
+ /* Enable the selected I2C peripheral */
+ I2Cx->CR1 |= CR1_PE_Set;
+
+/*---------------------------- I2Cx CR1 Configuration ------------------------*/
+ /* Get the I2Cx CR1 value */
+ tmpreg = I2Cx->CR1;
+ /* Clear ACK, SMBTYPE and SMBUS bits */
+ tmpreg &= CR1_CLEAR_Mask;
+ /* Configure I2Cx: mode and acknowledgement */
+ /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */
+ /* Set ACK bit according to I2C_Ack value */
+ tmpreg |= (uint16_t)((uint32_t)I2C_InitStruct->I2C_Mode | I2C_InitStruct->I2C_Ack);
+ /* Write to I2Cx CR1 */
+ I2Cx->CR1 = tmpreg;
+
+/*---------------------------- I2Cx OAR1 Configuration -----------------------*/
+ /* Set I2Cx Own Address1 and acknowledged address */
+ I2Cx->OAR1 = (I2C_InitStruct->I2C_AcknowledgedAddress | I2C_InitStruct->I2C_OwnAddress1);
+}
+
+/**
+ * @brief Fills each I2C_InitStruct member with its default value.
+ * @param I2C_InitStruct: pointer to an I2C_InitTypeDef structure which will be initialized.
+ * @retval None
+ */
+void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct)
+{
+/*---------------- Reset I2C init structure parameters values ----------------*/
+ /* initialize the I2C_ClockSpeed member */
+ I2C_InitStruct->I2C_ClockSpeed = 5000;
+ /* Initialize the I2C_Mode member */
+ I2C_InitStruct->I2C_Mode = I2C_Mode_I2C;
+ /* Initialize the I2C_DutyCycle member */
+ I2C_InitStruct->I2C_DutyCycle = I2C_DutyCycle_2;
+ /* Initialize the I2C_OwnAddress1 member */
+ I2C_InitStruct->I2C_OwnAddress1 = 0;
+ /* Initialize the I2C_Ack member */
+ I2C_InitStruct->I2C_Ack = I2C_Ack_Disable;
+ /* Initialize the I2C_AcknowledgedAddress member */
+ I2C_InitStruct->I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
+}
+
+/**
+ * @brief Enables or disables the specified I2C peripheral.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2Cx peripheral.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the selected I2C peripheral */
+ I2Cx->CR1 |= CR1_PE_Set;
+ }
+ else
+ {
+ /* Disable the selected I2C peripheral */
+ I2Cx->CR1 &= CR1_PE_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the specified I2C DMA requests.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C DMA transfer.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the selected I2C DMA requests */
+ I2Cx->CR2 |= CR2_DMAEN_Set;
+ }
+ else
+ {
+ /* Disable the selected I2C DMA requests */
+ I2Cx->CR2 &= CR2_DMAEN_Reset;
+ }
+}
+
+/**
+ * @brief Specifies if the next DMA transfer will be the last one.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C DMA last transfer.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Next DMA transfer is the last transfer */
+ I2Cx->CR2 |= CR2_LAST_Set;
+ }
+ else
+ {
+ /* Next DMA transfer is not the last transfer */
+ I2Cx->CR2 &= CR2_LAST_Reset;
+ }
+}
+
+/**
+ * @brief Generates I2Cx communication START condition.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C START condition generation.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None.
+ */
+void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Generate a START condition */
+ I2Cx->CR1 |= CR1_START_Set;
+ }
+ else
+ {
+ /* Disable the START condition generation */
+ I2Cx->CR1 &= CR1_START_Reset;
+ }
+}
+
+/**
+ * @brief Generates I2Cx communication STOP condition.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C STOP condition generation.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None.
+ */
+void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Generate a STOP condition */
+ I2Cx->CR1 |= CR1_STOP_Set;
+ }
+ else
+ {
+ /* Disable the STOP condition generation */
+ I2Cx->CR1 &= CR1_STOP_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the specified I2C acknowledge feature.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C Acknowledgement.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None.
+ */
+void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the acknowledgement */
+ I2Cx->CR1 |= CR1_ACK_Set;
+ }
+ else
+ {
+ /* Disable the acknowledgement */
+ I2Cx->CR1 &= CR1_ACK_Reset;
+ }
+}
+
+/**
+ * @brief Configures the specified I2C own address2.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param Address: specifies the 7bit I2C own address2.
+ * @retval None.
+ */
+void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address)
+{
+ uint16_t tmpreg = 0;
+
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+
+ /* Get the old register value */
+ tmpreg = I2Cx->OAR2;
+
+ /* Reset I2Cx Own address2 bit [7:1] */
+ tmpreg &= OAR2_ADD2_Reset;
+
+ /* Set I2Cx Own address2 */
+ tmpreg |= (uint16_t)((uint16_t)Address & (uint16_t)0x00FE);
+
+ /* Store the new register value */
+ I2Cx->OAR2 = tmpreg;
+}
+
+/**
+ * @brief Enables or disables the specified I2C dual addressing mode.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C dual addressing mode.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable dual addressing mode */
+ I2Cx->OAR2 |= OAR2_ENDUAL_Set;
+ }
+ else
+ {
+ /* Disable dual addressing mode */
+ I2Cx->OAR2 &= OAR2_ENDUAL_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the specified I2C general call feature.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C General call.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable generall call */
+ I2Cx->CR1 |= CR1_ENGC_Set;
+ }
+ else
+ {
+ /* Disable generall call */
+ I2Cx->CR1 &= CR1_ENGC_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the specified I2C interrupts.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_IT: specifies the I2C interrupts sources to be enabled or disabled.
+ * This parameter can be any combination of the following values:
+ * @arg I2C_IT_BUF: Buffer interrupt mask
+ * @arg I2C_IT_EVT: Event interrupt mask
+ * @arg I2C_IT_ERR: Error interrupt mask
+ * @param NewState: new state of the specified I2C interrupts.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ assert_param(IS_I2C_CONFIG_IT(I2C_IT));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the selected I2C interrupts */
+ I2Cx->CR2 |= I2C_IT;
+ }
+ else
+ {
+ /* Disable the selected I2C interrupts */
+ I2Cx->CR2 &= (uint16_t)~I2C_IT;
+ }
+}
+
+/**
+ * @brief Sends a data byte through the I2Cx peripheral.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param Data: Byte to be transmitted..
+ * @retval None
+ */
+void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ /* Write in the DR register the data to be sent */
+ I2Cx->DR = Data;
+}
+
+/**
+ * @brief Returns the most recent received data by the I2Cx peripheral.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @retval The value of the received data.
+ */
+uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ /* Return the data in the DR register */
+ return (uint8_t)I2Cx->DR;
+}
+
+/**
+ * @brief Transmits the address byte to select the slave device.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param Address: specifies the slave address which will be transmitted
+ * @param I2C_Direction: specifies whether the I2C device will be a
+ * Transmitter or a Receiver. This parameter can be one of the following values
+ * @arg I2C_Direction_Transmitter: Transmitter mode
+ * @arg I2C_Direction_Receiver: Receiver mode
+ * @retval None.
+ */
+void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_DIRECTION(I2C_Direction));
+ /* Test on the direction to set/reset the read/write bit */
+ if (I2C_Direction != I2C_Direction_Transmitter)
+ {
+ /* Set the address bit0 for read */
+ Address |= OAR1_ADD0_Set;
+ }
+ else
+ {
+ /* Reset the address bit0 for write */
+ Address &= OAR1_ADD0_Reset;
+ }
+ /* Send the address */
+ I2Cx->DR = Address;
+}
+
+/**
+ * @brief Reads the specified I2C register and returns its value.
+ * @param I2C_Register: specifies the register to read.
+ * This parameter can be one of the following values:
+ * @arg I2C_Register_CR1: CR1 register.
+ * @arg I2C_Register_CR2: CR2 register.
+ * @arg I2C_Register_OAR1: OAR1 register.
+ * @arg I2C_Register_OAR2: OAR2 register.
+ * @arg I2C_Register_DR: DR register.
+ * @arg I2C_Register_SR1: SR1 register.
+ * @arg I2C_Register_SR2: SR2 register.
+ * @arg I2C_Register_CCR: CCR register.
+ * @arg I2C_Register_TRISE: TRISE register.
+ * @retval The value of the read register.
+ */
+uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register)
+{
+ __IO uint32_t tmp = 0;
+
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_REGISTER(I2C_Register));
+
+ tmp = (uint32_t) I2Cx;
+ tmp += I2C_Register;
+
+ /* Return the selected register value */
+ return (*(__IO uint16_t *) tmp);
+}
+
+/**
+ * @brief Enables or disables the specified I2C software reset.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C software reset.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Peripheral under reset */
+ I2Cx->CR1 |= CR1_SWRST_Set;
+ }
+ else
+ {
+ /* Peripheral not under reset */
+ I2Cx->CR1 &= CR1_SWRST_Reset;
+ }
+}
+
+/**
+ * @brief Selects the specified I2C NACK position in master receiver mode.
+ * This function is useful in I2C Master Receiver mode when the number
+ * of data to be received is equal to 2. In this case, this function
+ * should be called (with parameter I2C_NACKPosition_Next) before data
+ * reception starts,as described in the 2-byte reception procedure
+ * recommended in Reference Manual in Section: Master receiver.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_NACKPosition: specifies the NACK position.
+ * This parameter can be one of the following values:
+ * @arg I2C_NACKPosition_Next: indicates that the next byte will be the last
+ * received byte.
+ * @arg I2C_NACKPosition_Current: indicates that current byte is the last
+ * received byte.
+ *
+ * @note This function configures the same bit (POS) as I2C_PECPositionConfig()
+ * but is intended to be used in I2C mode while I2C_PECPositionConfig()
+ * is intended to used in SMBUS mode.
+ *
+ * @retval None
+ */
+void I2C_NACKPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_NACKPosition)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_NACK_POSITION(I2C_NACKPosition));
+
+ /* Check the input parameter */
+ if (I2C_NACKPosition == I2C_NACKPosition_Next)
+ {
+ /* Next byte in shift register is the last received byte */
+ I2Cx->CR1 |= I2C_NACKPosition_Next;
+ }
+ else
+ {
+ /* Current byte in shift register is the last received byte */
+ I2Cx->CR1 &= I2C_NACKPosition_Current;
+ }
+}
+
+/**
+ * @brief Drives the SMBusAlert pin high or low for the specified I2C.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_SMBusAlert: specifies SMBAlert pin level.
+ * This parameter can be one of the following values:
+ * @arg I2C_SMBusAlert_Low: SMBAlert pin driven low
+ * @arg I2C_SMBusAlert_High: SMBAlert pin driven high
+ * @retval None
+ */
+void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, uint16_t I2C_SMBusAlert)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert));
+ if (I2C_SMBusAlert == I2C_SMBusAlert_Low)
+ {
+ /* Drive the SMBusAlert pin Low */
+ I2Cx->CR1 |= I2C_SMBusAlert_Low;
+ }
+ else
+ {
+ /* Drive the SMBusAlert pin High */
+ I2Cx->CR1 &= I2C_SMBusAlert_High;
+ }
+}
+
+/**
+ * @brief Enables or disables the specified I2C PEC transfer.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2C PEC transmission.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the selected I2C PEC transmission */
+ I2Cx->CR1 |= CR1_PEC_Set;
+ }
+ else
+ {
+ /* Disable the selected I2C PEC transmission */
+ I2Cx->CR1 &= CR1_PEC_Reset;
+ }
+}
+
+/**
+ * @brief Selects the specified I2C PEC position.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_PECPosition: specifies the PEC position.
+ * This parameter can be one of the following values:
+ * @arg I2C_PECPosition_Next: indicates that the next byte is PEC
+ * @arg I2C_PECPosition_Current: indicates that current byte is PEC
+ *
+ * @note This function configures the same bit (POS) as I2C_NACKPositionConfig()
+ * but is intended to be used in SMBUS mode while I2C_NACKPositionConfig()
+ * is intended to used in I2C mode.
+ *
+ * @retval None
+ */
+void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, uint16_t I2C_PECPosition)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition));
+ if (I2C_PECPosition == I2C_PECPosition_Next)
+ {
+ /* Next byte in shift register is PEC */
+ I2Cx->CR1 |= I2C_PECPosition_Next;
+ }
+ else
+ {
+ /* Current byte in shift register is PEC */
+ I2Cx->CR1 &= I2C_PECPosition_Current;
+ }
+}
+
+/**
+ * @brief Enables or disables the PEC value calculation of the transferred bytes.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2Cx PEC value calculation.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the selected I2C PEC calculation */
+ I2Cx->CR1 |= CR1_ENPEC_Set;
+ }
+ else
+ {
+ /* Disable the selected I2C PEC calculation */
+ I2Cx->CR1 &= CR1_ENPEC_Reset;
+ }
+}
+
+/**
+ * @brief Returns the PEC value for the specified I2C.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @retval The PEC value.
+ */
+uint8_t I2C_GetPEC(I2C_TypeDef* I2Cx)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ /* Return the selected I2C PEC value */
+ return ((I2Cx->SR2) >> 8);
+}
+
+/**
+ * @brief Enables or disables the specified I2C ARP.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2Cx ARP.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the selected I2C ARP */
+ I2Cx->CR1 |= CR1_ENARP_Set;
+ }
+ else
+ {
+ /* Disable the selected I2C ARP */
+ I2Cx->CR1 &= CR1_ENARP_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the specified I2C Clock stretching.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param NewState: new state of the I2Cx Clock stretching.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState == DISABLE)
+ {
+ /* Enable the selected I2C Clock stretching */
+ I2Cx->CR1 |= CR1_NOSTRETCH_Set;
+ }
+ else
+ {
+ /* Disable the selected I2C Clock stretching */
+ I2Cx->CR1 &= CR1_NOSTRETCH_Reset;
+ }
+}
+
+/**
+ * @brief Selects the specified I2C fast mode duty cycle.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_DutyCycle: specifies the fast mode duty cycle.
+ * This parameter can be one of the following values:
+ * @arg I2C_DutyCycle_2: I2C fast mode Tlow/Thigh = 2
+ * @arg I2C_DutyCycle_16_9: I2C fast mode Tlow/Thigh = 16/9
+ * @retval None
+ */
+void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, uint16_t I2C_DutyCycle)
+{
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle));
+ if (I2C_DutyCycle != I2C_DutyCycle_16_9)
+ {
+ /* I2C fast mode Tlow/Thigh=2 */
+ I2Cx->CCR &= I2C_DutyCycle_2;
+ }
+ else
+ {
+ /* I2C fast mode Tlow/Thigh=16/9 */
+ I2Cx->CCR |= I2C_DutyCycle_16_9;
+ }
+}
+
+
+
+/**
+ * @brief
+ ****************************************************************************************
+ *
+ * I2C State Monitoring Functions
+ *
+ ****************************************************************************************
+ * This I2C driver provides three different ways for I2C state monitoring
+ * depending on the application requirements and constraints:
+ *
+ *
+ * 1) Basic state monitoring:
+ * Using I2C_CheckEvent() function:
+ * It compares the status registers (SR1 and SR2) content to a given event
+ * (can be the combination of one or more flags).
+ * It returns SUCCESS if the current status includes the given flags
+ * and returns ERROR if one or more flags are missing in the current status.
+ * - When to use:
+ * - This function is suitable for most applications as well as for startup
+ * activity since the events are fully described in the product reference manual
+ * (RM0008).
+ * - It is also suitable for users who need to define their own events.
+ * - Limitations:
+ * - If an error occurs (ie. error flags are set besides to the monitored flags),
+ * the I2C_CheckEvent() function may return SUCCESS despite the communication
+ * hold or corrupted real state.
+ * In this case, it is advised to use error interrupts to monitor the error
+ * events and handle them in the interrupt IRQ handler.
+ *
+ * @note
+ * For error management, it is advised to use the following functions:
+ * - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR).
+ * - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs.
+ * Where x is the peripheral instance (I2C1, I2C2 ...)
+ * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into I2Cx_ER_IRQHandler()
+ * in order to determine which error occured.
+ * - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd()
+ * and/or I2C_GenerateStop() in order to clear the error flag and source,
+ * and return to correct communication status.
+ *
+ *
+ * 2) Advanced state monitoring:
+ * Using the function I2C_GetLastEvent() which returns the image of both status
+ * registers in a single word (uint32_t) (Status Register 2 value is shifted left
+ * by 16 bits and concatenated to Status Register 1).
+ * - When to use:
+ * - This function is suitable for the same applications above but it allows to
+ * overcome the mentioned limitation of I2C_GetFlagStatus() function.
+ * The returned value could be compared to events already defined in the
+ * library (stm32f10x_i2c.h) or to custom values defined by user.
+ * - This function is suitable when multiple flags are monitored at the same time.
+ * - At the opposite of I2C_CheckEvent() function, this function allows user to
+ * choose when an event is accepted (when all events flags are set and no
+ * other flags are set or just when the needed flags are set like
+ * I2C_CheckEvent() function).
+ * - Limitations:
+ * - User may need to define his own events.
+ * - Same remark concerning the error management is applicable for this
+ * function if user decides to check only regular communication flags (and
+ * ignores error flags).
+ *
+ *
+ * 3) Flag-based state monitoring:
+ * Using the function I2C_GetFlagStatus() which simply returns the status of
+ * one single flag (ie. I2C_FLAG_RXNE ...).
+ * - When to use:
+ * - This function could be used for specific applications or in debug phase.
+ * - It is suitable when only one flag checking is needed (most I2C events
+ * are monitored through multiple flags).
+ * - Limitations:
+ * - When calling this function, the Status register is accessed. Some flags are
+ * cleared when the status register is accessed. So checking the status
+ * of one Flag, may clear other ones.
+ * - Function may need to be called twice or more in order to monitor one
+ * single event.
+ *
+ * For detailed description of Events, please refer to section I2C_Events in
+ * stm32f10x_i2c.h file.
+ *
+ */
+
+/**
+ *
+ * 1) Basic state monitoring
+ *******************************************************************************
+ */
+
+/**
+ * @brief Checks whether the last I2Cx Event is equal to the one passed
+ * as parameter.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_EVENT: specifies the event to be checked.
+ * This parameter can be one of the following values:
+ * @arg I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED : EV1
+ * @arg I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : EV1
+ * @arg I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED : EV1
+ * @arg I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED : EV1
+ * @arg I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED : EV1
+ * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2
+ * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_DUALF) : EV2
+ * @arg (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_FLAG_GENCALL) : EV2
+ * @arg I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3
+ * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_DUALF) : EV3
+ * @arg (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL) : EV3
+ * @arg I2C_EVENT_SLAVE_ACK_FAILURE : EV3_2
+ * @arg I2C_EVENT_SLAVE_STOP_DETECTED : EV4
+ * @arg I2C_EVENT_MASTER_MODE_SELECT : EV5
+ * @arg I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : EV6
+ * @arg I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED : EV6
+ * @arg I2C_EVENT_MASTER_BYTE_RECEIVED : EV7
+ * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTING : EV8
+ * @arg I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8_2
+ * @arg I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9
+ *
+ * @note: For detailed description of Events, please refer to section
+ * I2C_Events in stm32f10x_i2c.h file.
+ *
+ * @retval An ErrorStatus enumeration value:
+ * - SUCCESS: Last event is equal to the I2C_EVENT
+ * - ERROR: Last event is different from the I2C_EVENT
+ */
+ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
+{
+ uint32_t lastevent = 0;
+ uint32_t flag1 = 0, flag2 = 0;
+ ErrorStatus status = ERROR;
+
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_EVENT(I2C_EVENT));
+
+ /* Read the I2Cx status register */
+ flag1 = I2Cx->SR1;
+ flag2 = I2Cx->SR2;
+ flag2 = flag2 << 16;
+
+ /* Get the last event value from I2C status register */
+ lastevent = (flag1 | flag2) & FLAG_Mask;
+
+ /* Check whether the last event contains the I2C_EVENT */
+ if ((lastevent & I2C_EVENT) == I2C_EVENT)
+ {
+ /* SUCCESS: last event is equal to I2C_EVENT */
+ status = SUCCESS;
+ }
+ else
+ {
+ /* ERROR: last event is different from I2C_EVENT */
+ status = ERROR;
+ }
+ /* Return status */
+ return status;
+}
+
+/**
+ *
+ * 2) Advanced state monitoring
+ *******************************************************************************
+ */
+
+/**
+ * @brief Returns the last I2Cx Event.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ *
+ * @note: For detailed description of Events, please refer to section
+ * I2C_Events in stm32f10x_i2c.h file.
+ *
+ * @retval The last event
+ */
+uint32_t I2C_GetLastEvent(I2C_TypeDef* I2Cx)
+{
+ uint32_t lastevent = 0;
+ uint32_t flag1 = 0, flag2 = 0;
+
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+
+ /* Read the I2Cx status register */
+ flag1 = I2Cx->SR1;
+ flag2 = I2Cx->SR2;
+ flag2 = flag2 << 16;
+
+ /* Get the last event value from I2C status register */
+ lastevent = (flag1 | flag2) & FLAG_Mask;
+
+ /* Return status */
+ return lastevent;
+}
+
+/**
+ *
+ * 3) Flag-based state monitoring
+ *******************************************************************************
+ */
+
+/**
+ * @brief Checks whether the specified I2C flag is set or not.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_FLAG: specifies the flag to check.
+ * This parameter can be one of the following values:
+ * @arg I2C_FLAG_DUALF: Dual flag (Slave mode)
+ * @arg I2C_FLAG_SMBHOST: SMBus host header (Slave mode)
+ * @arg I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode)
+ * @arg I2C_FLAG_GENCALL: General call header flag (Slave mode)
+ * @arg I2C_FLAG_TRA: Transmitter/Receiver flag
+ * @arg I2C_FLAG_BUSY: Bus busy flag
+ * @arg I2C_FLAG_MSL: Master/Slave flag
+ * @arg I2C_FLAG_SMBALERT: SMBus Alert flag
+ * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag
+ * @arg I2C_FLAG_PECERR: PEC error in reception flag
+ * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode)
+ * @arg I2C_FLAG_AF: Acknowledge failure flag
+ * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode)
+ * @arg I2C_FLAG_BERR: Bus error flag
+ * @arg I2C_FLAG_TXE: Data register empty flag (Transmitter)
+ * @arg I2C_FLAG_RXNE: Data register not empty (Receiver) flag
+ * @arg I2C_FLAG_STOPF: Stop detection flag (Slave mode)
+ * @arg I2C_FLAG_ADD10: 10-bit header sent flag (Master mode)
+ * @arg I2C_FLAG_BTF: Byte transfer finished flag
+ * @arg I2C_FLAG_ADDR: Address sent flag (Master mode) "ADSL"
+ * Address matched flag (Slave mode)"ENDA"
+ * @arg I2C_FLAG_SB: Start bit flag (Master mode)
+ * @retval The new state of I2C_FLAG (SET or RESET).
+ */
+FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG)
+{
+ FlagStatus bitstatus = RESET;
+ __IO uint32_t i2creg = 0, i2cxbase = 0;
+
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_GET_FLAG(I2C_FLAG));
+
+ /* Get the I2Cx peripheral base address */
+ i2cxbase = (uint32_t)I2Cx;
+
+ /* Read flag register index */
+ i2creg = I2C_FLAG >> 28;
+
+ /* Get bit[23:0] of the flag */
+ I2C_FLAG &= FLAG_Mask;
+
+ if(i2creg != 0)
+ {
+ /* Get the I2Cx SR1 register address */
+ i2cxbase += 0x14;
+ }
+ else
+ {
+ /* Flag in I2Cx SR2 Register */
+ I2C_FLAG = (uint32_t)(I2C_FLAG >> 16);
+ /* Get the I2Cx SR2 register address */
+ i2cxbase += 0x18;
+ }
+
+ if(((*(__IO uint32_t *)i2cxbase) & I2C_FLAG) != (uint32_t)RESET)
+ {
+ /* I2C_FLAG is set */
+ bitstatus = SET;
+ }
+ else
+ {
+ /* I2C_FLAG is reset */
+ bitstatus = RESET;
+ }
+
+ /* Return the I2C_FLAG status */
+ return bitstatus;
+}
+
+
+
+/**
+ * @brief Clears the I2Cx's pending flags.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_FLAG: specifies the flag to clear.
+ * This parameter can be any combination of the following values:
+ * @arg I2C_FLAG_SMBALERT: SMBus Alert flag
+ * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag
+ * @arg I2C_FLAG_PECERR: PEC error in reception flag
+ * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode)
+ * @arg I2C_FLAG_AF: Acknowledge failure flag
+ * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode)
+ * @arg I2C_FLAG_BERR: Bus error flag
+ *
+ * @note
+ * - STOPF (STOP detection) is cleared by software sequence: a read operation
+ * to I2C_SR1 register (I2C_GetFlagStatus()) followed by a write operation
+ * to I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral).
+ * - ADD10 (10-bit header sent) is cleared by software sequence: a read
+ * operation to I2C_SR1 (I2C_GetFlagStatus()) followed by writing the
+ * second byte of the address in DR register.
+ * - BTF (Byte Transfer Finished) is cleared by software sequence: a read
+ * operation to I2C_SR1 register (I2C_GetFlagStatus()) followed by a
+ * read/write to I2C_DR register (I2C_SendData()).
+ * - ADDR (Address sent) is cleared by software sequence: a read operation to
+ * I2C_SR1 register (I2C_GetFlagStatus()) followed by a read operation to
+ * I2C_SR2 register ((void)(I2Cx->SR2)).
+ * - SB (Start Bit) is cleared software sequence: a read operation to I2C_SR1
+ * register (I2C_GetFlagStatus()) followed by a write operation to I2C_DR
+ * register (I2C_SendData()).
+ * @retval None
+ */
+void I2C_ClearFlag(I2C_TypeDef* I2Cx, uint32_t I2C_FLAG)
+{
+ uint32_t flagpos = 0;
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG));
+ /* Get the I2C flag position */
+ flagpos = I2C_FLAG & FLAG_Mask;
+ /* Clear the selected I2C flag */
+ I2Cx->SR1 = (uint16_t)~flagpos;
+}
+
+/**
+ * @brief Checks whether the specified I2C interrupt has occurred or not.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_IT: specifies the interrupt source to check.
+ * This parameter can be one of the following values:
+ * @arg I2C_IT_SMBALERT: SMBus Alert flag
+ * @arg I2C_IT_TIMEOUT: Timeout or Tlow error flag
+ * @arg I2C_IT_PECERR: PEC error in reception flag
+ * @arg I2C_IT_OVR: Overrun/Underrun flag (Slave mode)
+ * @arg I2C_IT_AF: Acknowledge failure flag
+ * @arg I2C_IT_ARLO: Arbitration lost flag (Master mode)
+ * @arg I2C_IT_BERR: Bus error flag
+ * @arg I2C_IT_TXE: Data register empty flag (Transmitter)
+ * @arg I2C_IT_RXNE: Data register not empty (Receiver) flag
+ * @arg I2C_IT_STOPF: Stop detection flag (Slave mode)
+ * @arg I2C_IT_ADD10: 10-bit header sent flag (Master mode)
+ * @arg I2C_IT_BTF: Byte transfer finished flag
+ * @arg I2C_IT_ADDR: Address sent flag (Master mode) "ADSL"
+ * Address matched flag (Slave mode)"ENDAD"
+ * @arg I2C_IT_SB: Start bit flag (Master mode)
+ * @retval The new state of I2C_IT (SET or RESET).
+ */
+ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, uint32_t I2C_IT)
+{
+ ITStatus bitstatus = RESET;
+ uint32_t enablestatus = 0;
+
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_GET_IT(I2C_IT));
+
+ /* Check if the interrupt source is enabled or not */
+ enablestatus = (uint32_t)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CR2)) ;
+
+ /* Get bit[23:0] of the flag */
+ I2C_IT &= FLAG_Mask;
+
+ /* Check the status of the specified I2C flag */
+ if (((I2Cx->SR1 & I2C_IT) != (uint32_t)RESET) && enablestatus)
+ {
+ /* I2C_IT is set */
+ bitstatus = SET;
+ }
+ else
+ {
+ /* I2C_IT is reset */
+ bitstatus = RESET;
+ }
+ /* Return the I2C_IT status */
+ return bitstatus;
+}
+
+/**
+ * @brief Clears the I2Cx抯 interrupt pending bits.
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param I2C_IT: specifies the interrupt pending bit to clear.
+ * This parameter can be any combination of the following values:
+ * @arg I2C_IT_SMBALERT: SMBus Alert interrupt
+ * @arg I2C_IT_TIMEOUT: Timeout or Tlow error interrupt
+ * @arg I2C_IT_PECERR: PEC error in reception interrupt
+ * @arg I2C_IT_OVR: Overrun/Underrun interrupt (Slave mode)
+ * @arg I2C_IT_AF: Acknowledge failure interrupt
+ * @arg I2C_IT_ARLO: Arbitration lost interrupt (Master mode)
+ * @arg I2C_IT_BERR: Bus error interrupt
+ *
+ * @note
+ * - STOPF (STOP detection) is cleared by software sequence: a read operation
+ * to I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to
+ * I2C_CR1 register (I2C_Cmd() to re-enable the I2C peripheral).
+ * - ADD10 (10-bit header sent) is cleared by software sequence: a read
+ * operation to I2C_SR1 (I2C_GetITStatus()) followed by writing the second
+ * byte of the address in I2C_DR register.
+ * - BTF (Byte Transfer Finished) is cleared by software sequence: a read
+ * operation to I2C_SR1 register (I2C_GetITStatus()) followed by a
+ * read/write to I2C_DR register (I2C_SendData()).
+ * - ADDR (Address sent) is cleared by software sequence: a read operation to
+ * I2C_SR1 register (I2C_GetITStatus()) followed by a read operation to
+ * I2C_SR2 register ((void)(I2Cx->SR2)).
+ * - SB (Start Bit) is cleared by software sequence: a read operation to
+ * I2C_SR1 register (I2C_GetITStatus()) followed by a write operation to
+ * I2C_DR register (I2C_SendData()).
+ * @retval None
+ */
+void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, uint32_t I2C_IT)
+{
+ uint32_t flagpos = 0;
+ /* Check the parameters */
+ assert_param(IS_I2C_ALL_PERIPH(I2Cx));
+ assert_param(IS_I2C_CLEAR_IT(I2C_IT));
+ /* Get the I2C flag position */
+ flagpos = I2C_IT & FLAG_Mask;
+ /* Clear the selected I2C flag */
+ I2Cx->SR1 = (uint16_t)~flagpos;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_iwdg.c b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_iwdg.c
new file mode 100644
index 0000000..c7cbf7e
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_iwdg.c
@@ -0,0 +1,190 @@
+/**
+ ******************************************************************************
+ * @file stm32f10x_iwdg.c
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 11-March-2011
+ * @brief This file provides all the IWDG firmware functions.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_tim.h"
+#include "stm32f10x_rcc.h"
+
+/** @addtogroup STM32F10x_StdPeriph_Driver
+ * @{
+ */
+
+/** @defgroup TIM
+ * @brief TIM driver modules
+ * @{
+ */
+
+/** @defgroup TIM_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_Defines
+ * @{
+ */
+
+/* ---------------------- TIM registers bit mask ------------------------ */
+#define SMCR_ETR_Mask ((uint16_t)0x00FF)
+#define CCMR_Offset ((uint16_t)0x0018)
+#define CCER_CCE_Set ((uint16_t)0x0001)
+#define CCER_CCNE_Set ((uint16_t)0x0004)
+
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_Variables
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_FunctionPrototypes
+ * @{
+ */
+
+static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter);
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_Variables
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup TIM_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Deinitializes the TIMx peripheral registers to their default reset values.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @retval None
+ */
+void TIM_DeInit(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+
+ if (TIMx == TIM1)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, DISABLE);
+ }
+ else if (TIMx == TIM2)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
+ }
+ else if (TIMx == TIM3)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
+ }
+ else if (TIMx == TIM4)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4, DISABLE);
+ }
+ else if (TIMx == TIM5)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM5, DISABLE);
+ }
+ else if (TIMx == TIM6)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM6, DISABLE);
+ }
+ else if (TIMx == TIM7)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM7, DISABLE);
+ }
+ else if (TIMx == TIM8)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM8, DISABLE);
+ }
+ else if (TIMx == TIM9)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM9, DISABLE);
+ }
+ else if (TIMx == TIM10)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM10, DISABLE);
+ }
+ else if (TIMx == TIM11)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM11, DISABLE);
+ }
+ else if (TIMx == TIM12)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM12, DISABLE);
+ }
+ else if (TIMx == TIM13)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM13, DISABLE);
+ }
+ else if (TIMx == TIM14)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM14, DISABLE);
+ }
+ else if (TIMx == TIM15)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM15, DISABLE);
+ }
+ else if (TIMx == TIM16)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM16, DISABLE);
+ }
+ else
+ {
+ if (TIMx == TIM17)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM17, DISABLE);
+ }
+ }
+}
+
+/**
+ * @brief Initializes the TIMx Time Base Unit peripheral according to
+ * the specified parameters in the TIM_TimeBaseInitStruct.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef
+ * structure that contains the configuration information for the
+ * specified TIM peripheral.
+ * @retval None
+ */
+void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
+{
+ uint16_t tmpcr1 = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));
+ assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));
+
+ tmpcr1 = TIMx->CR1;
+
+ if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)||
+ (TIMx == TIM4) || (TIMx == TIM5))
+ {
+ /* Select the Counter Mode */
+ tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));
+ tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;
+ }
+
+ if((TIMx != TIM6) && (TIMx != TIM7))
+ {
+ /* Set the clock division */
+ tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD));
+ tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;
+ }
+
+ TIMx->CR1 = tmpcr1;
+
+ /* Set the Autoreload value */
+ TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;
+
+ /* Set the Prescaler value */
+ TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;
+
+ if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17))
+ {
+ /* Set the Repetition Counter value */
+ TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
+ }
+
+ /* Generate an update event to reload the Prescaler and the Repetition counter
+ values immediately */
+ TIMx->EGR = TIM_PSCReloadMode_Immediate;
+}
+
+/**
+ * @brief Initializes the TIMx Channel1 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure
+ * that contains the configuration information for the specified TIM peripheral.
+ * @retval None
+ */
+void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));
+ assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));
+ /* Disable the Channel 1: Reset the CC1E Bit */
+ TIMx->CCER &= (uint16_t)(~(uint16_t)TIM_CCER_CC1E);
+ /* Get the TIMx CCER register value */
+ tmpccer = TIMx->CCER;
+ /* Get the TIMx CR2 register value */
+ tmpcr2 = TIMx->CR2;
+
+ /* Get the TIMx CCMR1 register value */
+ tmpccmrx = TIMx->CCMR1;
+
+ /* Reset the Output Compare Mode Bits */
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC1M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC1S));
+
+ /* Select the Output Compare Mode */
+ tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
+
+ /* Reset the Output Polarity level */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1P));
+ /* Set the Output Compare Polarity */
+ tmpccer |= TIM_OCInitStruct->TIM_OCPolarity;
+
+ /* Set the Output State */
+ tmpccer |= TIM_OCInitStruct->TIM_OutputState;
+
+ if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)||
+ (TIMx == TIM16)|| (TIMx == TIM17))
+ {
+ assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState));
+ assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity));
+ assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState));
+ assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState));
+
+ /* Reset the Output N Polarity level */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NP));
+ /* Set the Output N Polarity */
+ tmpccer |= TIM_OCInitStruct->TIM_OCNPolarity;
+
+ /* Reset the Output N State */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC1NE));
+ /* Set the Output N State */
+ tmpccer |= TIM_OCInitStruct->TIM_OutputNState;
+
+ /* Reset the Output Compare and Output Compare N IDLE State */
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1));
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS1N));
+
+ /* Set the Output Idle state */
+ tmpcr2 |= TIM_OCInitStruct->TIM_OCIdleState;
+ /* Set the Output N Idle state */
+ tmpcr2 |= TIM_OCInitStruct->TIM_OCNIdleState;
+ }
+ /* Write to TIMx CR2 */
+ TIMx->CR2 = tmpcr2;
+
+ /* Write to TIMx CCMR1 */
+ TIMx->CCMR1 = tmpccmrx;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Write to TIMx CCER */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Initializes the TIMx Channel2 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select
+ * the TIM peripheral.
+ * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure
+ * that contains the configuration information for the specified TIM peripheral.
+ * @retval None
+ */
+void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));
+ assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));
+ /* Disable the Channel 2: Reset the CC2E Bit */
+ TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC2E));
+
+ /* Get the TIMx CCER register value */
+ tmpccer = TIMx->CCER;
+ /* Get the TIMx CR2 register value */
+ tmpcr2 = TIMx->CR2;
+
+ /* Get the TIMx CCMR1 register value */
+ tmpccmrx = TIMx->CCMR1;
+
+ /* Reset the Output Compare mode and Capture/Compare selection Bits */
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_OC2M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S));
+
+ /* Select the Output Compare Mode */
+ tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8);
+
+ /* Reset the Output Polarity level */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2P));
+ /* Set the Output Compare Polarity */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 4);
+
+ /* Set the Output State */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 4);
+
+ if((TIMx == TIM1) || (TIMx == TIM8))
+ {
+ assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState));
+ assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity));
+ assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState));
+ assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState));
+
+ /* Reset the Output N Polarity level */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NP));
+ /* Set the Output N Polarity */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 4);
+
+ /* Reset the Output N State */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC2NE));
+ /* Set the Output N State */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 4);
+
+ /* Reset the Output Compare and Output Compare N IDLE State */
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2));
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS2N));
+
+ /* Set the Output Idle state */
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 2);
+ /* Set the Output N Idle state */
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 2);
+ }
+ /* Write to TIMx CR2 */
+ TIMx->CR2 = tmpcr2;
+
+ /* Write to TIMx CCMR1 */
+ TIMx->CCMR1 = tmpccmrx;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR2 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Write to TIMx CCER */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Initializes the TIMx Channel3 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure
+ * that contains the configuration information for the specified TIM peripheral.
+ * @retval None
+ */
+void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));
+ assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));
+ /* Disable the Channel 2: Reset the CC2E Bit */
+ TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC3E));
+
+ /* Get the TIMx CCER register value */
+ tmpccer = TIMx->CCER;
+ /* Get the TIMx CR2 register value */
+ tmpcr2 = TIMx->CR2;
+
+ /* Get the TIMx CCMR2 register value */
+ tmpccmrx = TIMx->CCMR2;
+
+ /* Reset the Output Compare mode and Capture/Compare selection Bits */
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC3M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC3S));
+ /* Select the Output Compare Mode */
+ tmpccmrx |= TIM_OCInitStruct->TIM_OCMode;
+
+ /* Reset the Output Polarity level */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3P));
+ /* Set the Output Compare Polarity */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 8);
+
+ /* Set the Output State */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 8);
+
+ if((TIMx == TIM1) || (TIMx == TIM8))
+ {
+ assert_param(IS_TIM_OUTPUTN_STATE(TIM_OCInitStruct->TIM_OutputNState));
+ assert_param(IS_TIM_OCN_POLARITY(TIM_OCInitStruct->TIM_OCNPolarity));
+ assert_param(IS_TIM_OCNIDLE_STATE(TIM_OCInitStruct->TIM_OCNIdleState));
+ assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState));
+
+ /* Reset the Output N Polarity level */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NP));
+ /* Set the Output N Polarity */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCNPolarity << 8);
+ /* Reset the Output N State */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC3NE));
+
+ /* Set the Output N State */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputNState << 8);
+ /* Reset the Output Compare and Output Compare N IDLE State */
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3));
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS3N));
+ /* Set the Output Idle state */
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 4);
+ /* Set the Output N Idle state */
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCNIdleState << 4);
+ }
+ /* Write to TIMx CR2 */
+ TIMx->CR2 = tmpcr2;
+
+ /* Write to TIMx CCMR2 */
+ TIMx->CCMR2 = tmpccmrx;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR3 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Write to TIMx CCER */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Initializes the TIMx Channel4 according to the specified
+ * parameters in the TIM_OCInitStruct.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCInitStruct: pointer to a TIM_OCInitTypeDef structure
+ * that contains the configuration information for the specified TIM peripheral.
+ * @retval None
+ */
+void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)
+{
+ uint16_t tmpccmrx = 0, tmpccer = 0, tmpcr2 = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_MODE(TIM_OCInitStruct->TIM_OCMode));
+ assert_param(IS_TIM_OUTPUT_STATE(TIM_OCInitStruct->TIM_OutputState));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCInitStruct->TIM_OCPolarity));
+ /* Disable the Channel 2: Reset the CC4E Bit */
+ TIMx->CCER &= (uint16_t)(~((uint16_t)TIM_CCER_CC4E));
+
+ /* Get the TIMx CCER register value */
+ tmpccer = TIMx->CCER;
+ /* Get the TIMx CR2 register value */
+ tmpcr2 = TIMx->CR2;
+
+ /* Get the TIMx CCMR2 register value */
+ tmpccmrx = TIMx->CCMR2;
+
+ /* Reset the Output Compare mode and Capture/Compare selection Bits */
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_OC4M));
+ tmpccmrx &= (uint16_t)(~((uint16_t)TIM_CCMR2_CC4S));
+
+ /* Select the Output Compare Mode */
+ tmpccmrx |= (uint16_t)(TIM_OCInitStruct->TIM_OCMode << 8);
+
+ /* Reset the Output Polarity level */
+ tmpccer &= (uint16_t)(~((uint16_t)TIM_CCER_CC4P));
+ /* Set the Output Compare Polarity */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OCPolarity << 12);
+
+ /* Set the Output State */
+ tmpccer |= (uint16_t)(TIM_OCInitStruct->TIM_OutputState << 12);
+
+ if((TIMx == TIM1) || (TIMx == TIM8))
+ {
+ assert_param(IS_TIM_OCIDLE_STATE(TIM_OCInitStruct->TIM_OCIdleState));
+ /* Reset the Output Compare IDLE State */
+ tmpcr2 &= (uint16_t)(~((uint16_t)TIM_CR2_OIS4));
+ /* Set the Output Idle state */
+ tmpcr2 |= (uint16_t)(TIM_OCInitStruct->TIM_OCIdleState << 6);
+ }
+ /* Write to TIMx CR2 */
+ TIMx->CR2 = tmpcr2;
+
+ /* Write to TIMx CCMR2 */
+ TIMx->CCMR2 = tmpccmrx;
+
+ /* Set the Capture Compare Register value */
+ TIMx->CCR4 = TIM_OCInitStruct->TIM_Pulse;
+
+ /* Write to TIMx CCER */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Initializes the TIM peripheral according to the specified
+ * parameters in the TIM_ICInitStruct.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure
+ * that contains the configuration information for the specified TIM peripheral.
+ * @retval None
+ */
+void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel));
+ assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection));
+ assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler));
+ assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter));
+
+ if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) ||
+ (TIMx == TIM4) ||(TIMx == TIM5))
+ {
+ assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity));
+ }
+ else
+ {
+ assert_param(IS_TIM_IC_POLARITY_LITE(TIM_ICInitStruct->TIM_ICPolarity));
+ }
+ if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
+ {
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ /* TI1 Configuration */
+ TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_2)
+ {
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ /* TI2 Configuration */
+ TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_3)
+ {
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ /* TI3 Configuration */
+ TI3_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC3Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else
+ {
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ /* TI4 Configuration */
+ TI4_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity,
+ TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC4Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+}
+
+/**
+ * @brief Configures the TIM peripheral according to the specified
+ * parameters in the TIM_ICInitStruct to measure an external PWM signal.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure
+ * that contains the configuration information for the specified TIM peripheral.
+ * @retval None
+ */
+void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
+{
+ uint16_t icoppositepolarity = TIM_ICPolarity_Rising;
+ uint16_t icoppositeselection = TIM_ICSelection_DirectTI;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ /* Select the Opposite Input Polarity */
+ if (TIM_ICInitStruct->TIM_ICPolarity == TIM_ICPolarity_Rising)
+ {
+ icoppositepolarity = TIM_ICPolarity_Falling;
+ }
+ else
+ {
+ icoppositepolarity = TIM_ICPolarity_Rising;
+ }
+ /* Select the Opposite Input */
+ if (TIM_ICInitStruct->TIM_ICSelection == TIM_ICSelection_DirectTI)
+ {
+ icoppositeselection = TIM_ICSelection_IndirectTI;
+ }
+ else
+ {
+ icoppositeselection = TIM_ICSelection_DirectTI;
+ }
+ if (TIM_ICInitStruct->TIM_Channel == TIM_Channel_1)
+ {
+ /* TI1 Configuration */
+ TI1_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ /* TI2 Configuration */
+ TI2_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+ else
+ {
+ /* TI2 Configuration */
+ TI2_Config(TIMx, TIM_ICInitStruct->TIM_ICPolarity, TIM_ICInitStruct->TIM_ICSelection,
+ TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC2Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ /* TI1 Configuration */
+ TI1_Config(TIMx, icoppositepolarity, icoppositeselection, TIM_ICInitStruct->TIM_ICFilter);
+ /* Set the Input Capture Prescaler value */
+ TIM_SetIC1Prescaler(TIMx, TIM_ICInitStruct->TIM_ICPrescaler);
+ }
+}
+
+/**
+ * @brief Configures the: Break feature, dead time, Lock level, the OSSI,
+ * the OSSR State and the AOE(automatic output enable).
+ * @param TIMx: where x can be 1 or 8 to select the TIM
+ * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure that
+ * contains the BDTR Register configuration information for the TIM peripheral.
+ * @retval None
+ */
+void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST2_PERIPH(TIMx));
+ assert_param(IS_TIM_OSSR_STATE(TIM_BDTRInitStruct->TIM_OSSRState));
+ assert_param(IS_TIM_OSSI_STATE(TIM_BDTRInitStruct->TIM_OSSIState));
+ assert_param(IS_TIM_LOCK_LEVEL(TIM_BDTRInitStruct->TIM_LOCKLevel));
+ assert_param(IS_TIM_BREAK_STATE(TIM_BDTRInitStruct->TIM_Break));
+ assert_param(IS_TIM_BREAK_POLARITY(TIM_BDTRInitStruct->TIM_BreakPolarity));
+ assert_param(IS_TIM_AUTOMATIC_OUTPUT_STATE(TIM_BDTRInitStruct->TIM_AutomaticOutput));
+ /* Set the Lock level, the Break enable Bit and the Ploarity, the OSSR State,
+ the OSSI State, the dead time value and the Automatic Output Enable Bit */
+ TIMx->BDTR = (uint32_t)TIM_BDTRInitStruct->TIM_OSSRState | TIM_BDTRInitStruct->TIM_OSSIState |
+ TIM_BDTRInitStruct->TIM_LOCKLevel | TIM_BDTRInitStruct->TIM_DeadTime |
+ TIM_BDTRInitStruct->TIM_Break | TIM_BDTRInitStruct->TIM_BreakPolarity |
+ TIM_BDTRInitStruct->TIM_AutomaticOutput;
+}
+
+/**
+ * @brief Fills each TIM_TimeBaseInitStruct member with its default value.
+ * @param TIM_TimeBaseInitStruct : pointer to a TIM_TimeBaseInitTypeDef
+ * structure which will be initialized.
+ * @retval None
+ */
+void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
+{
+ /* Set the default configuration */
+ TIM_TimeBaseInitStruct->TIM_Period = 0xFFFF;
+ TIM_TimeBaseInitStruct->TIM_Prescaler = 0x0000;
+ TIM_TimeBaseInitStruct->TIM_ClockDivision = TIM_CKD_DIV1;
+ TIM_TimeBaseInitStruct->TIM_CounterMode = TIM_CounterMode_Up;
+ TIM_TimeBaseInitStruct->TIM_RepetitionCounter = 0x0000;
+}
+
+/**
+ * @brief Fills each TIM_OCInitStruct member with its default value.
+ * @param TIM_OCInitStruct : pointer to a TIM_OCInitTypeDef structure which will
+ * be initialized.
+ * @retval None
+ */
+void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct)
+{
+ /* Set the default configuration */
+ TIM_OCInitStruct->TIM_OCMode = TIM_OCMode_Timing;
+ TIM_OCInitStruct->TIM_OutputState = TIM_OutputState_Disable;
+ TIM_OCInitStruct->TIM_OutputNState = TIM_OutputNState_Disable;
+ TIM_OCInitStruct->TIM_Pulse = 0x0000;
+ TIM_OCInitStruct->TIM_OCPolarity = TIM_OCPolarity_High;
+ TIM_OCInitStruct->TIM_OCNPolarity = TIM_OCPolarity_High;
+ TIM_OCInitStruct->TIM_OCIdleState = TIM_OCIdleState_Reset;
+ TIM_OCInitStruct->TIM_OCNIdleState = TIM_OCNIdleState_Reset;
+}
+
+/**
+ * @brief Fills each TIM_ICInitStruct member with its default value.
+ * @param TIM_ICInitStruct: pointer to a TIM_ICInitTypeDef structure which will
+ * be initialized.
+ * @retval None
+ */
+void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct)
+{
+ /* Set the default configuration */
+ TIM_ICInitStruct->TIM_Channel = TIM_Channel_1;
+ TIM_ICInitStruct->TIM_ICPolarity = TIM_ICPolarity_Rising;
+ TIM_ICInitStruct->TIM_ICSelection = TIM_ICSelection_DirectTI;
+ TIM_ICInitStruct->TIM_ICPrescaler = TIM_ICPSC_DIV1;
+ TIM_ICInitStruct->TIM_ICFilter = 0x00;
+}
+
+/**
+ * @brief Fills each TIM_BDTRInitStruct member with its default value.
+ * @param TIM_BDTRInitStruct: pointer to a TIM_BDTRInitTypeDef structure which
+ * will be initialized.
+ * @retval None
+ */
+void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct)
+{
+ /* Set the default configuration */
+ TIM_BDTRInitStruct->TIM_OSSRState = TIM_OSSRState_Disable;
+ TIM_BDTRInitStruct->TIM_OSSIState = TIM_OSSIState_Disable;
+ TIM_BDTRInitStruct->TIM_LOCKLevel = TIM_LOCKLevel_OFF;
+ TIM_BDTRInitStruct->TIM_DeadTime = 0x00;
+ TIM_BDTRInitStruct->TIM_Break = TIM_Break_Disable;
+ TIM_BDTRInitStruct->TIM_BreakPolarity = TIM_BreakPolarity_Low;
+ TIM_BDTRInitStruct->TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
+}
+
+/**
+ * @brief Enables or disables the specified TIM peripheral.
+ * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral.
+ * @param NewState: new state of the TIMx peripheral.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the TIM Counter */
+ TIMx->CR1 |= TIM_CR1_CEN;
+ }
+ else
+ {
+ /* Disable the TIM Counter */
+ TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));
+ }
+}
+
+/**
+ * @brief Enables or disables the TIM peripheral Main Outputs.
+ * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral.
+ * @param NewState: new state of the TIM peripheral Main Outputs.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST2_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the TIM Main Output */
+ TIMx->BDTR |= TIM_BDTR_MOE;
+ }
+ else
+ {
+ /* Disable the TIM Main Output */
+ TIMx->BDTR &= (uint16_t)(~((uint16_t)TIM_BDTR_MOE));
+ }
+}
+
+/**
+ * @brief Enables or disables the specified TIM interrupts.
+ * @param TIMx: where x can be 1 to 17 to select the TIMx peripheral.
+ * @param TIM_IT: specifies the TIM interrupts sources to be enabled or disabled.
+ * This parameter can be any combination of the following values:
+ * @arg TIM_IT_Update: TIM update Interrupt source
+ * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
+ * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
+ * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
+ * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
+ * @arg TIM_IT_COM: TIM Commutation Interrupt source
+ * @arg TIM_IT_Trigger: TIM Trigger Interrupt source
+ * @arg TIM_IT_Break: TIM Break Interrupt source
+ * @note
+ * - TIM6 and TIM7 can only generate an update interrupt.
+ * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1,
+ * TIM_IT_CC2 or TIM_IT_Trigger.
+ * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1.
+ * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15.
+ * - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17.
+ * @param NewState: new state of the TIM interrupts.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_IT(TIM_IT));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the Interrupt sources */
+ TIMx->DIER |= TIM_IT;
+ }
+ else
+ {
+ /* Disable the Interrupt sources */
+ TIMx->DIER &= (uint16_t)~TIM_IT;
+ }
+}
+
+/**
+ * @brief Configures the TIMx event to be generate by software.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_EventSource: specifies the event source.
+ * This parameter can be one or more of the following values:
+ * @arg TIM_EventSource_Update: Timer update Event source
+ * @arg TIM_EventSource_CC1: Timer Capture Compare 1 Event source
+ * @arg TIM_EventSource_CC2: Timer Capture Compare 2 Event source
+ * @arg TIM_EventSource_CC3: Timer Capture Compare 3 Event source
+ * @arg TIM_EventSource_CC4: Timer Capture Compare 4 Event source
+ * @arg TIM_EventSource_COM: Timer COM event source
+ * @arg TIM_EventSource_Trigger: Timer Trigger Event source
+ * @arg TIM_EventSource_Break: Timer Break event source
+ * @note
+ * - TIM6 and TIM7 can only generate an update event.
+ * - TIM_EventSource_COM and TIM_EventSource_Break are used only with TIM1 and TIM8.
+ * @retval None
+ */
+void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_EVENT_SOURCE(TIM_EventSource));
+
+ /* Set the event sources */
+ TIMx->EGR = TIM_EventSource;
+}
+
+/**
+ * @brief Configures the TIMx's DMA interface.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select
+ * the TIM peripheral.
+ * @param TIM_DMABase: DMA Base address.
+ * This parameter can be one of the following values:
+ * @arg TIM_DMABase_CR, TIM_DMABase_CR2, TIM_DMABase_SMCR,
+ * TIM_DMABase_DIER, TIM1_DMABase_SR, TIM_DMABase_EGR,
+ * TIM_DMABase_CCMR1, TIM_DMABase_CCMR2, TIM_DMABase_CCER,
+ * TIM_DMABase_CNT, TIM_DMABase_PSC, TIM_DMABase_ARR,
+ * TIM_DMABase_RCR, TIM_DMABase_CCR1, TIM_DMABase_CCR2,
+ * TIM_DMABase_CCR3, TIM_DMABase_CCR4, TIM_DMABase_BDTR,
+ * TIM_DMABase_DCR.
+ * @param TIM_DMABurstLength: DMA Burst length.
+ * This parameter can be one value between:
+ * TIM_DMABurstLength_1Transfer and TIM_DMABurstLength_18Transfers.
+ * @retval None
+ */
+void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST4_PERIPH(TIMx));
+ assert_param(IS_TIM_DMA_BASE(TIM_DMABase));
+ assert_param(IS_TIM_DMA_LENGTH(TIM_DMABurstLength));
+ /* Set the DMA Base and the DMA Burst Length */
+ TIMx->DCR = TIM_DMABase | TIM_DMABurstLength;
+}
+
+/**
+ * @brief Enables or disables the TIMx's DMA Requests.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7, 8, 15, 16 or 17
+ * to select the TIM peripheral.
+ * @param TIM_DMASource: specifies the DMA Request sources.
+ * This parameter can be any combination of the following values:
+ * @arg TIM_DMA_Update: TIM update Interrupt source
+ * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source
+ * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source
+ * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source
+ * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source
+ * @arg TIM_DMA_COM: TIM Commutation DMA source
+ * @arg TIM_DMA_Trigger: TIM Trigger DMA source
+ * @param NewState: new state of the DMA Request sources.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST9_PERIPH(TIMx));
+ assert_param(IS_TIM_DMA_SOURCE(TIM_DMASource));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the DMA sources */
+ TIMx->DIER |= TIM_DMASource;
+ }
+ else
+ {
+ /* Disable the DMA sources */
+ TIMx->DIER &= (uint16_t)~TIM_DMASource;
+ }
+}
+
+/**
+ * @brief Configures the TIMx internal Clock
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15
+ * to select the TIM peripheral.
+ * @retval None
+ */
+void TIM_InternalClockConfig(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ /* Disable slave mode to clock the prescaler directly with the internal clock */
+ TIMx->SMCR &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS));
+}
+
+/**
+ * @brief Configures the TIMx Internal Trigger as External Clock
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_ITRSource: Trigger source.
+ * This parameter can be one of the following values:
+ * @param TIM_TS_ITR0: Internal Trigger 0
+ * @param TIM_TS_ITR1: Internal Trigger 1
+ * @param TIM_TS_ITR2: Internal Trigger 2
+ * @param TIM_TS_ITR3: Internal Trigger 3
+ * @retval None
+ */
+void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_INTERNAL_TRIGGER_SELECTION(TIM_InputTriggerSource));
+ /* Select the Internal Trigger */
+ TIM_SelectInputTrigger(TIMx, TIM_InputTriggerSource);
+ /* Select the External clock mode1 */
+ TIMx->SMCR |= TIM_SlaveMode_External1;
+}
+
+/**
+ * @brief Configures the TIMx Trigger as External Clock
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_TIxExternalCLKSource: Trigger source.
+ * This parameter can be one of the following values:
+ * @arg TIM_TIxExternalCLK1Source_TI1ED: TI1 Edge Detector
+ * @arg TIM_TIxExternalCLK1Source_TI1: Filtered Timer Input 1
+ * @arg TIM_TIxExternalCLK1Source_TI2: Filtered Timer Input 2
+ * @param TIM_ICPolarity: specifies the TIx Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPolarity_Rising
+ * @arg TIM_ICPolarity_Falling
+ * @param ICFilter : specifies the filter value.
+ * This parameter must be a value between 0x0 and 0xF.
+ * @retval None
+ */
+void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
+ uint16_t TIM_ICPolarity, uint16_t ICFilter)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_TIXCLK_SOURCE(TIM_TIxExternalCLKSource));
+ assert_param(IS_TIM_IC_POLARITY(TIM_ICPolarity));
+ assert_param(IS_TIM_IC_FILTER(ICFilter));
+ /* Configure the Timer Input Clock Source */
+ if (TIM_TIxExternalCLKSource == TIM_TIxExternalCLK1Source_TI2)
+ {
+ TI2_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);
+ }
+ else
+ {
+ TI1_Config(TIMx, TIM_ICPolarity, TIM_ICSelection_DirectTI, ICFilter);
+ }
+ /* Select the Trigger source */
+ TIM_SelectInputTrigger(TIMx, TIM_TIxExternalCLKSource);
+ /* Select the External clock mode1 */
+ TIMx->SMCR |= TIM_SlaveMode_External1;
+}
+
+/**
+ * @brief Configures the External clock Mode1
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler.
+ * This parameter can be one of the following values:
+ * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF.
+ * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.
+ * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.
+ * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.
+ * @param TIM_ExtTRGPolarity: The external Trigger Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.
+ * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.
+ * @param ExtTRGFilter: External Trigger Filter.
+ * This parameter must be a value between 0x00 and 0x0F
+ * @retval None
+ */
+void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
+ uint16_t ExtTRGFilter)
+{
+ uint16_t tmpsmcr = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));
+ assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));
+ assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));
+ /* Configure the ETR Clock source */
+ TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);
+
+ /* Get the TIMx SMCR register value */
+ tmpsmcr = TIMx->SMCR;
+ /* Reset the SMS Bits */
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS));
+ /* Select the External clock mode1 */
+ tmpsmcr |= TIM_SlaveMode_External1;
+ /* Select the Trigger selection : ETRF */
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS));
+ tmpsmcr |= TIM_TS_ETRF;
+ /* Write to TIMx SMCR */
+ TIMx->SMCR = tmpsmcr;
+}
+
+/**
+ * @brief Configures the External clock Mode2
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler.
+ * This parameter can be one of the following values:
+ * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF.
+ * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.
+ * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.
+ * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.
+ * @param TIM_ExtTRGPolarity: The external Trigger Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.
+ * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.
+ * @param ExtTRGFilter: External Trigger Filter.
+ * This parameter must be a value between 0x00 and 0x0F
+ * @retval None
+ */
+void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
+ uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));
+ assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));
+ assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));
+ /* Configure the ETR Clock source */
+ TIM_ETRConfig(TIMx, TIM_ExtTRGPrescaler, TIM_ExtTRGPolarity, ExtTRGFilter);
+ /* Enable the External clock mode2 */
+ TIMx->SMCR |= TIM_SMCR_ECE;
+}
+
+/**
+ * @brief Configures the TIMx External Trigger (ETR).
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler.
+ * This parameter can be one of the following values:
+ * @arg TIM_ExtTRGPSC_OFF: ETRP Prescaler OFF.
+ * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2.
+ * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4.
+ * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8.
+ * @param TIM_ExtTRGPolarity: The external Trigger Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active.
+ * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active.
+ * @param ExtTRGFilter: External Trigger Filter.
+ * This parameter must be a value between 0x00 and 0x0F
+ * @retval None
+ */
+void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
+ uint16_t ExtTRGFilter)
+{
+ uint16_t tmpsmcr = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_EXT_PRESCALER(TIM_ExtTRGPrescaler));
+ assert_param(IS_TIM_EXT_POLARITY(TIM_ExtTRGPolarity));
+ assert_param(IS_TIM_EXT_FILTER(ExtTRGFilter));
+ tmpsmcr = TIMx->SMCR;
+ /* Reset the ETR Bits */
+ tmpsmcr &= SMCR_ETR_Mask;
+ /* Set the Prescaler, the Filter value and the Polarity */
+ tmpsmcr |= (uint16_t)(TIM_ExtTRGPrescaler | (uint16_t)(TIM_ExtTRGPolarity | (uint16_t)(ExtTRGFilter << (uint16_t)8)));
+ /* Write to TIMx SMCR */
+ TIMx->SMCR = tmpsmcr;
+}
+
+/**
+ * @brief Configures the TIMx Prescaler.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param Prescaler: specifies the Prescaler Register value
+ * @param TIM_PSCReloadMode: specifies the TIM Prescaler Reload mode
+ * This parameter can be one of the following values:
+ * @arg TIM_PSCReloadMode_Update: The Prescaler is loaded at the update event.
+ * @arg TIM_PSCReloadMode_Immediate: The Prescaler is loaded immediately.
+ * @retval None
+ */
+void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_PRESCALER_RELOAD(TIM_PSCReloadMode));
+ /* Set the Prescaler value */
+ TIMx->PSC = Prescaler;
+ /* Set or reset the UG Bit */
+ TIMx->EGR = TIM_PSCReloadMode;
+}
+
+/**
+ * @brief Specifies the TIMx Counter Mode to be used.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_CounterMode: specifies the Counter Mode to be used
+ * This parameter can be one of the following values:
+ * @arg TIM_CounterMode_Up: TIM Up Counting Mode
+ * @arg TIM_CounterMode_Down: TIM Down Counting Mode
+ * @arg TIM_CounterMode_CenterAligned1: TIM Center Aligned Mode1
+ * @arg TIM_CounterMode_CenterAligned2: TIM Center Aligned Mode2
+ * @arg TIM_CounterMode_CenterAligned3: TIM Center Aligned Mode3
+ * @retval None
+ */
+void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode)
+{
+ uint16_t tmpcr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_COUNTER_MODE(TIM_CounterMode));
+ tmpcr1 = TIMx->CR1;
+ /* Reset the CMS and DIR Bits */
+ tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));
+ /* Set the Counter Mode */
+ tmpcr1 |= TIM_CounterMode;
+ /* Write to TIMx CR1 register */
+ TIMx->CR1 = tmpcr1;
+}
+
+/**
+ * @brief Selects the Input Trigger source
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_InputTriggerSource: The Input Trigger source.
+ * This parameter can be one of the following values:
+ * @arg TIM_TS_ITR0: Internal Trigger 0
+ * @arg TIM_TS_ITR1: Internal Trigger 1
+ * @arg TIM_TS_ITR2: Internal Trigger 2
+ * @arg TIM_TS_ITR3: Internal Trigger 3
+ * @arg TIM_TS_TI1F_ED: TI1 Edge Detector
+ * @arg TIM_TS_TI1FP1: Filtered Timer Input 1
+ * @arg TIM_TS_TI2FP2: Filtered Timer Input 2
+ * @arg TIM_TS_ETRF: External Trigger input
+ * @retval None
+ */
+void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource)
+{
+ uint16_t tmpsmcr = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));
+ /* Get the TIMx SMCR register value */
+ tmpsmcr = TIMx->SMCR;
+ /* Reset the TS Bits */
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_TS));
+ /* Set the Input Trigger source */
+ tmpsmcr |= TIM_InputTriggerSource;
+ /* Write to TIMx SMCR */
+ TIMx->SMCR = tmpsmcr;
+}
+
+/**
+ * @brief Configures the TIMx Encoder Interface.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_EncoderMode: specifies the TIMx Encoder Mode.
+ * This parameter can be one of the following values:
+ * @arg TIM_EncoderMode_TI1: Counter counts on TI1FP1 edge depending on TI2FP2 level.
+ * @arg TIM_EncoderMode_TI2: Counter counts on TI2FP2 edge depending on TI1FP1 level.
+ * @arg TIM_EncoderMode_TI12: Counter counts on both TI1FP1 and TI2FP2 edges depending
+ * on the level of the other input.
+ * @param TIM_IC1Polarity: specifies the IC1 Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPolarity_Falling: IC Falling edge.
+ * @arg TIM_ICPolarity_Rising: IC Rising edge.
+ * @param TIM_IC2Polarity: specifies the IC2 Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPolarity_Falling: IC Falling edge.
+ * @arg TIM_ICPolarity_Rising: IC Rising edge.
+ * @retval None
+ */
+void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
+ uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)
+{
+ uint16_t tmpsmcr = 0;
+ uint16_t tmpccmr1 = 0;
+ uint16_t tmpccer = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST5_PERIPH(TIMx));
+ assert_param(IS_TIM_ENCODER_MODE(TIM_EncoderMode));
+ assert_param(IS_TIM_IC_POLARITY(TIM_IC1Polarity));
+ assert_param(IS_TIM_IC_POLARITY(TIM_IC2Polarity));
+
+ /* Get the TIMx SMCR register value */
+ tmpsmcr = TIMx->SMCR;
+
+ /* Get the TIMx CCMR1 register value */
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Get the TIMx CCER register value */
+ tmpccer = TIMx->CCER;
+
+ /* Set the encoder Mode */
+ tmpsmcr &= (uint16_t)(~((uint16_t)TIM_SMCR_SMS));
+ tmpsmcr |= TIM_EncoderMode;
+
+ /* Select the Capture Compare 1 and the Capture Compare 2 as input */
+ tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & (uint16_t)(~((uint16_t)TIM_CCMR1_CC2S)));
+ tmpccmr1 |= TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;
+
+ /* Set the TI1 and the TI2 Polarities */
+ tmpccer &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCER_CC1P)) & ((uint16_t)~((uint16_t)TIM_CCER_CC2P)));
+ tmpccer |= (uint16_t)(TIM_IC1Polarity | (uint16_t)(TIM_IC2Polarity << (uint16_t)4));
+
+ /* Write to TIMx SMCR */
+ TIMx->SMCR = tmpsmcr;
+ /* Write to TIMx CCMR1 */
+ TIMx->CCMR1 = tmpccmr1;
+ /* Write to TIMx CCER */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Forces the TIMx output 1 waveform to active or inactive level.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform.
+ * This parameter can be one of the following values:
+ * @arg TIM_ForcedAction_Active: Force active level on OC1REF
+ * @arg TIM_ForcedAction_InActive: Force inactive level on OC1REF.
+ * @retval None
+ */
+void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+ tmpccmr1 = TIMx->CCMR1;
+ /* Reset the OC1M Bits */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1M);
+ /* Configure The Forced output Mode */
+ tmpccmr1 |= TIM_ForcedAction;
+ /* Write to TIMx CCMR1 register */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Forces the TIMx output 2 waveform to active or inactive level.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform.
+ * This parameter can be one of the following values:
+ * @arg TIM_ForcedAction_Active: Force active level on OC2REF
+ * @arg TIM_ForcedAction_InActive: Force inactive level on OC2REF.
+ * @retval None
+ */
+void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+ tmpccmr1 = TIMx->CCMR1;
+ /* Reset the OC2M Bits */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2M);
+ /* Configure The Forced output Mode */
+ tmpccmr1 |= (uint16_t)(TIM_ForcedAction << 8);
+ /* Write to TIMx CCMR1 register */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Forces the TIMx output 3 waveform to active or inactive level.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform.
+ * This parameter can be one of the following values:
+ * @arg TIM_ForcedAction_Active: Force active level on OC3REF
+ * @arg TIM_ForcedAction_InActive: Force inactive level on OC3REF.
+ * @retval None
+ */
+void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC1M Bits */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3M);
+ /* Configure The Forced output Mode */
+ tmpccmr2 |= TIM_ForcedAction;
+ /* Write to TIMx CCMR2 register */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Forces the TIMx output 4 waveform to active or inactive level.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ForcedAction: specifies the forced Action to be set to the output waveform.
+ * This parameter can be one of the following values:
+ * @arg TIM_ForcedAction_Active: Force active level on OC4REF
+ * @arg TIM_ForcedAction_InActive: Force inactive level on OC4REF.
+ * @retval None
+ */
+void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_FORCED_ACTION(TIM_ForcedAction));
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC2M Bits */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4M);
+ /* Configure The Forced output Mode */
+ tmpccmr2 |= (uint16_t)(TIM_ForcedAction << 8);
+ /* Write to TIMx CCMR2 register */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Enables or disables TIMx peripheral Preload register on ARR.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param NewState: new state of the TIMx peripheral Preload register
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Set the ARR Preload Bit */
+ TIMx->CR1 |= TIM_CR1_ARPE;
+ }
+ else
+ {
+ /* Reset the ARR Preload Bit */
+ TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE);
+ }
+}
+
+/**
+ * @brief Selects the TIM peripheral Commutation event.
+ * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIMx peripheral
+ * @param NewState: new state of the Commutation event.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST2_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Set the COM Bit */
+ TIMx->CR2 |= TIM_CR2_CCUS;
+ }
+ else
+ {
+ /* Reset the COM Bit */
+ TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCUS);
+ }
+}
+
+/**
+ * @brief Selects the TIMx peripheral Capture Compare DMA source.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 15, 16 or 17 to select
+ * the TIM peripheral.
+ * @param NewState: new state of the Capture Compare DMA source
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST4_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Set the CCDS Bit */
+ TIMx->CR2 |= TIM_CR2_CCDS;
+ }
+ else
+ {
+ /* Reset the CCDS Bit */
+ TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCDS);
+ }
+}
+
+/**
+ * @brief Sets or Resets the TIM peripheral Capture Compare Preload Control bit.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8 or 15
+ * to select the TIMx peripheral
+ * @param NewState: new state of the Capture Compare Preload Control bit
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST5_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Set the CCPC Bit */
+ TIMx->CR2 |= TIM_CR2_CCPC;
+ }
+ else
+ {
+ /* Reset the CCPC Bit */
+ TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_CCPC);
+ }
+}
+
+/**
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR1.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_OCPreload: new state of the TIMx peripheral Preload register
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPreload_Enable
+ * @arg TIM_OCPreload_Disable
+ * @retval None
+ */
+void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+ tmpccmr1 = TIMx->CCMR1;
+ /* Reset the OC1PE Bit */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1PE);
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr1 |= TIM_OCPreload;
+ /* Write to TIMx CCMR1 register */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR2.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select
+ * the TIM peripheral.
+ * @param TIM_OCPreload: new state of the TIMx peripheral Preload register
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPreload_Enable
+ * @arg TIM_OCPreload_Disable
+ * @retval None
+ */
+void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+ tmpccmr1 = TIMx->CCMR1;
+ /* Reset the OC2PE Bit */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2PE);
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr1 |= (uint16_t)(TIM_OCPreload << 8);
+ /* Write to TIMx CCMR1 register */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR3.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCPreload: new state of the TIMx peripheral Preload register
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPreload_Enable
+ * @arg TIM_OCPreload_Disable
+ * @retval None
+ */
+void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC3PE Bit */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3PE);
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr2 |= TIM_OCPreload;
+ /* Write to TIMx CCMR2 register */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Enables or disables the TIMx peripheral Preload register on CCR4.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCPreload: new state of the TIMx peripheral Preload register
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPreload_Enable
+ * @arg TIM_OCPreload_Disable
+ * @retval None
+ */
+void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC4PE Bit */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4PE);
+ /* Enable or Disable the Output Compare Preload feature */
+ tmpccmr2 |= (uint16_t)(TIM_OCPreload << 8);
+ /* Write to TIMx CCMR2 register */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Configures the TIMx Output Compare 1 Fast feature.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCFast_Enable: TIM output compare fast enable
+ * @arg TIM_OCFast_Disable: TIM output compare fast disable
+ * @retval None
+ */
+void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));
+ /* Get the TIMx CCMR1 register value */
+ tmpccmr1 = TIMx->CCMR1;
+ /* Reset the OC1FE Bit */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1FE);
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr1 |= TIM_OCFast;
+ /* Write to TIMx CCMR1 */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Configures the TIMx Output Compare 2 Fast feature.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select
+ * the TIM peripheral.
+ * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCFast_Enable: TIM output compare fast enable
+ * @arg TIM_OCFast_Disable: TIM output compare fast disable
+ * @retval None
+ */
+void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));
+ /* Get the TIMx CCMR1 register value */
+ tmpccmr1 = TIMx->CCMR1;
+ /* Reset the OC2FE Bit */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2FE);
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr1 |= (uint16_t)(TIM_OCFast << 8);
+ /* Write to TIMx CCMR1 */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Configures the TIMx Output Compare 3 Fast feature.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCFast_Enable: TIM output compare fast enable
+ * @arg TIM_OCFast_Disable: TIM output compare fast disable
+ * @retval None
+ */
+void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));
+ /* Get the TIMx CCMR2 register value */
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC3FE Bit */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3FE);
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr2 |= TIM_OCFast;
+ /* Write to TIMx CCMR2 */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Configures the TIMx Output Compare 4 Fast feature.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCFast: new state of the Output Compare Fast Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCFast_Enable: TIM output compare fast enable
+ * @arg TIM_OCFast_Disable: TIM output compare fast disable
+ * @retval None
+ */
+void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCFAST_STATE(TIM_OCFast));
+ /* Get the TIMx CCMR2 register value */
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC4FE Bit */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4FE);
+ /* Enable or Disable the Output Compare Fast Bit */
+ tmpccmr2 |= (uint16_t)(TIM_OCFast << 8);
+ /* Write to TIMx CCMR2 */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Clears or safeguards the OCREF1 signal on an external event
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCClear_Enable: TIM Output clear enable
+ * @arg TIM_OCClear_Disable: TIM Output clear disable
+ * @retval None
+ */
+void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));
+
+ tmpccmr1 = TIMx->CCMR1;
+
+ /* Reset the OC1CE Bit */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC1CE);
+ /* Enable or Disable the Output Compare Clear Bit */
+ tmpccmr1 |= TIM_OCClear;
+ /* Write to TIMx CCMR1 register */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Clears or safeguards the OCREF2 signal on an external event
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCClear_Enable: TIM Output clear enable
+ * @arg TIM_OCClear_Disable: TIM Output clear disable
+ * @retval None
+ */
+void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr1 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));
+ tmpccmr1 = TIMx->CCMR1;
+ /* Reset the OC2CE Bit */
+ tmpccmr1 &= (uint16_t)~((uint16_t)TIM_CCMR1_OC2CE);
+ /* Enable or Disable the Output Compare Clear Bit */
+ tmpccmr1 |= (uint16_t)(TIM_OCClear << 8);
+ /* Write to TIMx CCMR1 register */
+ TIMx->CCMR1 = tmpccmr1;
+}
+
+/**
+ * @brief Clears or safeguards the OCREF3 signal on an external event
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCClear_Enable: TIM Output clear enable
+ * @arg TIM_OCClear_Disable: TIM Output clear disable
+ * @retval None
+ */
+void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC3CE Bit */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC3CE);
+ /* Enable or Disable the Output Compare Clear Bit */
+ tmpccmr2 |= TIM_OCClear;
+ /* Write to TIMx CCMR2 register */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Clears or safeguards the OCREF4 signal on an external event
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCClear: new state of the Output Compare Clear Enable Bit.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCClear_Enable: TIM Output clear enable
+ * @arg TIM_OCClear_Disable: TIM Output clear disable
+ * @retval None
+ */
+void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear)
+{
+ uint16_t tmpccmr2 = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OCCLEAR_STATE(TIM_OCClear));
+ tmpccmr2 = TIMx->CCMR2;
+ /* Reset the OC4CE Bit */
+ tmpccmr2 &= (uint16_t)~((uint16_t)TIM_CCMR2_OC4CE);
+ /* Enable or Disable the Output Compare Clear Bit */
+ tmpccmr2 |= (uint16_t)(TIM_OCClear << 8);
+ /* Write to TIMx CCMR2 register */
+ TIMx->CCMR2 = tmpccmr2;
+}
+
+/**
+ * @brief Configures the TIMx channel 1 polarity.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_OCPolarity: specifies the OC1 Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPolarity_High: Output Compare active high
+ * @arg TIM_OCPolarity_Low: Output Compare active low
+ * @retval None
+ */
+void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+ tmpccer = TIMx->CCER;
+ /* Set or Reset the CC1P Bit */
+ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1P);
+ tmpccer |= TIM_OCPolarity;
+ /* Write to TIMx CCER register */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configures the TIMx Channel 1N polarity.
+ * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIM peripheral.
+ * @param TIM_OCNPolarity: specifies the OC1N Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_OCNPolarity_High: Output Compare active high
+ * @arg TIM_OCNPolarity_Low: Output Compare active low
+ * @retval None
+ */
+void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)
+{
+ uint16_t tmpccer = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST2_PERIPH(TIMx));
+ assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity));
+
+ tmpccer = TIMx->CCER;
+ /* Set or Reset the CC1NP Bit */
+ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC1NP);
+ tmpccer |= TIM_OCNPolarity;
+ /* Write to TIMx CCER register */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configures the TIMx channel 2 polarity.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_OCPolarity: specifies the OC2 Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPolarity_High: Output Compare active high
+ * @arg TIM_OCPolarity_Low: Output Compare active low
+ * @retval None
+ */
+void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+ tmpccer = TIMx->CCER;
+ /* Set or Reset the CC2P Bit */
+ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2P);
+ tmpccer |= (uint16_t)(TIM_OCPolarity << 4);
+ /* Write to TIMx CCER register */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configures the TIMx Channel 2N polarity.
+ * @param TIMx: where x can be 1 or 8 to select the TIM peripheral.
+ * @param TIM_OCNPolarity: specifies the OC2N Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_OCNPolarity_High: Output Compare active high
+ * @arg TIM_OCNPolarity_Low: Output Compare active low
+ * @retval None
+ */
+void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)
+{
+ uint16_t tmpccer = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST1_PERIPH(TIMx));
+ assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity));
+
+ tmpccer = TIMx->CCER;
+ /* Set or Reset the CC2NP Bit */
+ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC2NP);
+ tmpccer |= (uint16_t)(TIM_OCNPolarity << 4);
+ /* Write to TIMx CCER register */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configures the TIMx channel 3 polarity.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCPolarity: specifies the OC3 Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPolarity_High: Output Compare active high
+ * @arg TIM_OCPolarity_Low: Output Compare active low
+ * @retval None
+ */
+void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+ tmpccer = TIMx->CCER;
+ /* Set or Reset the CC3P Bit */
+ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3P);
+ tmpccer |= (uint16_t)(TIM_OCPolarity << 8);
+ /* Write to TIMx CCER register */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configures the TIMx Channel 3N polarity.
+ * @param TIMx: where x can be 1 or 8 to select the TIM peripheral.
+ * @param TIM_OCNPolarity: specifies the OC3N Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_OCNPolarity_High: Output Compare active high
+ * @arg TIM_OCNPolarity_Low: Output Compare active low
+ * @retval None
+ */
+void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity)
+{
+ uint16_t tmpccer = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST1_PERIPH(TIMx));
+ assert_param(IS_TIM_OCN_POLARITY(TIM_OCNPolarity));
+
+ tmpccer = TIMx->CCER;
+ /* Set or Reset the CC3NP Bit */
+ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC3NP);
+ tmpccer |= (uint16_t)(TIM_OCNPolarity << 8);
+ /* Write to TIMx CCER register */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configures the TIMx channel 4 polarity.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_OCPolarity: specifies the OC4 Polarity
+ * This parameter can be one of the following values:
+ * @arg TIM_OCPolarity_High: Output Compare active high
+ * @arg TIM_OCPolarity_Low: Output Compare active low
+ * @retval None
+ */
+void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)
+{
+ uint16_t tmpccer = 0;
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_OC_POLARITY(TIM_OCPolarity));
+ tmpccer = TIMx->CCER;
+ /* Set or Reset the CC4P Bit */
+ tmpccer &= (uint16_t)~((uint16_t)TIM_CCER_CC4P);
+ tmpccer |= (uint16_t)(TIM_OCPolarity << 12);
+ /* Write to TIMx CCER register */
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Enables or disables the TIM Capture Compare Channel x.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_Channel: specifies the TIM Channel
+ * This parameter can be one of the following values:
+ * @arg TIM_Channel_1: TIM Channel 1
+ * @arg TIM_Channel_2: TIM Channel 2
+ * @arg TIM_Channel_3: TIM Channel 3
+ * @arg TIM_Channel_4: TIM Channel 4
+ * @param TIM_CCx: specifies the TIM Channel CCxE bit new state.
+ * This parameter can be: TIM_CCx_Enable or TIM_CCx_Disable.
+ * @retval None
+ */
+void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx)
+{
+ uint16_t tmp = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_CHANNEL(TIM_Channel));
+ assert_param(IS_TIM_CCX(TIM_CCx));
+
+ tmp = CCER_CCE_Set << TIM_Channel;
+
+ /* Reset the CCxE Bit */
+ TIMx->CCER &= (uint16_t)~ tmp;
+
+ /* Set or reset the CCxE Bit */
+ TIMx->CCER |= (uint16_t)(TIM_CCx << TIM_Channel);
+}
+
+/**
+ * @brief Enables or disables the TIM Capture Compare Channel xN.
+ * @param TIMx: where x can be 1, 8, 15, 16 or 17 to select the TIM peripheral.
+ * @param TIM_Channel: specifies the TIM Channel
+ * This parameter can be one of the following values:
+ * @arg TIM_Channel_1: TIM Channel 1
+ * @arg TIM_Channel_2: TIM Channel 2
+ * @arg TIM_Channel_3: TIM Channel 3
+ * @param TIM_CCxN: specifies the TIM Channel CCxNE bit new state.
+ * This parameter can be: TIM_CCxN_Enable or TIM_CCxN_Disable.
+ * @retval None
+ */
+void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN)
+{
+ uint16_t tmp = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST2_PERIPH(TIMx));
+ assert_param(IS_TIM_COMPLEMENTARY_CHANNEL(TIM_Channel));
+ assert_param(IS_TIM_CCXN(TIM_CCxN));
+
+ tmp = CCER_CCNE_Set << TIM_Channel;
+
+ /* Reset the CCxNE Bit */
+ TIMx->CCER &= (uint16_t) ~tmp;
+
+ /* Set or reset the CCxNE Bit */
+ TIMx->CCER |= (uint16_t)(TIM_CCxN << TIM_Channel);
+}
+
+/**
+ * @brief Selects the TIM Output Compare Mode.
+ * @note This function disables the selected channel before changing the Output
+ * Compare Mode.
+ * User has to enable this channel using TIM_CCxCmd and TIM_CCxNCmd functions.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_Channel: specifies the TIM Channel
+ * This parameter can be one of the following values:
+ * @arg TIM_Channel_1: TIM Channel 1
+ * @arg TIM_Channel_2: TIM Channel 2
+ * @arg TIM_Channel_3: TIM Channel 3
+ * @arg TIM_Channel_4: TIM Channel 4
+ * @param TIM_OCMode: specifies the TIM Output Compare Mode.
+ * This parameter can be one of the following values:
+ * @arg TIM_OCMode_Timing
+ * @arg TIM_OCMode_Active
+ * @arg TIM_OCMode_Toggle
+ * @arg TIM_OCMode_PWM1
+ * @arg TIM_OCMode_PWM2
+ * @arg TIM_ForcedAction_Active
+ * @arg TIM_ForcedAction_InActive
+ * @retval None
+ */
+void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode)
+{
+ uint32_t tmp = 0;
+ uint16_t tmp1 = 0;
+
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_CHANNEL(TIM_Channel));
+ assert_param(IS_TIM_OCM(TIM_OCMode));
+
+ tmp = (uint32_t) TIMx;
+ tmp += CCMR_Offset;
+
+ tmp1 = CCER_CCE_Set << (uint16_t)TIM_Channel;
+
+ /* Disable the Channel: Reset the CCxE Bit */
+ TIMx->CCER &= (uint16_t) ~tmp1;
+
+ if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3))
+ {
+ tmp += (TIM_Channel>>1);
+
+ /* Reset the OCxM bits in the CCMRx register */
+ *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M);
+
+ /* Configure the OCxM bits in the CCMRx register */
+ *(__IO uint32_t *) tmp |= TIM_OCMode;
+ }
+ else
+ {
+ tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1;
+
+ /* Reset the OCxM bits in the CCMRx register */
+ *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M);
+
+ /* Configure the OCxM bits in the CCMRx register */
+ *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8);
+ }
+}
+
+/**
+ * @brief Enables or Disables the TIMx Update event.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param NewState: new state of the TIMx UDIS bit
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Set the Update Disable Bit */
+ TIMx->CR1 |= TIM_CR1_UDIS;
+ }
+ else
+ {
+ /* Reset the Update Disable Bit */
+ TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_UDIS);
+ }
+}
+
+/**
+ * @brief Configures the TIMx Update Request Interrupt source.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_UpdateSource: specifies the Update source.
+ * This parameter can be one of the following values:
+ * @arg TIM_UpdateSource_Regular: Source of update is the counter overflow/underflow
+ or the setting of UG bit, or an update generation
+ through the slave mode controller.
+ * @arg TIM_UpdateSource_Global: Source of update is counter overflow/underflow.
+ * @retval None
+ */
+void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_UPDATE_SOURCE(TIM_UpdateSource));
+ if (TIM_UpdateSource != TIM_UpdateSource_Global)
+ {
+ /* Set the URS Bit */
+ TIMx->CR1 |= TIM_CR1_URS;
+ }
+ else
+ {
+ /* Reset the URS Bit */
+ TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_URS);
+ }
+}
+
+/**
+ * @brief Enables or disables the TIMx's Hall sensor interface.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param NewState: new state of the TIMx Hall sensor interface.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Set the TI1S Bit */
+ TIMx->CR2 |= TIM_CR2_TI1S;
+ }
+ else
+ {
+ /* Reset the TI1S Bit */
+ TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_TI1S);
+ }
+}
+
+/**
+ * @brief Selects the TIMx's One Pulse Mode.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_OPMode: specifies the OPM Mode to be used.
+ * This parameter can be one of the following values:
+ * @arg TIM_OPMode_Single
+ * @arg TIM_OPMode_Repetitive
+ * @retval None
+ */
+void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_OPM_MODE(TIM_OPMode));
+ /* Reset the OPM Bit */
+ TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_OPM);
+ /* Configure the OPM Mode */
+ TIMx->CR1 |= TIM_OPMode;
+}
+
+/**
+ * @brief Selects the TIMx Trigger Output Mode.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 6, 7, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_TRGOSource: specifies the Trigger Output source.
+ * This paramter can be one of the following values:
+ *
+ * - For all TIMx
+ * @arg TIM_TRGOSource_Reset: The UG bit in the TIM_EGR register is used as the trigger output (TRGO).
+ * @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO).
+ * @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO).
+ *
+ * - For all TIMx except TIM6 and TIM7
+ * @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag
+ * is to be set, as soon as a capture or compare match occurs (TRGO).
+ * @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO).
+ * @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO).
+ * @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO).
+ * @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO).
+ *
+ * @retval None
+ */
+void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST7_PERIPH(TIMx));
+ assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource));
+ /* Reset the MMS Bits */
+ TIMx->CR2 &= (uint16_t)~((uint16_t)TIM_CR2_MMS);
+ /* Select the TRGO source */
+ TIMx->CR2 |= TIM_TRGOSource;
+}
+
+/**
+ * @brief Selects the TIMx Slave Mode.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_SlaveMode: specifies the Timer Slave Mode.
+ * This parameter can be one of the following values:
+ * @arg TIM_SlaveMode_Reset: Rising edge of the selected trigger signal (TRGI) re-initializes
+ * the counter and triggers an update of the registers.
+ * @arg TIM_SlaveMode_Gated: The counter clock is enabled when the trigger signal (TRGI) is high.
+ * @arg TIM_SlaveMode_Trigger: The counter starts at a rising edge of the trigger TRGI.
+ * @arg TIM_SlaveMode_External1: Rising edges of the selected trigger (TRGI) clock the counter.
+ * @retval None
+ */
+void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode));
+ /* Reset the SMS Bits */
+ TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_SMS);
+ /* Select the Slave Mode */
+ TIMx->SMCR |= TIM_SlaveMode;
+}
+
+/**
+ * @brief Sets or Resets the TIMx Master/Slave Mode.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_MasterSlaveMode: specifies the Timer Master Slave Mode.
+ * This parameter can be one of the following values:
+ * @arg TIM_MasterSlaveMode_Enable: synchronization between the current timer
+ * and its slaves (through TRGO).
+ * @arg TIM_MasterSlaveMode_Disable: No action
+ * @retval None
+ */
+void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_MSM_STATE(TIM_MasterSlaveMode));
+ /* Reset the MSM Bit */
+ TIMx->SMCR &= (uint16_t)~((uint16_t)TIM_SMCR_MSM);
+
+ /* Set or Reset the MSM Bit */
+ TIMx->SMCR |= TIM_MasterSlaveMode;
+}
+
+/**
+ * @brief Sets the TIMx Counter Register value
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param Counter: specifies the Counter register new value.
+ * @retval None
+ */
+void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ /* Set the Counter Register value */
+ TIMx->CNT = Counter;
+}
+
+/**
+ * @brief Sets the TIMx Autoreload Register value
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param Autoreload: specifies the Autoreload register new value.
+ * @retval None
+ */
+void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ /* Set the Autoreload Register value */
+ TIMx->ARR = Autoreload;
+}
+
+/**
+ * @brief Sets the TIMx Capture Compare1 Register value
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param Compare1: specifies the Capture Compare1 register new value.
+ * @retval None
+ */
+void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ /* Set the Capture Compare1 Register value */
+ TIMx->CCR1 = Compare1;
+}
+
+/**
+ * @brief Sets the TIMx Capture Compare2 Register value
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param Compare2: specifies the Capture Compare2 register new value.
+ * @retval None
+ */
+void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ /* Set the Capture Compare2 Register value */
+ TIMx->CCR2 = Compare2;
+}
+
+/**
+ * @brief Sets the TIMx Capture Compare3 Register value
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param Compare3: specifies the Capture Compare3 register new value.
+ * @retval None
+ */
+void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ /* Set the Capture Compare3 Register value */
+ TIMx->CCR3 = Compare3;
+}
+
+/**
+ * @brief Sets the TIMx Capture Compare4 Register value
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param Compare4: specifies the Capture Compare4 register new value.
+ * @retval None
+ */
+void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ /* Set the Capture Compare4 Register value */
+ TIMx->CCR4 = Compare4;
+}
+
+/**
+ * @brief Sets the TIMx Input Capture 1 prescaler.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_ICPSC: specifies the Input Capture1 prescaler new value.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPSC_DIV1: no prescaler
+ * @arg TIM_ICPSC_DIV2: capture is done once every 2 events
+ * @arg TIM_ICPSC_DIV4: capture is done once every 4 events
+ * @arg TIM_ICPSC_DIV8: capture is done once every 8 events
+ * @retval None
+ */
+void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));
+ /* Reset the IC1PSC Bits */
+ TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC1PSC);
+ /* Set the IC1PSC value */
+ TIMx->CCMR1 |= TIM_ICPSC;
+}
+
+/**
+ * @brief Sets the TIMx Input Capture 2 prescaler.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_ICPSC: specifies the Input Capture2 prescaler new value.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPSC_DIV1: no prescaler
+ * @arg TIM_ICPSC_DIV2: capture is done once every 2 events
+ * @arg TIM_ICPSC_DIV4: capture is done once every 4 events
+ * @arg TIM_ICPSC_DIV8: capture is done once every 8 events
+ * @retval None
+ */
+void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));
+ /* Reset the IC2PSC Bits */
+ TIMx->CCMR1 &= (uint16_t)~((uint16_t)TIM_CCMR1_IC2PSC);
+ /* Set the IC2PSC value */
+ TIMx->CCMR1 |= (uint16_t)(TIM_ICPSC << 8);
+}
+
+/**
+ * @brief Sets the TIMx Input Capture 3 prescaler.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ICPSC: specifies the Input Capture3 prescaler new value.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPSC_DIV1: no prescaler
+ * @arg TIM_ICPSC_DIV2: capture is done once every 2 events
+ * @arg TIM_ICPSC_DIV4: capture is done once every 4 events
+ * @arg TIM_ICPSC_DIV8: capture is done once every 8 events
+ * @retval None
+ */
+void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));
+ /* Reset the IC3PSC Bits */
+ TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC3PSC);
+ /* Set the IC3PSC value */
+ TIMx->CCMR2 |= TIM_ICPSC;
+}
+
+/**
+ * @brief Sets the TIMx Input Capture 4 prescaler.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ICPSC: specifies the Input Capture4 prescaler new value.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPSC_DIV1: no prescaler
+ * @arg TIM_ICPSC_DIV2: capture is done once every 2 events
+ * @arg TIM_ICPSC_DIV4: capture is done once every 4 events
+ * @arg TIM_ICPSC_DIV8: capture is done once every 8 events
+ * @retval None
+ */
+void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ assert_param(IS_TIM_IC_PRESCALER(TIM_ICPSC));
+ /* Reset the IC4PSC Bits */
+ TIMx->CCMR2 &= (uint16_t)~((uint16_t)TIM_CCMR2_IC4PSC);
+ /* Set the IC4PSC value */
+ TIMx->CCMR2 |= (uint16_t)(TIM_ICPSC << 8);
+}
+
+/**
+ * @brief Sets the TIMx Clock Division value.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select
+ * the TIM peripheral.
+ * @param TIM_CKD: specifies the clock division value.
+ * This parameter can be one of the following value:
+ * @arg TIM_CKD_DIV1: TDTS = Tck_tim
+ * @arg TIM_CKD_DIV2: TDTS = 2*Tck_tim
+ * @arg TIM_CKD_DIV4: TDTS = 4*Tck_tim
+ * @retval None
+ */
+void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ assert_param(IS_TIM_CKD_DIV(TIM_CKD));
+ /* Reset the CKD Bits */
+ TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_CKD);
+ /* Set the CKD value */
+ TIMx->CR1 |= TIM_CKD;
+}
+
+/**
+ * @brief Gets the TIMx Input Capture 1 value.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @retval Capture Compare 1 Register value.
+ */
+uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST8_PERIPH(TIMx));
+ /* Get the Capture 1 Register value */
+ return TIMx->CCR1;
+}
+
+/**
+ * @brief Gets the TIMx Input Capture 2 value.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @retval Capture Compare 2 Register value.
+ */
+uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST6_PERIPH(TIMx));
+ /* Get the Capture 2 Register value */
+ return TIMx->CCR2;
+}
+
+/**
+ * @brief Gets the TIMx Input Capture 3 value.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @retval Capture Compare 3 Register value.
+ */
+uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ /* Get the Capture 3 Register value */
+ return TIMx->CCR3;
+}
+
+/**
+ * @brief Gets the TIMx Input Capture 4 value.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @retval Capture Compare 4 Register value.
+ */
+uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_LIST3_PERIPH(TIMx));
+ /* Get the Capture 4 Register value */
+ return TIMx->CCR4;
+}
+
+/**
+ * @brief Gets the TIMx Counter value.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @retval Counter Register value.
+ */
+uint16_t TIM_GetCounter(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ /* Get the Counter Register value */
+ return TIMx->CNT;
+}
+
+/**
+ * @brief Gets the TIMx Prescaler value.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @retval Prescaler Register value.
+ */
+uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ /* Get the Prescaler Register value */
+ return TIMx->PSC;
+}
+
+/**
+ * @brief Checks whether the specified TIM flag is set or not.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_FLAG: specifies the flag to check.
+ * This parameter can be one of the following values:
+ * @arg TIM_FLAG_Update: TIM update Flag
+ * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag
+ * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag
+ * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag
+ * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag
+ * @arg TIM_FLAG_COM: TIM Commutation Flag
+ * @arg TIM_FLAG_Trigger: TIM Trigger Flag
+ * @arg TIM_FLAG_Break: TIM Break Flag
+ * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag
+ * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag
+ * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag
+ * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag
+ * @note
+ * - TIM6 and TIM7 can have only one update flag.
+ * - TIM9, TIM12 and TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1,
+ * TIM_FLAG_CC2 or TIM_FLAG_Trigger.
+ * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1.
+ * - TIM_FLAG_Break is used only with TIM1, TIM8 and TIM15.
+ * - TIM_FLAG_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17.
+ * @retval The new state of TIM_FLAG (SET or RESET).
+ */
+FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
+{
+ ITStatus bitstatus = RESET;
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_GET_FLAG(TIM_FLAG));
+
+ if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/**
+ * @brief Clears the TIMx's pending flags.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_FLAG: specifies the flag bit to clear.
+ * This parameter can be any combination of the following values:
+ * @arg TIM_FLAG_Update: TIM update Flag
+ * @arg TIM_FLAG_CC1: TIM Capture Compare 1 Flag
+ * @arg TIM_FLAG_CC2: TIM Capture Compare 2 Flag
+ * @arg TIM_FLAG_CC3: TIM Capture Compare 3 Flag
+ * @arg TIM_FLAG_CC4: TIM Capture Compare 4 Flag
+ * @arg TIM_FLAG_COM: TIM Commutation Flag
+ * @arg TIM_FLAG_Trigger: TIM Trigger Flag
+ * @arg TIM_FLAG_Break: TIM Break Flag
+ * @arg TIM_FLAG_CC1OF: TIM Capture Compare 1 overcapture Flag
+ * @arg TIM_FLAG_CC2OF: TIM Capture Compare 2 overcapture Flag
+ * @arg TIM_FLAG_CC3OF: TIM Capture Compare 3 overcapture Flag
+ * @arg TIM_FLAG_CC4OF: TIM Capture Compare 4 overcapture Flag
+ * @note
+ * - TIM6 and TIM7 can have only one update flag.
+ * - TIM9, TIM12 and TIM15 can have only TIM_FLAG_Update, TIM_FLAG_CC1,
+ * TIM_FLAG_CC2 or TIM_FLAG_Trigger.
+ * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_FLAG_Update or TIM_FLAG_CC1.
+ * - TIM_FLAG_Break is used only with TIM1, TIM8 and TIM15.
+ * - TIM_FLAG_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17.
+ * @retval None
+ */
+void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG));
+
+ /* Clear the flags */
+ TIMx->SR = (uint16_t)~TIM_FLAG;
+}
+
+/**
+ * @brief Checks whether the TIM interrupt has occurred or not.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_IT: specifies the TIM interrupt source to check.
+ * This parameter can be one of the following values:
+ * @arg TIM_IT_Update: TIM update Interrupt source
+ * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
+ * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
+ * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
+ * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
+ * @arg TIM_IT_COM: TIM Commutation Interrupt source
+ * @arg TIM_IT_Trigger: TIM Trigger Interrupt source
+ * @arg TIM_IT_Break: TIM Break Interrupt source
+ * @note
+ * - TIM6 and TIM7 can generate only an update interrupt.
+ * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1,
+ * TIM_IT_CC2 or TIM_IT_Trigger.
+ * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1.
+ * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15.
+ * - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17.
+ * @retval The new state of the TIM_IT(SET or RESET).
+ */
+ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
+{
+ ITStatus bitstatus = RESET;
+ uint16_t itstatus = 0x0, itenable = 0x0;
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_GET_IT(TIM_IT));
+
+ itstatus = TIMx->SR & TIM_IT;
+
+ itenable = TIMx->DIER & TIM_IT;
+ if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/**
+ * @brief Clears the TIMx's interrupt pending bits.
+ * @param TIMx: where x can be 1 to 17 to select the TIM peripheral.
+ * @param TIM_IT: specifies the pending bit to clear.
+ * This parameter can be any combination of the following values:
+ * @arg TIM_IT_Update: TIM1 update Interrupt source
+ * @arg TIM_IT_CC1: TIM Capture Compare 1 Interrupt source
+ * @arg TIM_IT_CC2: TIM Capture Compare 2 Interrupt source
+ * @arg TIM_IT_CC3: TIM Capture Compare 3 Interrupt source
+ * @arg TIM_IT_CC4: TIM Capture Compare 4 Interrupt source
+ * @arg TIM_IT_COM: TIM Commutation Interrupt source
+ * @arg TIM_IT_Trigger: TIM Trigger Interrupt source
+ * @arg TIM_IT_Break: TIM Break Interrupt source
+ * @note
+ * - TIM6 and TIM7 can generate only an update interrupt.
+ * - TIM9, TIM12 and TIM15 can have only TIM_IT_Update, TIM_IT_CC1,
+ * TIM_IT_CC2 or TIM_IT_Trigger.
+ * - TIM10, TIM11, TIM13, TIM14, TIM16 and TIM17 can have TIM_IT_Update or TIM_IT_CC1.
+ * - TIM_IT_Break is used only with TIM1, TIM8 and TIM15.
+ * - TIM_IT_COM is used only with TIM1, TIM8, TIM15, TIM16 and TIM17.
+ * @retval None
+ */
+void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
+{
+ /* Check the parameters */
+ assert_param(IS_TIM_ALL_PERIPH(TIMx));
+ assert_param(IS_TIM_IT(TIM_IT));
+ /* Clear the IT pending Bit */
+ TIMx->SR = (uint16_t)~TIM_IT;
+}
+
+/**
+ * @brief Configure the TI1 as Input.
+ * @param TIMx: where x can be 1 to 17 except 6 and 7 to select the TIM peripheral.
+ * @param TIM_ICPolarity : The Input Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPolarity_Rising
+ * @arg TIM_ICPolarity_Falling
+ * @param TIM_ICSelection: specifies the input to be used.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1.
+ * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2.
+ * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC.
+ * @param TIM_ICFilter: Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ * @retval None
+ */
+static void TI1_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr1 = 0, tmpccer = 0;
+ /* Disable the Channel 1: Reset the CC1E Bit */
+ TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC1E);
+ tmpccmr1 = TIMx->CCMR1;
+ tmpccer = TIMx->CCER;
+ /* Select the Input and set the filter */
+ tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC1S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC1F)));
+ tmpccmr1 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4));
+
+ if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) ||
+ (TIMx == TIM4) ||(TIMx == TIM5))
+ {
+ /* Select the Polarity and set the CC1E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E);
+ }
+ else
+ {
+ /* Select the Polarity and set the CC1E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC1P | TIM_CCER_CC1NP));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC1E);
+ }
+
+ /* Write to TIMx CCMR1 and CCER registers */
+ TIMx->CCMR1 = tmpccmr1;
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configure the TI2 as Input.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5, 8, 9, 12 or 15 to select the TIM peripheral.
+ * @param TIM_ICPolarity : The Input Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPolarity_Rising
+ * @arg TIM_ICPolarity_Falling
+ * @param TIM_ICSelection: specifies the input to be used.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2.
+ * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1.
+ * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC.
+ * @param TIM_ICFilter: Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ * @retval None
+ */
+static void TI2_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr1 = 0, tmpccer = 0, tmp = 0;
+ /* Disable the Channel 2: Reset the CC2E Bit */
+ TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC2E);
+ tmpccmr1 = TIMx->CCMR1;
+ tmpccer = TIMx->CCER;
+ tmp = (uint16_t)(TIM_ICPolarity << 4);
+ /* Select the Input and set the filter */
+ tmpccmr1 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR1_CC2S)) & ((uint16_t)~((uint16_t)TIM_CCMR1_IC2F)));
+ tmpccmr1 |= (uint16_t)(TIM_ICFilter << 12);
+ tmpccmr1 |= (uint16_t)(TIM_ICSelection << 8);
+
+ if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) ||
+ (TIMx == TIM4) ||(TIMx == TIM5))
+ {
+ /* Select the Polarity and set the CC2E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P));
+ tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC2E);
+ }
+ else
+ {
+ /* Select the Polarity and set the CC2E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC2P | TIM_CCER_CC2NP));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC2E);
+ }
+
+ /* Write to TIMx CCMR1 and CCER registers */
+ TIMx->CCMR1 = tmpccmr1 ;
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configure the TI3 as Input.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ICPolarity : The Input Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPolarity_Rising
+ * @arg TIM_ICPolarity_Falling
+ * @param TIM_ICSelection: specifies the input to be used.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3.
+ * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4.
+ * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC.
+ * @param TIM_ICFilter: Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ * @retval None
+ */
+static void TI3_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0;
+ /* Disable the Channel 3: Reset the CC3E Bit */
+ TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC3E);
+ tmpccmr2 = TIMx->CCMR2;
+ tmpccer = TIMx->CCER;
+ tmp = (uint16_t)(TIM_ICPolarity << 8);
+ /* Select the Input and set the filter */
+ tmpccmr2 &= (uint16_t)(((uint16_t)~((uint16_t)TIM_CCMR2_CC3S)) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC3F)));
+ tmpccmr2 |= (uint16_t)(TIM_ICSelection | (uint16_t)(TIM_ICFilter << (uint16_t)4));
+
+ if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) ||
+ (TIMx == TIM4) ||(TIMx == TIM5))
+ {
+ /* Select the Polarity and set the CC3E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P));
+ tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC3E);
+ }
+ else
+ {
+ /* Select the Polarity and set the CC3E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC3NP));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC3E);
+ }
+
+ /* Write to TIMx CCMR2 and CCER registers */
+ TIMx->CCMR2 = tmpccmr2;
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @brief Configure the TI4 as Input.
+ * @param TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM peripheral.
+ * @param TIM_ICPolarity : The Input Polarity.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICPolarity_Rising
+ * @arg TIM_ICPolarity_Falling
+ * @param TIM_ICSelection: specifies the input to be used.
+ * This parameter can be one of the following values:
+ * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4.
+ * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3.
+ * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC.
+ * @param TIM_ICFilter: Specifies the Input Capture Filter.
+ * This parameter must be a value between 0x00 and 0x0F.
+ * @retval None
+ */
+static void TI4_Config(TIM_TypeDef* TIMx, uint16_t TIM_ICPolarity, uint16_t TIM_ICSelection,
+ uint16_t TIM_ICFilter)
+{
+ uint16_t tmpccmr2 = 0, tmpccer = 0, tmp = 0;
+
+ /* Disable the Channel 4: Reset the CC4E Bit */
+ TIMx->CCER &= (uint16_t)~((uint16_t)TIM_CCER_CC4E);
+ tmpccmr2 = TIMx->CCMR2;
+ tmpccer = TIMx->CCER;
+ tmp = (uint16_t)(TIM_ICPolarity << 12);
+ /* Select the Input and set the filter */
+ tmpccmr2 &= (uint16_t)((uint16_t)(~(uint16_t)TIM_CCMR2_CC4S) & ((uint16_t)~((uint16_t)TIM_CCMR2_IC4F)));
+ tmpccmr2 |= (uint16_t)(TIM_ICSelection << 8);
+ tmpccmr2 |= (uint16_t)(TIM_ICFilter << 12);
+
+ if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) ||
+ (TIMx == TIM4) ||(TIMx == TIM5))
+ {
+ /* Select the Polarity and set the CC4E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC4P));
+ tmpccer |= (uint16_t)(tmp | (uint16_t)TIM_CCER_CC4E);
+ }
+ else
+ {
+ /* Select the Polarity and set the CC4E Bit */
+ tmpccer &= (uint16_t)~((uint16_t)(TIM_CCER_CC3P | TIM_CCER_CC4NP));
+ tmpccer |= (uint16_t)(TIM_ICPolarity | (uint16_t)TIM_CCER_CC4E);
+ }
+ /* Write to TIMx CCMR2 and CCER registers */
+ TIMx->CCMR2 = tmpccmr2;
+ TIMx->CCER = tmpccer;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_usart.c b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_usart.c
new file mode 100644
index 0000000..e794eae
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_usart.c
@@ -0,0 +1,1058 @@
+/**
+ ******************************************************************************
+ * @file stm32f10x_usart.c
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 11-March-2011
+ * @brief This file provides all the USART firmware functions.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
+ ******************************************************************************
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f10x_usart.h"
+#include "stm32f10x_rcc.h"
+
+/** @addtogroup STM32F10x_StdPeriph_Driver
+ * @{
+ */
+
+/** @defgroup USART
+ * @brief USART driver modules
+ * @{
+ */
+
+/** @defgroup USART_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USART_Private_Defines
+ * @{
+ */
+
+#define CR1_UE_Set ((uint16_t)0x2000) /*!< USART Enable Mask */
+#define CR1_UE_Reset ((uint16_t)0xDFFF) /*!< USART Disable Mask */
+
+#define CR1_WAKE_Mask ((uint16_t)0xF7FF) /*!< USART WakeUp Method Mask */
+
+#define CR1_RWU_Set ((uint16_t)0x0002) /*!< USART mute mode Enable Mask */
+#define CR1_RWU_Reset ((uint16_t)0xFFFD) /*!< USART mute mode Enable Mask */
+#define CR1_SBK_Set ((uint16_t)0x0001) /*!< USART Break Character send Mask */
+#define CR1_CLEAR_Mask ((uint16_t)0xE9F3) /*!< USART CR1 Mask */
+#define CR2_Address_Mask ((uint16_t)0xFFF0) /*!< USART address Mask */
+
+#define CR2_LINEN_Set ((uint16_t)0x4000) /*!< USART LIN Enable Mask */
+#define CR2_LINEN_Reset ((uint16_t)0xBFFF) /*!< USART LIN Disable Mask */
+
+#define CR2_LBDL_Mask ((uint16_t)0xFFDF) /*!< USART LIN Break detection Mask */
+#define CR2_STOP_CLEAR_Mask ((uint16_t)0xCFFF) /*!< USART CR2 STOP Bits Mask */
+#define CR2_CLOCK_CLEAR_Mask ((uint16_t)0xF0FF) /*!< USART CR2 Clock Mask */
+
+#define CR3_SCEN_Set ((uint16_t)0x0020) /*!< USART SC Enable Mask */
+#define CR3_SCEN_Reset ((uint16_t)0xFFDF) /*!< USART SC Disable Mask */
+
+#define CR3_NACK_Set ((uint16_t)0x0010) /*!< USART SC NACK Enable Mask */
+#define CR3_NACK_Reset ((uint16_t)0xFFEF) /*!< USART SC NACK Disable Mask */
+
+#define CR3_HDSEL_Set ((uint16_t)0x0008) /*!< USART Half-Duplex Enable Mask */
+#define CR3_HDSEL_Reset ((uint16_t)0xFFF7) /*!< USART Half-Duplex Disable Mask */
+
+#define CR3_IRLP_Mask ((uint16_t)0xFFFB) /*!< USART IrDA LowPower mode Mask */
+#define CR3_CLEAR_Mask ((uint16_t)0xFCFF) /*!< USART CR3 Mask */
+
+#define CR3_IREN_Set ((uint16_t)0x0002) /*!< USART IrDA Enable Mask */
+#define CR3_IREN_Reset ((uint16_t)0xFFFD) /*!< USART IrDA Disable Mask */
+#define GTPR_LSB_Mask ((uint16_t)0x00FF) /*!< Guard Time Register LSB Mask */
+#define GTPR_MSB_Mask ((uint16_t)0xFF00) /*!< Guard Time Register MSB Mask */
+#define IT_Mask ((uint16_t)0x001F) /*!< USART Interrupt Mask */
+
+/* USART OverSampling-8 Mask */
+#define CR1_OVER8_Set ((u16)0x8000) /* USART OVER8 mode Enable Mask */
+#define CR1_OVER8_Reset ((u16)0x7FFF) /* USART OVER8 mode Disable Mask */
+
+/* USART One Bit Sampling Mask */
+#define CR3_ONEBITE_Set ((u16)0x0800) /* USART ONEBITE mode Enable Mask */
+#define CR3_ONEBITE_Reset ((u16)0xF7FF) /* USART ONEBITE mode Disable Mask */
+
+/**
+ * @}
+ */
+
+/** @defgroup USART_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USART_Private_Variables
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USART_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup USART_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Deinitializes the USARTx peripheral registers to their default reset values.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @retval None
+ */
+void USART_DeInit(USART_TypeDef* USARTx)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+
+ if (USARTx == USART1)
+ {
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);
+ RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);
+ }
+ else if (USARTx == USART2)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
+ }
+ else if (USARTx == USART3)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
+ }
+ else if (USARTx == UART4)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE);
+ }
+ else
+ {
+ if (USARTx == UART5)
+ {
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE);
+ RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE);
+ }
+ }
+}
+
+/**
+ * @brief Initializes the USARTx peripheral according to the specified
+ * parameters in the USART_InitStruct .
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_InitStruct: pointer to a USART_InitTypeDef structure
+ * that contains the configuration information for the specified USART
+ * peripheral.
+ * @retval None
+ */
+void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
+{
+ uint32_t tmpreg = 0x00, apbclock = 0x00;
+ uint32_t integerdivider = 0x00;
+ uint32_t fractionaldivider = 0x00;
+ uint32_t usartxbase = 0;
+ RCC_ClocksTypeDef RCC_ClocksStatus;
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_BAUDRATE(USART_InitStruct->USART_BaudRate));
+ assert_param(IS_USART_WORD_LENGTH(USART_InitStruct->USART_WordLength));
+ assert_param(IS_USART_STOPBITS(USART_InitStruct->USART_StopBits));
+ assert_param(IS_USART_PARITY(USART_InitStruct->USART_Parity));
+ assert_param(IS_USART_MODE(USART_InitStruct->USART_Mode));
+ assert_param(IS_USART_HARDWARE_FLOW_CONTROL(USART_InitStruct->USART_HardwareFlowControl));
+ /* The hardware flow control is available only for USART1, USART2 and USART3 */
+ if (USART_InitStruct->USART_HardwareFlowControl != USART_HardwareFlowControl_None)
+ {
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ }
+
+ usartxbase = (uint32_t)USARTx;
+
+/*---------------------------- USART CR2 Configuration -----------------------*/
+ tmpreg = USARTx->CR2;
+ /* Clear STOP[13:12] bits */
+ tmpreg &= CR2_STOP_CLEAR_Mask;
+ /* Configure the USART Stop Bits, Clock, CPOL, CPHA and LastBit ------------*/
+ /* Set STOP[13:12] bits according to USART_StopBits value */
+ tmpreg |= (uint32_t)USART_InitStruct->USART_StopBits;
+
+ /* Write to USART CR2 */
+ USARTx->CR2 = (uint16_t)tmpreg;
+
+/*---------------------------- USART CR1 Configuration -----------------------*/
+ tmpreg = USARTx->CR1;
+ /* Clear M, PCE, PS, TE and RE bits */
+ tmpreg &= CR1_CLEAR_Mask;
+ /* Configure the USART Word Length, Parity and mode ----------------------- */
+ /* Set the M bits according to USART_WordLength value */
+ /* Set PCE and PS bits according to USART_Parity value */
+ /* Set TE and RE bits according to USART_Mode value */
+ tmpreg |= (uint32_t)USART_InitStruct->USART_WordLength | USART_InitStruct->USART_Parity |
+ USART_InitStruct->USART_Mode;
+ /* Write to USART CR1 */
+ USARTx->CR1 = (uint16_t)tmpreg;
+
+/*---------------------------- USART CR3 Configuration -----------------------*/
+ tmpreg = USARTx->CR3;
+ /* Clear CTSE and RTSE bits */
+ tmpreg &= CR3_CLEAR_Mask;
+ /* Configure the USART HFC -------------------------------------------------*/
+ /* Set CTSE and RTSE bits according to USART_HardwareFlowControl value */
+ tmpreg |= USART_InitStruct->USART_HardwareFlowControl;
+ /* Write to USART CR3 */
+ USARTx->CR3 = (uint16_t)tmpreg;
+
+/*---------------------------- USART BRR Configuration -----------------------*/
+ /* Configure the USART Baud Rate -------------------------------------------*/
+ RCC_GetClocksFreq(&RCC_ClocksStatus);
+ if (usartxbase == USART1_BASE)
+ {
+ apbclock = RCC_ClocksStatus.PCLK2_Frequency;
+ }
+ else
+ {
+ apbclock = RCC_ClocksStatus.PCLK1_Frequency;
+ }
+
+ /* Determine the integer part */
+ if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
+ {
+ /* Integer part computing in case Oversampling mode is 8 Samples */
+ integerdivider = ((25 * apbclock) / (2 * (USART_InitStruct->USART_BaudRate)));
+ }
+ else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
+ {
+ /* Integer part computing in case Oversampling mode is 16 Samples */
+ integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));
+ }
+ tmpreg = (integerdivider / 100) << 4;
+
+ /* Determine the fractional part */
+ fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
+
+ /* Implement the fractional part in the register */
+ if ((USARTx->CR1 & CR1_OVER8_Set) != 0)
+ {
+ tmpreg |= ((((fractionaldivider * 8) + 50) / 100)) & ((uint8_t)0x07);
+ }
+ else /* if ((USARTx->CR1 & CR1_OVER8_Set) == 0) */
+ {
+ tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
+ }
+
+ /* Write to USART BRR */
+ USARTx->BRR = (uint16_t)tmpreg;
+}
+
+/**
+ * @brief Fills each USART_InitStruct member with its default value.
+ * @param USART_InitStruct: pointer to a USART_InitTypeDef structure
+ * which will be initialized.
+ * @retval None
+ */
+void USART_StructInit(USART_InitTypeDef* USART_InitStruct)
+{
+ /* USART_InitStruct members default value */
+ USART_InitStruct->USART_BaudRate = 9600;
+ USART_InitStruct->USART_WordLength = USART_WordLength_8b;
+ USART_InitStruct->USART_StopBits = USART_StopBits_1;
+ USART_InitStruct->USART_Parity = USART_Parity_No ;
+ USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
+ USART_InitStruct->USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+}
+
+/**
+ * @brief Initializes the USARTx peripheral Clock according to the
+ * specified parameters in the USART_ClockInitStruct .
+ * @param USARTx: where x can be 1, 2, 3 to select the USART peripheral.
+ * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef
+ * structure that contains the configuration information for the specified
+ * USART peripheral.
+ * @note The Smart Card and Synchronous modes are not available for UART4 and UART5.
+ * @retval None
+ */
+void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct)
+{
+ uint32_t tmpreg = 0x00;
+ /* Check the parameters */
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ assert_param(IS_USART_CLOCK(USART_ClockInitStruct->USART_Clock));
+ assert_param(IS_USART_CPOL(USART_ClockInitStruct->USART_CPOL));
+ assert_param(IS_USART_CPHA(USART_ClockInitStruct->USART_CPHA));
+ assert_param(IS_USART_LASTBIT(USART_ClockInitStruct->USART_LastBit));
+
+/*---------------------------- USART CR2 Configuration -----------------------*/
+ tmpreg = USARTx->CR2;
+ /* Clear CLKEN, CPOL, CPHA and LBCL bits */
+ tmpreg &= CR2_CLOCK_CLEAR_Mask;
+ /* Configure the USART Clock, CPOL, CPHA and LastBit ------------*/
+ /* Set CLKEN bit according to USART_Clock value */
+ /* Set CPOL bit according to USART_CPOL value */
+ /* Set CPHA bit according to USART_CPHA value */
+ /* Set LBCL bit according to USART_LastBit value */
+ tmpreg |= (uint32_t)USART_ClockInitStruct->USART_Clock | USART_ClockInitStruct->USART_CPOL |
+ USART_ClockInitStruct->USART_CPHA | USART_ClockInitStruct->USART_LastBit;
+ /* Write to USART CR2 */
+ USARTx->CR2 = (uint16_t)tmpreg;
+}
+
+/**
+ * @brief Fills each USART_ClockInitStruct member with its default value.
+ * @param USART_ClockInitStruct: pointer to a USART_ClockInitTypeDef
+ * structure which will be initialized.
+ * @retval None
+ */
+void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct)
+{
+ /* USART_ClockInitStruct members default value */
+ USART_ClockInitStruct->USART_Clock = USART_Clock_Disable;
+ USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low;
+ USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge;
+ USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable;
+}
+
+/**
+ * @brief Enables or disables the specified USART peripheral.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param NewState: new state of the USARTx peripheral.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the selected USART by setting the UE bit in the CR1 register */
+ USARTx->CR1 |= CR1_UE_Set;
+ }
+ else
+ {
+ /* Disable the selected USART by clearing the UE bit in the CR1 register */
+ USARTx->CR1 &= CR1_UE_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the specified USART interrupts.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled.
+ * This parameter can be one of the following values:
+ * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5)
+ * @arg USART_IT_LBD: LIN Break detection interrupt
+ * @arg USART_IT_TXE: Transmit Data Register empty interrupt
+ * @arg USART_IT_TC: Transmission complete interrupt
+ * @arg USART_IT_RXNE: Receive Data register not empty interrupt
+ * @arg USART_IT_IDLE: Idle line detection interrupt
+ * @arg USART_IT_PE: Parity Error interrupt
+ * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error)
+ * @param NewState: new state of the specified USARTx interrupts.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
+{
+ uint32_t usartreg = 0x00, itpos = 0x00, itmask = 0x00;
+ uint32_t usartxbase = 0x00;
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_CONFIG_IT(USART_IT));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ /* The CTS interrupt is not available for UART4 and UART5 */
+ if (USART_IT == USART_IT_CTS)
+ {
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ }
+
+ usartxbase = (uint32_t)USARTx;
+
+ /* Get the USART register index */
+ usartreg = (((uint8_t)USART_IT) >> 0x05);
+
+ /* Get the interrupt position */
+ itpos = USART_IT & IT_Mask;
+ itmask = (((uint32_t)0x01) << itpos);
+
+ if (usartreg == 0x01) /* The IT is in CR1 register */
+ {
+ usartxbase += 0x0C;
+ }
+ else if (usartreg == 0x02) /* The IT is in CR2 register */
+ {
+ usartxbase += 0x10;
+ }
+ else /* The IT is in CR3 register */
+ {
+ usartxbase += 0x14;
+ }
+ if (NewState != DISABLE)
+ {
+ *(__IO uint32_t*)usartxbase |= itmask;
+ }
+ else
+ {
+ *(__IO uint32_t*)usartxbase &= ~itmask;
+ }
+}
+
+/**
+ * @brief Enables or disables the USART抯 DMA interface.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_DMAReq: specifies the DMA request.
+ * This parameter can be any combination of the following values:
+ * @arg USART_DMAReq_Tx: USART DMA transmit request
+ * @arg USART_DMAReq_Rx: USART DMA receive request
+ * @param NewState: new state of the DMA Request sources.
+ * This parameter can be: ENABLE or DISABLE.
+ * @note The DMA mode is not available for UART5 except in the STM32
+ * High density value line devices(STM32F10X_HD_VL).
+ * @retval None
+ */
+void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_DMAREQ(USART_DMAReq));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the DMA transfer for selected requests by setting the DMAT and/or
+ DMAR bits in the USART CR3 register */
+ USARTx->CR3 |= USART_DMAReq;
+ }
+ else
+ {
+ /* Disable the DMA transfer for selected requests by clearing the DMAT and/or
+ DMAR bits in the USART CR3 register */
+ USARTx->CR3 &= (uint16_t)~USART_DMAReq;
+ }
+}
+
+/**
+ * @brief Sets the address of the USART node.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_Address: Indicates the address of the USART node.
+ * @retval None
+ */
+void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_ADDRESS(USART_Address));
+
+ /* Clear the USART address */
+ USARTx->CR2 &= CR2_Address_Mask;
+ /* Set the USART address node */
+ USARTx->CR2 |= USART_Address;
+}
+
+/**
+ * @brief Selects the USART WakeUp method.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_WakeUp: specifies the USART wakeup method.
+ * This parameter can be one of the following values:
+ * @arg USART_WakeUp_IdleLine: WakeUp by an idle line detection
+ * @arg USART_WakeUp_AddressMark: WakeUp by an address mark
+ * @retval None
+ */
+void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_WAKEUP(USART_WakeUp));
+
+ USARTx->CR1 &= CR1_WAKE_Mask;
+ USARTx->CR1 |= USART_WakeUp;
+}
+
+/**
+ * @brief Determines if the USART is in mute mode or not.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param NewState: new state of the USART mute mode.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the USART mute mode by setting the RWU bit in the CR1 register */
+ USARTx->CR1 |= CR1_RWU_Set;
+ }
+ else
+ {
+ /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */
+ USARTx->CR1 &= CR1_RWU_Reset;
+ }
+}
+
+/**
+ * @brief Sets the USART LIN Break detection length.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_LINBreakDetectLength: specifies the LIN break detection length.
+ * This parameter can be one of the following values:
+ * @arg USART_LINBreakDetectLength_10b: 10-bit break detection
+ * @arg USART_LINBreakDetectLength_11b: 11-bit break detection
+ * @retval None
+ */
+void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t USART_LINBreakDetectLength)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_LIN_BREAK_DETECT_LENGTH(USART_LINBreakDetectLength));
+
+ USARTx->CR2 &= CR2_LBDL_Mask;
+ USARTx->CR2 |= USART_LINBreakDetectLength;
+}
+
+/**
+ * @brief Enables or disables the USART抯 LIN mode.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param NewState: new state of the USART LIN mode.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the LIN mode by setting the LINEN bit in the CR2 register */
+ USARTx->CR2 |= CR2_LINEN_Set;
+ }
+ else
+ {
+ /* Disable the LIN mode by clearing the LINEN bit in the CR2 register */
+ USARTx->CR2 &= CR2_LINEN_Reset;
+ }
+}
+
+/**
+ * @brief Transmits single data through the USARTx peripheral.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param Data: the data to transmit.
+ * @retval None
+ */
+void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_DATA(Data));
+
+ /* Transmit Data */
+ USARTx->DR = (Data & (uint16_t)0x01FF);
+}
+
+/**
+ * @brief Returns the most recent received data by the USARTx peripheral.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @retval The received data.
+ */
+uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+
+ /* Receive Data */
+ return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
+}
+
+/**
+ * @brief Transmits break characters.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @retval None
+ */
+void USART_SendBreak(USART_TypeDef* USARTx)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+
+ /* Send break characters */
+ USARTx->CR1 |= CR1_SBK_Set;
+}
+
+/**
+ * @brief Sets the specified USART guard time.
+ * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral.
+ * @param USART_GuardTime: specifies the guard time.
+ * @note The guard time bits are not available for UART4 and UART5.
+ * @retval None
+ */
+void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t USART_GuardTime)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_123_PERIPH(USARTx));
+
+ /* Clear the USART Guard time */
+ USARTx->GTPR &= GTPR_LSB_Mask;
+ /* Set the USART guard time */
+ USARTx->GTPR |= (uint16_t)((uint16_t)USART_GuardTime << 0x08);
+}
+
+/**
+ * @brief Sets the system clock prescaler.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_Prescaler: specifies the prescaler clock.
+ * @note The function is used for IrDA mode with UART4 and UART5.
+ * @retval None
+ */
+void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t USART_Prescaler)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+
+ /* Clear the USART prescaler */
+ USARTx->GTPR &= GTPR_MSB_Mask;
+ /* Set the USART prescaler */
+ USARTx->GTPR |= USART_Prescaler;
+}
+
+/**
+ * @brief Enables or disables the USART抯 Smart Card mode.
+ * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral.
+ * @param NewState: new state of the Smart Card mode.
+ * This parameter can be: ENABLE or DISABLE.
+ * @note The Smart Card mode is not available for UART4 and UART5.
+ * @retval None
+ */
+void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the SC mode by setting the SCEN bit in the CR3 register */
+ USARTx->CR3 |= CR3_SCEN_Set;
+ }
+ else
+ {
+ /* Disable the SC mode by clearing the SCEN bit in the CR3 register */
+ USARTx->CR3 &= CR3_SCEN_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables NACK transmission.
+ * @param USARTx: where x can be 1, 2 or 3 to select the USART peripheral.
+ * @param NewState: new state of the NACK transmission.
+ * This parameter can be: ENABLE or DISABLE.
+ * @note The Smart Card mode is not available for UART4 and UART5.
+ * @retval None
+ */
+void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+ if (NewState != DISABLE)
+ {
+ /* Enable the NACK transmission by setting the NACK bit in the CR3 register */
+ USARTx->CR3 |= CR3_NACK_Set;
+ }
+ else
+ {
+ /* Disable the NACK transmission by clearing the NACK bit in the CR3 register */
+ USARTx->CR3 &= CR3_NACK_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the USART抯 Half Duplex communication.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param NewState: new state of the USART Communication.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */
+ USARTx->CR3 |= CR3_HDSEL_Set;
+ }
+ else
+ {
+ /* Disable the Half-Duplex mode by clearing the HDSEL bit in the CR3 register */
+ USARTx->CR3 &= CR3_HDSEL_Reset;
+ }
+}
+
+
+/**
+ * @brief Enables or disables the USART's 8x oversampling mode.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param NewState: new state of the USART one bit sampling method.
+ * This parameter can be: ENABLE or DISABLE.
+ * @note
+ * This function has to be called before calling USART_Init()
+ * function in order to have correct baudrate Divider value.
+ * @retval None
+ */
+void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the 8x Oversampling mode by setting the OVER8 bit in the CR1 register */
+ USARTx->CR1 |= CR1_OVER8_Set;
+ }
+ else
+ {
+ /* Disable the 8x Oversampling mode by clearing the OVER8 bit in the CR1 register */
+ USARTx->CR1 &= CR1_OVER8_Reset;
+ }
+}
+
+/**
+ * @brief Enables or disables the USART's one bit sampling method.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param NewState: new state of the USART one bit sampling method.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the one bit method by setting the ONEBITE bit in the CR3 register */
+ USARTx->CR3 |= CR3_ONEBITE_Set;
+ }
+ else
+ {
+ /* Disable tthe one bit method by clearing the ONEBITE bit in the CR3 register */
+ USARTx->CR3 &= CR3_ONEBITE_Reset;
+ }
+}
+
+/**
+ * @brief Configures the USART's IrDA interface.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_IrDAMode: specifies the IrDA mode.
+ * This parameter can be one of the following values:
+ * @arg USART_IrDAMode_LowPower
+ * @arg USART_IrDAMode_Normal
+ * @retval None
+ */
+void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_IRDA_MODE(USART_IrDAMode));
+
+ USARTx->CR3 &= CR3_IRLP_Mask;
+ USARTx->CR3 |= USART_IrDAMode;
+}
+
+/**
+ * @brief Enables or disables the USART's IrDA interface.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param NewState: new state of the IrDA mode.
+ * This parameter can be: ENABLE or DISABLE.
+ * @retval None
+ */
+void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_FUNCTIONAL_STATE(NewState));
+
+ if (NewState != DISABLE)
+ {
+ /* Enable the IrDA mode by setting the IREN bit in the CR3 register */
+ USARTx->CR3 |= CR3_IREN_Set;
+ }
+ else
+ {
+ /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */
+ USARTx->CR3 &= CR3_IREN_Reset;
+ }
+}
+
+/**
+ * @brief Checks whether the specified USART flag is set or not.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_FLAG: specifies the flag to check.
+ * This parameter can be one of the following values:
+ * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5)
+ * @arg USART_FLAG_LBD: LIN Break detection flag
+ * @arg USART_FLAG_TXE: Transmit data register empty flag
+ * @arg USART_FLAG_TC: Transmission Complete flag
+ * @arg USART_FLAG_RXNE: Receive data register not empty flag
+ * @arg USART_FLAG_IDLE: Idle Line detection flag
+ * @arg USART_FLAG_ORE: OverRun Error flag
+ * @arg USART_FLAG_NE: Noise Error flag
+ * @arg USART_FLAG_FE: Framing Error flag
+ * @arg USART_FLAG_PE: Parity Error flag
+ * @retval The new state of USART_FLAG (SET or RESET).
+ */
+FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
+{
+ FlagStatus bitstatus = RESET;
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_FLAG(USART_FLAG));
+ /* The CTS flag is not available for UART4 and UART5 */
+ if (USART_FLAG == USART_FLAG_CTS)
+ {
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ }
+
+ if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+ return bitstatus;
+}
+
+/**
+ * @brief Clears the USARTx's pending flags.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_FLAG: specifies the flag to clear.
+ * This parameter can be any combination of the following values:
+ * @arg USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5).
+ * @arg USART_FLAG_LBD: LIN Break detection flag.
+ * @arg USART_FLAG_TC: Transmission Complete flag.
+ * @arg USART_FLAG_RXNE: Receive data register not empty flag.
+ *
+ * @note
+ * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun
+ * error) and IDLE (Idle line detected) flags are cleared by software
+ * sequence: a read operation to USART_SR register (USART_GetFlagStatus())
+ * followed by a read operation to USART_DR register (USART_ReceiveData()).
+ * - RXNE flag can be also cleared by a read to the USART_DR register
+ * (USART_ReceiveData()).
+ * - TC flag can be also cleared by software sequence: a read operation to
+ * USART_SR register (USART_GetFlagStatus()) followed by a write operation
+ * to USART_DR register (USART_SendData()).
+ * - TXE flag is cleared only by a write to the USART_DR register
+ * (USART_SendData()).
+ * @retval None
+ */
+void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)
+{
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_CLEAR_FLAG(USART_FLAG));
+ /* The CTS flag is not available for UART4 and UART5 */
+ if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS)
+ {
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ }
+
+ USARTx->SR = (uint16_t)~USART_FLAG;
+}
+
+/**
+ * @brief Checks whether the specified USART interrupt has occurred or not.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_IT: specifies the USART interrupt source to check.
+ * This parameter can be one of the following values:
+ * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5)
+ * @arg USART_IT_LBD: LIN Break detection interrupt
+ * @arg USART_IT_TXE: Tansmit Data Register empty interrupt
+ * @arg USART_IT_TC: Transmission complete interrupt
+ * @arg USART_IT_RXNE: Receive Data register not empty interrupt
+ * @arg USART_IT_IDLE: Idle line detection interrupt
+ * @arg USART_IT_ORE: OverRun Error interrupt
+ * @arg USART_IT_NE: Noise Error interrupt
+ * @arg USART_IT_FE: Framing Error interrupt
+ * @arg USART_IT_PE: Parity Error interrupt
+ * @retval The new state of USART_IT (SET or RESET).
+ */
+ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
+{
+ uint32_t bitpos = 0x00, itmask = 0x00, usartreg = 0x00;
+ ITStatus bitstatus = RESET;
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_GET_IT(USART_IT));
+ /* The CTS interrupt is not available for UART4 and UART5 */
+ if (USART_IT == USART_IT_CTS)
+ {
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ }
+
+ /* Get the USART register index */
+ usartreg = (((uint8_t)USART_IT) >> 0x05);
+ /* Get the interrupt position */
+ itmask = USART_IT & IT_Mask;
+ itmask = (uint32_t)0x01 << itmask;
+
+ if (usartreg == 0x01) /* The IT is in CR1 register */
+ {
+ itmask &= USARTx->CR1;
+ }
+ else if (usartreg == 0x02) /* The IT is in CR2 register */
+ {
+ itmask &= USARTx->CR2;
+ }
+ else /* The IT is in CR3 register */
+ {
+ itmask &= USARTx->CR3;
+ }
+
+ bitpos = USART_IT >> 0x08;
+ bitpos = (uint32_t)0x01 << bitpos;
+ bitpos &= USARTx->SR;
+ if ((itmask != (uint16_t)RESET)&&(bitpos != (uint16_t)RESET))
+ {
+ bitstatus = SET;
+ }
+ else
+ {
+ bitstatus = RESET;
+ }
+
+ return bitstatus;
+}
+
+/**
+ * @brief Clears the USARTx's interrupt pending bits.
+ * @param USARTx: Select the USART or the UART peripheral.
+ * This parameter can be one of the following values:
+ * USART1, USART2, USART3, UART4 or UART5.
+ * @param USART_IT: specifies the interrupt pending bit to clear.
+ * This parameter can be one of the following values:
+ * @arg USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5)
+ * @arg USART_IT_LBD: LIN Break detection interrupt
+ * @arg USART_IT_TC: Transmission complete interrupt.
+ * @arg USART_IT_RXNE: Receive Data register not empty interrupt.
+ *
+ * @note
+ * - PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun
+ * error) and IDLE (Idle line detected) pending bits are cleared by
+ * software sequence: a read operation to USART_SR register
+ * (USART_GetITStatus()) followed by a read operation to USART_DR register
+ * (USART_ReceiveData()).
+ * - RXNE pending bit can be also cleared by a read to the USART_DR register
+ * (USART_ReceiveData()).
+ * - TC pending bit can be also cleared by software sequence: a read
+ * operation to USART_SR register (USART_GetITStatus()) followed by a write
+ * operation to USART_DR register (USART_SendData()).
+ * - TXE pending bit is cleared only by a write to the USART_DR register
+ * (USART_SendData()).
+ * @retval None
+ */
+void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
+{
+ uint16_t bitpos = 0x00, itmask = 0x00;
+ /* Check the parameters */
+ assert_param(IS_USART_ALL_PERIPH(USARTx));
+ assert_param(IS_USART_CLEAR_IT(USART_IT));
+ /* The CTS interrupt is not available for UART4 and UART5 */
+ if (USART_IT == USART_IT_CTS)
+ {
+ assert_param(IS_USART_123_PERIPH(USARTx));
+ }
+
+ bitpos = USART_IT >> 0x08;
+ itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
+ USARTx->SR = (uint16_t)~itmask;
+}
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_wwdg.c b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_wwdg.c
new file mode 100644
index 0000000..4a901e4
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_lib/src/stm32f10x_wwdg.c
@@ -0,0 +1,224 @@
+/**
+ ******************************************************************************
+ * @file stm32f10x_wwdg.c
+ * @author MCD Application Team
+ * @version V3.5.0
+ * @date 11-March-2011
+ * @brief This file provides all the WWDG firmware functions.
+ ******************************************************************************
+ * @attention
+ *
+ * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
+ * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
+ * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
+ * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
+ * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
+ * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_CORE_H
+#define __USB_CORE_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+typedef enum _CONTROL_STATE
+{
+ WAIT_SETUP, /* 0 */
+ SETTING_UP, /* 1 */
+ IN_DATA, /* 2 */
+ OUT_DATA, /* 3 */
+ LAST_IN_DATA, /* 4 */
+ LAST_OUT_DATA, /* 5 */
+ WAIT_STATUS_IN, /* 7 */
+ WAIT_STATUS_OUT, /* 8 */
+ STALLED, /* 9 */
+ PAUSE /* 10 */
+} CONTROL_STATE; /* The state machine states of a control pipe */
+
+typedef struct OneDescriptor
+{
+ uint8_t *Descriptor;
+ uint16_t Descriptor_Size;
+}
+ONE_DESCRIPTOR, *PONE_DESCRIPTOR;
+/* All the request process routines return a value of this type
+ If the return value is not SUCCESS or NOT_READY,
+ the software will STALL the correspond endpoint */
+typedef enum _RESULT
+{
+ USB_SUCCESS = 0, /* Process successfully */
+ USB_ERROR,
+ USB_UNSUPPORT,
+ USB_NOT_READY /* The process has not been finished, endpoint will be
+ NAK to further request */
+} RESULT;
+
+
+/*-*-*-*-*-*-*-*-*-*-* Definitions for endpoint level -*-*-*-*-*-*-*-*-*-*-*-*/
+typedef struct _ENDPOINT_INFO
+{
+ /* When send data out of the device,
+ CopyData() is used to get data buffer 'Length' bytes data
+ if Length is 0,
+ CopyData() returns the total length of the data
+ if the request is not supported, returns 0
+ (NEW Feature )
+ if CopyData() returns -1, the calling routine should not proceed
+ further and will resume the SETUP process by the class device
+ if Length is not 0,
+ CopyData() returns a pointer to indicate the data location
+ Usb_wLength is the data remain to be sent,
+ Usb_wOffset is the Offset of original data
+ When receive data from the host,
+ CopyData() is used to get user data buffer which is capable
+ of Length bytes data to copy data from the endpoint buffer.
+ if Length is 0,
+ CopyData() returns the available data length,
+ if Length is not 0,
+ CopyData() returns user buffer address
+ Usb_rLength is the data remain to be received,
+ Usb_rPointer is the Offset of data buffer
+ */
+ uint16_t Usb_wLength;
+ uint16_t Usb_wOffset;
+ uint16_t PacketSize;
+ uint8_t *(*CopyData)(uint16_t Length);
+}ENDPOINT_INFO;
+
+/*-*-*-*-*-*-*-*-*-*-*-* Definitions for device level -*-*-*-*-*-*-*-*-*-*-*-*/
+
+typedef struct _DEVICE
+{
+ uint8_t Total_Endpoint; /* Number of endpoints that are used */
+ uint8_t Total_Configuration;/* Number of configuration available */
+}
+DEVICE;
+
+typedef union
+{
+ uint16_t w;
+ struct BW
+ {
+ uint8_t bb1;
+ uint8_t bb0;
+ }
+ bw;
+} uint16_t_uint8_t;
+
+typedef struct _DEVICE_INFO
+{
+ uint8_t USBbmRequestType; /* bmRequestType */
+ uint8_t USBbRequest; /* bRequest */
+ uint16_t_uint8_t USBwValues; /* wValue */
+ uint16_t_uint8_t USBwIndexs; /* wIndex */
+ uint16_t_uint8_t USBwLengths; /* wLength */
+
+ uint8_t ControlState; /* of type CONTROL_STATE */
+ uint8_t Current_Feature;
+ uint8_t Current_Configuration; /* Selected configuration */
+ uint8_t Current_Interface; /* Selected interface of current configuration */
+ uint8_t Current_AlternateSetting;/* Selected Alternate Setting of current
+ interface*/
+
+ ENDPOINT_INFO Ctrl_Info;
+}DEVICE_INFO;
+
+typedef struct _DEVICE_PROP
+{
+ void (*Init)(void); /* Initialize the device */
+ void (*Reset)(void); /* Reset routine of this device */
+
+ /* Device dependent process after the status stage */
+ void (*Process_Status_IN)(void);
+ void (*Process_Status_OUT)(void);
+
+ /* Procedure of process on setup stage of a class specified request with data stage */
+ /* All class specified requests with data stage are processed in Class_Data_Setup
+ Class_Data_Setup()
+ responses to check all special requests and fills ENDPOINT_INFO
+ according to the request
+ If IN tokens are expected, then wLength & wOffset will be filled
+ with the total transferring bytes and the starting position
+ If OUT tokens are expected, then rLength & rOffset will be filled
+ with the total expected bytes and the starting position in the buffer
+
+ If the request is valid, Class_Data_Setup returns SUCCESS, else UNSUPPORT
+
+ CAUTION:
+ Since GET_CONFIGURATION & GET_INTERFACE are highly related to
+ the individual classes, they will be checked and processed here.
+ */
+ RESULT (*Class_Data_Setup)(uint8_t RequestNo);
+
+ /* Procedure of process on setup stage of a class specified request without data stage */
+ /* All class specified requests without data stage are processed in Class_NoData_Setup
+ Class_NoData_Setup
+ responses to check all special requests and perform the request
+
+ CAUTION:
+ Since SET_CONFIGURATION & SET_INTERFACE are highly related to
+ the individual classes, they will be checked and processed here.
+ */
+ RESULT (*Class_NoData_Setup)(uint8_t RequestNo);
+
+ /*Class_Get_Interface_Setting
+ This function is used by the file usb_core.c to test if the selected Interface
+ and Alternate Setting (uint8_t Interface, uint8_t AlternateSetting) are supported by
+ the application.
+ This function is writing by user. It should return "SUCCESS" if the Interface
+ and Alternate Setting are supported by the application or "UNSUPPORT" if they
+ are not supported. */
+
+ RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting);
+
+ uint8_t* (*GetDeviceDescriptor)(uint16_t Length);
+ uint8_t* (*GetConfigDescriptor)(uint16_t Length);
+ uint8_t* (*GetStringDescriptor)(uint16_t Length);
+
+ /* This field is not used in current library version. It is kept only for
+ compatibility with previous versions */
+ void* RxEP_buffer;
+
+ uint8_t MaxPacketSize;
+
+}DEVICE_PROP;
+
+typedef struct _USER_STANDARD_REQUESTS
+{
+ void (*User_GetConfiguration)(void); /* Get Configuration */
+ void (*User_SetConfiguration)(void); /* Set Configuration */
+ void (*User_GetInterface)(void); /* Get Interface */
+ void (*User_SetInterface)(void); /* Set Interface */
+ void (*User_GetStatus)(void); /* Get Status */
+ void (*User_ClearFeature)(void); /* Clear Feature */
+ void (*User_SetEndPointFeature)(void); /* Set Endpoint Feature */
+ void (*User_SetDeviceFeature)(void); /* Set Device Feature */
+ void (*User_SetDeviceAddress)(void); /* Set Device Address */
+}
+USER_STANDARD_REQUESTS;
+
+/* Exported constants --------------------------------------------------------*/
+#define Type_Recipient (pInformation->USBbmRequestType & (REQUEST_TYPE | RECIPIENT))
+
+#define Usb_rLength Usb_wLength
+#define Usb_rOffset Usb_wOffset
+
+#define USBwValue USBwValues.w
+#define USBwValue0 USBwValues.bw.bb0
+#define USBwValue1 USBwValues.bw.bb1
+#define USBwIndex USBwIndexs.w
+#define USBwIndex0 USBwIndexs.bw.bb0
+#define USBwIndex1 USBwIndexs.bw.bb1
+#define USBwLength USBwLengths.w
+#define USBwLength0 USBwLengths.bw.bb0
+#define USBwLength1 USBwLengths.bw.bb1
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+uint8_t Setup0_Process(void);
+uint8_t Post0_Process(void);
+uint8_t Out0_Process(void);
+uint8_t In0_Process(void);
+
+RESULT Standard_SetEndPointFeature(void);
+RESULT Standard_SetDeviceFeature(void);
+
+uint8_t *Standard_GetConfiguration(uint16_t Length);
+RESULT Standard_SetConfiguration(void);
+uint8_t *Standard_GetInterface(uint16_t Length);
+RESULT Standard_SetInterface(void);
+uint8_t *Standard_GetDescriptorData(uint16_t Length, PONE_DESCRIPTOR pDesc);
+
+uint8_t *Standard_GetStatus(uint16_t Length);
+RESULT Standard_ClearFeature(void);
+void SetDeviceAddress(uint8_t);
+void NOP_Process(void);
+
+extern DEVICE_PROP Device_Property;
+extern USER_STANDARD_REQUESTS User_Standard_Requests;
+extern DEVICE Device_Table;
+extern DEVICE_INFO Device_Info;
+
+/* cells saving status during interrupt servicing */
+extern __IO uint16_t SaveRState;
+extern __IO uint16_t SaveTState;
+
+#endif /* __USB_CORE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_usb/inc/usb_def.h b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_def.h
new file mode 100644
index 0000000..bcae02b
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_def.h
@@ -0,0 +1,92 @@
+/**
+ ******************************************************************************
+ * @file usb_def.h
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief Definitions related to USB Core
+ ******************************************************************************
+ * @attention
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_INIT_H
+#define __USB_INIT_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+void USB_Init(void);
+
+/* External variables --------------------------------------------------------*/
+/* The number of current endpoint, it will be used to specify an endpoint */
+extern uint8_t EPindex;
+/* The number of current device, it is an index to the Device_Table */
+/*extern uint8_t Device_no; */
+/* Points to the DEVICE_INFO structure of current device */
+/* The purpose of this register is to speed up the execution */
+extern DEVICE_INFO* pInformation;
+/* Points to the DEVICE_PROP structure of current device */
+/* The purpose of this register is to speed up the execution */
+extern DEVICE_PROP* pProperty;
+/* Temporary save the state of Rx & Tx status. */
+/* Whenever the Rx or Tx state is changed, its value is saved */
+/* in this variable first and will be set to the EPRB or EPRA */
+/* at the end of interrupt process */
+extern USER_STANDARD_REQUESTS *pUser_Standard_Requests;
+
+extern uint16_t SaveState ;
+extern uint16_t wInterrupt_Mask;
+
+#endif /* __USB_INIT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_usb/inc/usb_int.h b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_int.h
new file mode 100644
index 0000000..35479aa
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_int.h
@@ -0,0 +1,45 @@
+/**
+ ******************************************************************************
+ * @file usb_int.h
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief Endpoint CTR (Low and High) interrupt's service routines prototypes
+ ******************************************************************************
+ * @attention
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_INT_H
+#define __USB_INT_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+void CTR_LP(void);
+void CTR_HP(void);
+
+/* External variables --------------------------------------------------------*/
+
+#endif /* __USB_INT_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_usb/inc/usb_lib.h b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_lib.h
new file mode 100644
index 0000000..1a4933b
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_lib.h
@@ -0,0 +1,63 @@
+/**
+ ******************************************************************************
+ * @file usb_lib.h
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief USB library include files
+ ******************************************************************************
+ * @attention
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_MEM_H
+#define __USB_MEM_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+void UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes);
+void PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes);
+
+/* External variables --------------------------------------------------------*/
+
+#endif /*__USB_MEM_H*/
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_usb/inc/usb_regs.h b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_regs.h
new file mode 100644
index 0000000..230a5e0
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_regs.h
@@ -0,0 +1,684 @@
+/**
+ ******************************************************************************
+ * @file usb_regs.h
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief Interface prototype functions to USB cell registers
+ ******************************************************************************
+ * @attention
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_SIL_H
+#define __USB_SIL_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+
+uint32_t USB_SIL_Init(void);
+uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize);
+uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer);
+
+/* External variables --------------------------------------------------------*/
+
+#endif /* __USB_SIL_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_usb/inc/usb_type.h b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_type.h
new file mode 100644
index 0000000..ded6213
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_usb/inc/usb_type.h
@@ -0,0 +1,87 @@
+/**
+ ******************************************************************************
+ * @file usb_type.h
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief Type definitions used by the USB Library
+ ******************************************************************************
+ * @attention
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "usb_lib.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* The number of current endpoint, it will be used to specify an endpoint */
+ uint8_t EPindex;
+/* The number of current device, it is an index to the Device_Table */
+/* uint8_t Device_no; */
+/* Points to the DEVICE_INFO structure of current device */
+/* The purpose of this register is to speed up the execution */
+DEVICE_INFO *pInformation;
+/* Points to the DEVICE_PROP structure of current device */
+/* The purpose of this register is to speed up the execution */
+DEVICE_PROP *pProperty;
+/* Temporary save the state of Rx & Tx status. */
+/* Whenever the Rx or Tx state is changed, its value is saved */
+/* in this variable first and will be set to the EPRB or EPRA */
+/* at the end of interrupt process */
+uint16_t SaveState ;
+uint16_t wInterrupt_Mask;
+DEVICE_INFO Device_Info;
+USER_STANDARD_REQUESTS *pUser_Standard_Requests;
+
+/* Extern variables ----------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+
+/*******************************************************************************
+* Function Name : USB_Init
+* Description : USB system initialization
+* Input : None.
+* Output : None.
+* Return : None.
+*******************************************************************************/
+void USB_Init(void)
+{
+ pInformation = &Device_Info;
+ pInformation->ControlState = 2;
+ pProperty = &Device_Property;
+ pUser_Standard_Requests = &User_Standard_Requests;
+ /* Initialize devices one by one */
+ pProperty->Init();
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/2.Firmware/STM32/Firmware/stm_usb/src/usb_int.c b/2.Firmware/STM32/Firmware/stm_usb/src/usb_int.c
new file mode 100644
index 0000000..a03fca1
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/stm_usb/src/usb_int.c
@@ -0,0 +1,201 @@
+/**
+ ******************************************************************************
+ * @file usb_int.c
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief Endpoint CTR (Low and High) interrupt's service routines
+ ******************************************************************************
+ * @attention
+ *
+ *
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __USB_CONF_H
+#define __USB_CONF_H
+
+/* Includes ------------------------------------------------------------------*/
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+/* Exported macro ------------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+/* External variables --------------------------------------------------------*/
+/*-------------------------------------------------------------*/
+/* EP_NUM */
+/* defines how many endpoints are used by the device */
+/*-------------------------------------------------------------*/
+#define EP_NUM (2)
+
+#ifndef STM32F10X_CL
+/*-------------------------------------------------------------*/
+/* -------------- Buffer Description Table -----------------*/
+/*-------------------------------------------------------------*/
+/* buffer table base address */
+/* buffer table base address */
+#define BTABLE_ADDRESS (0x00)
+
+/* EP0 */
+/* rx/tx buffer base address */
+#define ENDP0_RXADDR (0x18)
+#define ENDP0_TXADDR (0x58)
+
+/* EP1 */
+/* tx buffer base address */
+#define ENDP1_TXADDR (0x100)
+#define ENDP1_RXADDR (0x140)
+
+/*-------------------------------------------------------------*/
+/* ------------------- ISTR events -------------------------*/
+/*-------------------------------------------------------------*/
+/* IMR_MSK */
+/* mask defining which events has to be handled */
+/* by the device application software */
+#define IMR_MSK (CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM | CNTR_SOFM \
+ | CNTR_ESOFM | CNTR_RESETM )
+#endif /* STM32F10X_CL */
+
+#ifdef STM32F10X_CL
+
+/*******************************************************************************
+* FIFO Size Configuration
+*
+* (i) Dedicated data FIFO SPRAM of 1.25 Kbytes = 1280 bytes = 320 32-bits words
+* available for the endpoints IN and OUT.
+* Device mode features:
+* -1 bidirectional CTRL EP 0
+* -3 IN EPs to support any kind of Bulk, Interrupt or Isochronous transfer
+* -3 OUT EPs to support any kind of Bulk, Interrupt or Isochronous transfer
+*
+* ii) Receive data FIFO size = RAM for setup packets +
+* OUT endpoint control information +
+* data OUT packets + miscellaneous
+* Space = ONE 32-bits words
+* --> RAM for setup packets = 4 * n + 6 space
+* (n is the nbr of CTRL EPs the device core supports)
+* --> OUT EP CTRL info = 1 space
+* (one space for status information written to the FIFO along with each
+* received packet)
+* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces
+* (MINIMUM to receive packets)
+* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces
+* (if high-bandwidth EP is enabled or multiple isochronous EPs)
+* --> miscellaneous = 1 space per OUT EP
+* (one space for transfer complete status information also pushed to the
+* FIFO with each endpoint's last packet)
+*
+* (iii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for
+* that particular IN EP. More space allocated in the IN EP Tx FIFO results
+* in a better performance on the USB and can hide latencies on the AHB.
+*
+* (iv) TXn min size = 16 words. (n : Transmit FIFO index)
+* (v) When a TxFIFO is not used, the Configuration should be as follows:
+* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes)
+* --> Txm can use the space allocated for Txn.
+* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes)
+* --> Txn should be configured with the minimum space of 16 words
+* (vi) The FIFO is used optimally when used TxFIFOs are allocated in the top
+* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
+*******************************************************************************/
+
+#define RX_FIFO_SIZE 128
+#define TX0_FIFO_SIZE 64
+#define TX1_FIFO_SIZE 64
+#define TX2_FIFO_SIZE 16
+#define TX3_FIFO_SIZE 16
+
+/* OTGD-FS-DEVICE IP interrupts Enable definitions */
+/* Uncomment the define to enable the selected interrupt */
+//#define INTR_MODEMISMATCH
+#define INTR_SOFINTR
+#define INTR_RXSTSQLVL /* Mandatory */
+//#define INTR_NPTXFEMPTY
+//#define INTR_GINNAKEFF
+//#define INTR_GOUTNAKEFF
+//#define INTR_ERLYSUSPEND
+#define INTR_USBSUSPEND /* Mandatory */
+#define INTR_USBRESET /* Mandatory */
+#define INTR_ENUMDONE /* Mandatory */
+//#define INTR_ISOOUTDROP
+//#define INTR_EOPFRAME
+//#define INTR_EPMISMATCH
+#define INTR_INEPINTR /* Mandatory */
+#define INTR_OUTEPINTR /* Mandatory */
+//#define INTR_INCOMPLISOIN
+//#define INTR_INCOMPLISOOUT
+#define INTR_WKUPINTR /* Mandatory */
+
+/* OTGD-FS-DEVICE IP interrupts subroutines */
+/* Comment the define to enable the selected interrupt subroutine and replace it
+ by user code */
+#define INTR_MODEMISMATCH_Callback NOP_Process
+#define INTR_SOFINTR_Callback NOP_Process
+#define INTR_RXSTSQLVL_Callback NOP_Process
+#define INTR_NPTXFEMPTY_Callback NOP_Process
+#define INTR_NPTXFEMPTY_Callback NOP_Process
+#define INTR_GINNAKEFF_Callback NOP_Process
+#define INTR_GOUTNAKEFF_Callback NOP_Process
+#define INTR_ERLYSUSPEND_Callback NOP_Process
+#define INTR_USBSUSPEND_Callback NOP_Process
+#define INTR_USBRESET_Callback NOP_Process
+#define INTR_ENUMDONE_Callback NOP_Process
+#define INTR_ISOOUTDROP_Callback NOP_Process
+#define INTR_EOPFRAME_Callback NOP_Process
+#define INTR_EPMISMATCH_Callback NOP_Process
+#define INTR_INEPINTR_Callback NOP_Process
+#define INTR_OUTEPINTR_Callback NOP_Process
+#define INTR_INCOMPLISOIN_Callback NOP_Process
+#define INTR_INCOMPLISOOUT_Callback NOP_Process
+#define INTR_WKUPINTR_Callback NOP_Process
+
+/* Isochronous data update */
+#define INTR_RXSTSQLVL_ISODU_Callback NOP_Process
+
+/* Isochronous transfer parameters */
+/* Size of a single Isochronous buffer (size of a single transfer) */
+#define ISOC_BUFFER_SZE 1
+/* Number of sub-buffers (number of single buffers/transfers), should be even */
+#define NUM_SUB_BUFFERS 2
+
+#endif /* STM32F10X_CL */
+
+
+/* CTR service routines */
+/* associated to defined endpoints */
+/* #define EP1_IN_Callback NOP_Process */
+#define EP2_IN_Callback NOP_Process
+#define EP3_IN_Callback NOP_Process
+#define EP4_IN_Callback NOP_Process
+#define EP5_IN_Callback NOP_Process
+#define EP6_IN_Callback NOP_Process
+#define EP7_IN_Callback NOP_Process
+
+//#define EP1_OUT_Callback NOP_Process
+#define EP2_OUT_Callback NOP_Process
+#define EP3_OUT_Callback NOP_Process
+#define EP4_OUT_Callback NOP_Process
+#define EP5_OUT_Callback NOP_Process
+#define EP6_OUT_Callback NOP_Process
+#define EP7_OUT_Callback NOP_Process
+
+#endif /*__USB_CONF_H*/
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+
diff --git a/2.Firmware/STM32/Firmware/usb/inc/usb_desc.h b/2.Firmware/STM32/Firmware/usb/inc/usb_desc.h
new file mode 100644
index 0000000..8b03165
--- /dev/null
+++ b/2.Firmware/STM32/Firmware/usb/inc/usb_desc.h
@@ -0,0 +1,69 @@
+/**
+ ******************************************************************************
+ * @file usb_desc.h
+ * @author MCD Application Team
+ * @version V3.4.0
+ * @date 29-June-2012
+ * @brief Descriptor Header for Custom HID Demo
+ ******************************************************************************
+ * @attention
+ *
+ *
diff --git a/2.Firmware/STM32/OBJ/GeekIMUv2.lnp b/2.Firmware/STM32/OBJ/GeekIMUv2.lnp
new file mode 100644
index 0000000..16cfae3
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/GeekIMUv2.lnp
@@ -0,0 +1,49 @@
+--cpu Cortex-M3
+"..\obj\main.o"
+"..\obj\hw_config.o"
+"..\obj\stm32_it.o"
+"..\obj\misc.o"
+"..\obj\stm32f10x_dbgmcu.o"
+"..\obj\stm32f10x_exti.o"
+"..\obj\stm32f10x_flash.o"
+"..\obj\stm32f10x_gpio.o"
+"..\obj\stm32f10x_pwr.o"
+"..\obj\stm32f10x_rcc.o"
+"..\obj\stm32f10x_spi.o"
+"..\obj\stm32f10x_tim.o"
+"..\obj\stm32f10x_usart.o"
+"..\obj\stm32f10x_i2c.o"
+"..\obj\stm32f10x_adc.o"
+"..\obj\stm32f10x_dma.o"
+"..\obj\core_cm3.o"
+"..\obj\system_stm32f10x.o"
+"..\obj\startup_stm32f10x_md.o"
+"..\obj\usb_core.o"
+"..\obj\usb_init.o"
+"..\obj\usb_int.o"
+"..\obj\usb_mem.o"
+"..\obj\usb_regs.o"
+"..\obj\usb_sil.o"
+"..\obj\usb_desc.o"
+"..\obj\usb_endp.o"
+"..\obj\usb_istr.o"
+"..\obj\usb_prop.o"
+"..\obj\usb_pwr.o"
+"..\obj\led.o"
+"..\obj\feature_config.o"
+"..\obj\gpio.o"
+"..\obj\spi.o"
+"..\obj\usart.o"
+"..\obj\sys.o"
+"..\obj\stmflash.o"
+"..\obj\delay.o"
+"..\obj\senddata.o"
+"..\obj\ahrs.o"
+"..\obj\lis3mdl.o"
+"..\obj\mpu6500.o"
+"..\obj\calibrate.o"
+"..\obj\time.o"
+--strict --scatter "..\OBJ\GeekIMUv2.sct"
+--summary_stderr --info summarysizes --map --xref --callgraph --symbols
+--info sizes --info totals --info unused --info veneers
+--list "..\LIST\GeekIMUv2.map" -o ..\OBJ\GeekIMUv2.axf
\ No newline at end of file
diff --git a/2.Firmware/STM32/OBJ/GeekIMUv2.sct b/2.Firmware/STM32/OBJ/GeekIMUv2.sct
new file mode 100644
index 0000000..c26b647
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/GeekIMUv2.sct
@@ -0,0 +1,15 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00020000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00020000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000000 0x00005000 { ; RW data
+ .ANY (+RW +ZI)
+ }
+}
+
diff --git a/2.Firmware/STM32/OBJ/TrackVR_Controller_GeekIMUv2.dep b/2.Firmware/STM32/OBJ/TrackVR_Controller_GeekIMUv2.dep
new file mode 100644
index 0000000..5a010c2
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/TrackVR_Controller_GeekIMUv2.dep
@@ -0,0 +1,1012 @@
+Dependencies for Project 'TrackVR_Controller', Target 'GeekIMUv2': (DO NOT MODIFY !)
+F (.\main.c)(0x6443F3E2)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\main.o --omf_browse ..\obj\main.crf --depend ..\obj\main.d)
+I (hw_config.h)(0x6320891E)
+I (platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (.\SYSTEM\usart\usart.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdio.h)(0x574E3E26)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (.\usb\inc\usb_pwr.h)(0x6320891E)
+I (.\sensor\calibrate.h)(0x6320891E)
+I (.\sensor\senddata.h)(0x6320891E)
+I (.\Driver\gpio.h)(0x6320891E)
+I (.\Driver\led.h)(0x6320891E)
+I (.\sensor\mpu6500.h)(0x6320891E)
+I (.\sensor\lis3mdl.h)(0x6320891E)
+I (.\Driver\spi.h)(0x6320891E)
+I (.\sensor\time.h)(0x6320891E)
+F (.\hw_config.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\hw_config.o --omf_browse ..\obj\hw_config.crf --depend ..\obj\hw_config.d)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (hw_config.h)(0x6320891E)
+I (platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\usb\inc\usb_desc.h)(0x6320891E)
+I (.\usb\inc\usb_pwr.h)(0x6320891E)
+I (.\Driver\gpio.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\string.h)(0x574E3E26)
+I (.\sensor\Time.h)(0x6320891E)
+F (.\stm32_it.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32_it.o --omf_browse ..\obj\stm32_it.crf --depend ..\obj\stm32_it.d)
+I (stm32_it.h)(0x6320891E)
+I (platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\usb\inc\usb_istr.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\usb\inc\usb_pwr.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+F (.\stm_lib\src\misc.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\misc.o --omf_browse ..\obj\misc.crf --depend ..\obj\misc.d)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_dbgmcu.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_dbgmcu.o --omf_browse ..\obj\stm32f10x_dbgmcu.crf --depend ..\obj\stm32f10x_dbgmcu.d)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_exti.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_exti.o --omf_browse ..\obj\stm32f10x_exti.crf --depend ..\obj\stm32f10x_exti.d)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_flash.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_flash.o --omf_browse ..\obj\stm32f10x_flash.crf --depend ..\obj\stm32f10x_flash.d)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_gpio.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_gpio.o --omf_browse ..\obj\stm32f10x_gpio.crf --depend ..\obj\stm32f10x_gpio.d)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_pwr.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_pwr.o --omf_browse ..\obj\stm32f10x_pwr.crf --depend ..\obj\stm32f10x_pwr.d)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_rcc.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_rcc.o --omf_browse ..\obj\stm32f10x_rcc.crf --depend ..\obj\stm32f10x_rcc.d)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_spi.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_spi.o --omf_browse ..\obj\stm32f10x_spi.crf --depend ..\obj\stm32f10x_spi.d)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_tim.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_tim.o --omf_browse ..\obj\stm32f10x_tim.crf --depend ..\obj\stm32f10x_tim.d)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_usart.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_usart.o --omf_browse ..\obj\stm32f10x_usart.crf --depend ..\obj\stm32f10x_usart.d)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_i2c.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_i2c.o --omf_browse ..\obj\stm32f10x_i2c.crf --depend ..\obj\stm32f10x_i2c.d)
+I (.\stm_lib\inc\stm32f10x_i2c.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_adc.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_adc.o --omf_browse ..\obj\stm32f10x_adc.crf --depend ..\obj\stm32f10x_adc.d)
+I (.\stm_lib\inc\stm32f10x_adc.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\stm_lib\src\stm32f10x_dma.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stm32f10x_dma.o --omf_browse ..\obj\stm32f10x_dma.crf --depend ..\obj\stm32f10x_dma.d)
+I (.\stm_lib\inc\stm32f10x_dma.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\cmsis\core_cm3.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\core_cm3.o --omf_browse ..\obj\core_cm3.crf --depend ..\obj\core_cm3.d)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+F (.\cmsis_boot\system_stm32f10x.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\system_stm32f10x.o --omf_browse ..\obj\system_stm32f10x.crf --depend ..\obj\system_stm32f10x.d)
+I (cmsis_boot\stm32f10x.h)(0x6320891E)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (cmsis_boot\system_stm32f10x.h)(0x6320891E)
+I (cmsis_boot\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+F (.\cmsis_boot\startup\startup_stm32f10x_md.s)(0x6320891E)(--cpu Cortex-M3 -g --apcs=interwork
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
--pd "__UVISION_VERSION SETA 521" --pd "_RTE_ SETA 1" --pd "STM32F10X_MD SETA 1"
--list ..\list\startup_stm32f10x_md.lst --xref -o ..\obj\startup_stm32f10x_md.o --depend ..\obj\startup_stm32f10x_md.d)
+F (.\stm_usb\src\usb_core.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_core.o --omf_browse ..\obj\usb_core.crf --depend ..\obj\usb_core.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+F (.\stm_usb\src\usb_init.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_init.o --omf_browse ..\obj\usb_init.crf --depend ..\obj\usb_init.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+F (.\stm_usb\src\usb_int.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_int.o --omf_browse ..\obj\usb_int.crf --depend ..\obj\usb_int.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+F (.\stm_usb\src\usb_mem.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_mem.o --omf_browse ..\obj\usb_mem.crf --depend ..\obj\usb_mem.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+F (.\stm_usb\src\usb_regs.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_regs.o --omf_browse ..\obj\usb_regs.crf --depend ..\obj\usb_regs.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+F (.\stm_usb\src\usb_sil.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_sil.o --omf_browse ..\obj\usb_sil.crf --depend ..\obj\usb_sil.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+F (.\usb\src\usb_desc.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_desc.o --omf_browse ..\obj\usb_desc.crf --depend ..\obj\usb_desc.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\usb\inc\usb_desc.h)(0x6320891E)
+F (.\usb\src\usb_endp.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_endp.o --omf_browse ..\obj\usb_endp.crf --depend ..\obj\usb_endp.d)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\usb\inc\usb_istr.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\string.h)(0x574E3E26)
+F (.\usb\src\usb_istr.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_istr.o --omf_browse ..\obj\usb_istr.crf --depend ..\obj\usb_istr.d)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\usb\inc\usb_prop.h)(0x6320891E)
+I (.\usb\inc\usb_pwr.h)(0x6320891E)
+I (.\usb\inc\usb_istr.h)(0x6320891E)
+F (.\usb\src\usb_prop.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_prop.o --omf_browse ..\obj\usb_prop.crf --depend ..\obj\usb_prop.d)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\usb\inc\usb_prop.h)(0x6320891E)
+I (.\usb\inc\usb_desc.h)(0x6320891E)
+I (.\usb\inc\usb_pwr.h)(0x6320891E)
+I (.\Driver\feature_config.h)(0x6320891E)
+I (.\sensor\calibrate.h)(0x6320891E)
+F (.\usb\src\usb_pwr.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usb_pwr.o --omf_browse ..\obj\usb_pwr.crf --depend ..\obj\usb_pwr.d)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\usb\inc\usb_pwr.h)(0x6320891E)
+F (.\Driver\led.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\led.o --omf_browse ..\obj\led.crf --depend ..\obj\led.d)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (Driver\led.h)(0x6320891E)
+F (.\driver\feature_config.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\feature_config.o --omf_browse ..\obj\feature_config.crf --depend ..\obj\feature_config.d)
+I (driver\feature_config.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\sensor\calibrate.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdlib.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\string.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (driver\gpio.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (driver\stmflash.h)(0x6320891E)
+F (.\driver\gpio.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\gpio.o --omf_browse ..\obj\gpio.crf --depend ..\obj\gpio.d)
+I (driver\gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (driver\led.h)(0x6320891E)
+F (.\driver\spi.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\spi.o --omf_browse ..\obj\spi.crf --depend ..\obj\spi.d)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (driver\spi.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+F (.\SYSTEM\usart\usart.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\usart.o --omf_browse ..\obj\usart.crf --depend ..\obj\usart.d)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (SYSTEM\usart\usart.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdio.h)(0x574E3E26)
+F (.\SYSTEM\sys\sys.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\sys.o --omf_browse ..\obj\sys.crf --depend ..\obj\sys.d)
+I (SYSTEM\sys\sys.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+F (.\driver\stmflash.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\stmflash.o --omf_browse ..\obj\stmflash.crf --depend ..\obj\stmflash.d)
+I (driver\stmflash.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (.\SYSTEM\usart\usart.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdio.h)(0x574E3E26)
+F (.\system\delay\delay.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\delay.o --omf_browse ..\obj\delay.crf --depend ..\obj\delay.d)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (system\delay\delay.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+F (.\sensor\senddata.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\senddata.o --omf_browse ..\obj\senddata.crf --depend ..\obj\senddata.d)
+I (sensor\senddata.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (sensor\mpu6500.h)(0x6320891E)
+I (sensor\lis3mdl.h)(0x6320891E)
+I (sensor\calibrate.h)(0x6320891E)
+F (.\sensor\ahrs.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\ahrs.o --omf_browse ..\obj\ahrs.crf --depend ..\obj\ahrs.d)
+I (sensor\ahrs.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\math.h)(0x574E3E26)
+I (sensor\time.h)(0x6320891E)
+I (.\stm_usb\inc\usb_lib.h)(0x6320891E)
+I (..\Firmware\hw_config.h)(0x6320891E)
+I (..\Firmware\platform_config.h)(0x6320891E)
+I (.\Driver\platform_common.h)(0x6320891E)
+I (.\stm_usb\inc\usb_type.h)(0x6320891E)
+I (.\usb\inc\usb_conf.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\stm_usb\inc\usb_regs.h)(0x6320891E)
+I (.\stm_usb\inc\usb_def.h)(0x6320891E)
+I (.\stm_usb\inc\usb_core.h)(0x6320891E)
+I (.\stm_usb\inc\usb_init.h)(0x6320891E)
+I (.\stm_usb\inc\usb_sil.h)(0x6320891E)
+I (.\stm_usb\inc\usb_mem.h)(0x6320891E)
+I (.\stm_usb\inc\usb_int.h)(0x6320891E)
+F (.\sensor\lis3mdl.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\lis3mdl.o --omf_browse ..\obj\lis3mdl.crf --depend ..\obj\lis3mdl.d)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (sensor\calibrate.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (sensor\LIS3MDL_register_map.h)(0x6320891E)
+I (sensor\LIS3MDL.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (.\Driver\spi.h)(0x6320891E)
+F (.\sensor\mpu6500.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\mpu6500.o --omf_browse ..\obj\mpu6500.crf --depend ..\obj\mpu6500.d)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (sensor\mpu6500_register_map.h)(0x6320891E)
+I (sensor\MPU6500.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (.\Driver\spi.h)(0x6320891E)
+I (sensor\calibrate.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+F (.\sensor\calibrate.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\calibrate.o --omf_browse ..\obj\calibrate.crf --depend ..\obj\calibrate.d)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\string.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\math.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdlib.h)(0x574E3E26)
+I (.\SYSTEM\delay\delay.h)(0x6320891E)
+I (.\SYSTEM\sys\sys.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
+I (sensor\calibrate.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdbool.h)(0x574E3E26)
+I (.\Driver\stmflash.h)(0x6320891E)
+I (sensor\mpu6500.h)(0x6320891E)
+F (.\sensor\time.c)(0x6320891E)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork -I .\cmsis -I .\cmsis_boot\startup -I .\oculus\inc -I .\oculus -I .\stm_eeprom -I .\oculus -I .\usb -I .\syscalls -I .\stm_usb -I .\stm_lib -I ..\Firmware -I .\stm_usb\inc -I .\stm_lib\inc -I .\usb\inc -I .\stm_eeprom\inc -I .\MPU9150 -I .\SYSTEM\sys -I .\SYSTEM\usart -I .\Driver -I .\sensor -I .\lcd -I .\sensor -I .\SYSTEM\delay
-IE:\HardwareProject\GeekIMU\2.Firmware\STM32\Firmware\RTE
-I"D:\Program Files\Keilv5\ARM\PACK\ARM\CMSIS\4.5.0\CMSIS\Include"
-I"D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include"
-D__UVISION_VERSION="521" -D_RTE_ -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
-o ..\obj\time.o --omf_browse ..\obj\time.crf --depend ..\obj\time.d)
+I (sensor\time.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h)(0x53BA0D60)
+I (.\cmsis\core_cm3.h)(0x6320891E)
+I (D:\Program Files\Keilv5\ARM\ARMCC\include\stdint.h)(0x574E3E26)
+I (D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h)(0x4F1E2E3C)
+I (..\Firmware\stm32f10x_conf.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_dbgmcu.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_exti.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_flash.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_gpio.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_pwr.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_rcc.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_spi.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_tim.h)(0x6320891E)
+I (.\stm_lib\inc\stm32f10x_usart.h)(0x6320891E)
+I (.\stm_lib\inc\misc.h)(0x6320891E)
diff --git a/2.Firmware/STM32/OBJ/ahrs.crf b/2.Firmware/STM32/OBJ/ahrs.crf
new file mode 100644
index 0000000..50845d4
Binary files /dev/null and b/2.Firmware/STM32/OBJ/ahrs.crf differ
diff --git a/2.Firmware/STM32/OBJ/ahrs.d b/2.Firmware/STM32/OBJ/ahrs.d
new file mode 100644
index 0000000..d512fe1
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/ahrs.d
@@ -0,0 +1,36 @@
+..\obj\ahrs.o: sensor\ahrs.c
+..\obj\ahrs.o: sensor\ahrs.h
+..\obj\ahrs.o: .\SYSTEM\sys\sys.h
+..\obj\ahrs.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\ahrs.o: .\cmsis\core_cm3.h
+..\obj\ahrs.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\ahrs.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\ahrs.o: ..\Firmware\stm32f10x_conf.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\ahrs.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\ahrs.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\ahrs.o: .\stm_lib\inc\misc.h
+..\obj\ahrs.o: .\SYSTEM\delay\delay.h
+..\obj\ahrs.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\math.h
+..\obj\ahrs.o: sensor\time.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_lib.h
+..\obj\ahrs.o: ..\Firmware\hw_config.h
+..\obj\ahrs.o: ..\Firmware\platform_config.h
+..\obj\ahrs.o: .\Driver\platform_common.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_type.h
+..\obj\ahrs.o: .\usb\inc\usb_conf.h
+..\obj\ahrs.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_regs.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_def.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_core.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_init.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_sil.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_mem.h
+..\obj\ahrs.o: .\stm_usb\inc\usb_int.h
diff --git a/2.Firmware/STM32/OBJ/ahrs.o b/2.Firmware/STM32/OBJ/ahrs.o
new file mode 100644
index 0000000..1cac6d6
Binary files /dev/null and b/2.Firmware/STM32/OBJ/ahrs.o differ
diff --git a/2.Firmware/STM32/OBJ/calibrate.crf b/2.Firmware/STM32/OBJ/calibrate.crf
new file mode 100644
index 0000000..d370314
Binary files /dev/null and b/2.Firmware/STM32/OBJ/calibrate.crf differ
diff --git a/2.Firmware/STM32/OBJ/calibrate.d b/2.Firmware/STM32/OBJ/calibrate.d
new file mode 100644
index 0000000..de6774d
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/calibrate.d
@@ -0,0 +1,26 @@
+..\obj\calibrate.o: sensor\calibrate.c
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\string.h
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\math.h
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdlib.h
+..\obj\calibrate.o: .\SYSTEM\delay\delay.h
+..\obj\calibrate.o: .\SYSTEM\sys\sys.h
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\calibrate.o: .\cmsis\core_cm3.h
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\calibrate.o: ..\Firmware\stm32f10x_conf.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\calibrate.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\calibrate.o: .\stm_lib\inc\misc.h
+..\obj\calibrate.o: sensor\calibrate.h
+..\obj\calibrate.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\calibrate.o: .\Driver\stmflash.h
+..\obj\calibrate.o: sensor\mpu6500.h
diff --git a/2.Firmware/STM32/OBJ/calibrate.o b/2.Firmware/STM32/OBJ/calibrate.o
new file mode 100644
index 0000000..5b5241d
Binary files /dev/null and b/2.Firmware/STM32/OBJ/calibrate.o differ
diff --git a/2.Firmware/STM32/OBJ/core_cm3.crf b/2.Firmware/STM32/OBJ/core_cm3.crf
new file mode 100644
index 0000000..e91b825
Binary files /dev/null and b/2.Firmware/STM32/OBJ/core_cm3.crf differ
diff --git a/2.Firmware/STM32/OBJ/core_cm3.d b/2.Firmware/STM32/OBJ/core_cm3.d
new file mode 100644
index 0000000..986a3c2
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/core_cm3.d
@@ -0,0 +1,2 @@
+..\obj\core_cm3.o: cmsis\core_cm3.c
+..\obj\core_cm3.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
diff --git a/2.Firmware/STM32/OBJ/core_cm3.o b/2.Firmware/STM32/OBJ/core_cm3.o
new file mode 100644
index 0000000..f4385be
Binary files /dev/null and b/2.Firmware/STM32/OBJ/core_cm3.o differ
diff --git a/2.Firmware/STM32/OBJ/delay.crf b/2.Firmware/STM32/OBJ/delay.crf
new file mode 100644
index 0000000..3b4dffc
Binary files /dev/null and b/2.Firmware/STM32/OBJ/delay.crf differ
diff --git a/2.Firmware/STM32/OBJ/delay.d b/2.Firmware/STM32/OBJ/delay.d
new file mode 100644
index 0000000..98ccceb
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/delay.d
@@ -0,0 +1,19 @@
+..\obj\delay.o: system\delay\delay.c
+..\obj\delay.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\delay.o: system\delay\delay.h
+..\obj\delay.o: .\stm_lib\inc\misc.h
+..\obj\delay.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\delay.o: .\cmsis\core_cm3.h
+..\obj\delay.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\delay.o: ..\Firmware\stm32f10x_conf.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\delay.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\delay.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\delay.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/delay.o b/2.Firmware/STM32/OBJ/delay.o
new file mode 100644
index 0000000..7dd8d8d
Binary files /dev/null and b/2.Firmware/STM32/OBJ/delay.o differ
diff --git a/2.Firmware/STM32/OBJ/feature_config.crf b/2.Firmware/STM32/OBJ/feature_config.crf
new file mode 100644
index 0000000..15d6d81
Binary files /dev/null and b/2.Firmware/STM32/OBJ/feature_config.crf differ
diff --git a/2.Firmware/STM32/OBJ/feature_config.d b/2.Firmware/STM32/OBJ/feature_config.d
new file mode 100644
index 0000000..cba67b1
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/feature_config.d
@@ -0,0 +1,33 @@
+..\obj\feature_config.o: driver\feature_config.c
+..\obj\feature_config.o: driver\feature_config.h
+..\obj\feature_config.o: ..\Firmware\hw_config.h
+..\obj\feature_config.o: ..\Firmware\platform_config.h
+..\obj\feature_config.o: .\Driver\platform_common.h
+..\obj\feature_config.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\feature_config.o: .\cmsis\core_cm3.h
+..\obj\feature_config.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\feature_config.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\feature_config.o: ..\Firmware\stm32f10x_conf.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\feature_config.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\feature_config.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\feature_config.o: .\stm_lib\inc\misc.h
+..\obj\feature_config.o: .\stm_usb\inc\usb_type.h
+..\obj\feature_config.o: .\usb\inc\usb_conf.h
+..\obj\feature_config.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\feature_config.o: .\sensor\calibrate.h
+..\obj\feature_config.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdlib.h
+..\obj\feature_config.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\string.h
+..\obj\feature_config.o: .\stm_usb\inc\usb_core.h
+..\obj\feature_config.o: .\stm_usb\inc\usb_init.h
+..\obj\feature_config.o: driver\gpio.h
+..\obj\feature_config.o: .\SYSTEM\sys\sys.h
+..\obj\feature_config.o: .\SYSTEM\delay\delay.h
+..\obj\feature_config.o: driver\stmflash.h
diff --git a/2.Firmware/STM32/OBJ/feature_config.o b/2.Firmware/STM32/OBJ/feature_config.o
new file mode 100644
index 0000000..6cc0302
Binary files /dev/null and b/2.Firmware/STM32/OBJ/feature_config.o differ
diff --git a/2.Firmware/STM32/OBJ/gpio.crf b/2.Firmware/STM32/OBJ/gpio.crf
new file mode 100644
index 0000000..ea10da3
Binary files /dev/null and b/2.Firmware/STM32/OBJ/gpio.crf differ
diff --git a/2.Firmware/STM32/OBJ/gpio.d b/2.Firmware/STM32/OBJ/gpio.d
new file mode 100644
index 0000000..765298b
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/gpio.d
@@ -0,0 +1,22 @@
+..\obj\gpio.o: driver\gpio.c
+..\obj\gpio.o: driver\gpio.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\gpio.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\gpio.o: .\cmsis\core_cm3.h
+..\obj\gpio.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\gpio.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\gpio.o: ..\Firmware\stm32f10x_conf.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\gpio.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\gpio.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\gpio.o: .\stm_lib\inc\misc.h
+..\obj\gpio.o: .\SYSTEM\sys\sys.h
+..\obj\gpio.o: .\SYSTEM\delay\delay.h
+..\obj\gpio.o: driver\led.h
diff --git a/2.Firmware/STM32/OBJ/gpio.o b/2.Firmware/STM32/OBJ/gpio.o
new file mode 100644
index 0000000..768c271
Binary files /dev/null and b/2.Firmware/STM32/OBJ/gpio.o differ
diff --git a/2.Firmware/STM32/OBJ/hw_config.crf b/2.Firmware/STM32/OBJ/hw_config.crf
new file mode 100644
index 0000000..5ec8595
Binary files /dev/null and b/2.Firmware/STM32/OBJ/hw_config.crf differ
diff --git a/2.Firmware/STM32/OBJ/hw_config.d b/2.Firmware/STM32/OBJ/hw_config.d
new file mode 100644
index 0000000..3b02dbe
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/hw_config.d
@@ -0,0 +1,38 @@
+..\obj\hw_config.o: hw_config.c
+..\obj\hw_config.o: .\SYSTEM\sys\sys.h
+..\obj\hw_config.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\hw_config.o: .\cmsis\core_cm3.h
+..\obj\hw_config.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\hw_config.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\hw_config.o: ..\Firmware\stm32f10x_conf.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\hw_config.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\hw_config.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\hw_config.o: .\stm_lib\inc\misc.h
+..\obj\hw_config.o: .\SYSTEM\delay\delay.h
+..\obj\hw_config.o: hw_config.h
+..\obj\hw_config.o: platform_config.h
+..\obj\hw_config.o: .\Driver\platform_common.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_type.h
+..\obj\hw_config.o: .\usb\inc\usb_conf.h
+..\obj\hw_config.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_lib.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_regs.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_def.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_core.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_init.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_sil.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_mem.h
+..\obj\hw_config.o: .\stm_usb\inc\usb_int.h
+..\obj\hw_config.o: .\usb\inc\usb_desc.h
+..\obj\hw_config.o: .\usb\inc\usb_pwr.h
+..\obj\hw_config.o: .\Driver\gpio.h
+..\obj\hw_config.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\string.h
+..\obj\hw_config.o: .\sensor\Time.h
diff --git a/2.Firmware/STM32/OBJ/hw_config.o b/2.Firmware/STM32/OBJ/hw_config.o
new file mode 100644
index 0000000..3fc892d
Binary files /dev/null and b/2.Firmware/STM32/OBJ/hw_config.o differ
diff --git a/2.Firmware/STM32/OBJ/led.crf b/2.Firmware/STM32/OBJ/led.crf
new file mode 100644
index 0000000..2e246cb
Binary files /dev/null and b/2.Firmware/STM32/OBJ/led.crf differ
diff --git a/2.Firmware/STM32/OBJ/led.d b/2.Firmware/STM32/OBJ/led.d
new file mode 100644
index 0000000..653bc97
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/led.d
@@ -0,0 +1,20 @@
+..\obj\led.o: Driver\led.c
+..\obj\led.o: .\SYSTEM\sys\sys.h
+..\obj\led.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\led.o: .\cmsis\core_cm3.h
+..\obj\led.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\led.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\led.o: ..\Firmware\stm32f10x_conf.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\led.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\led.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\led.o: .\stm_lib\inc\misc.h
+..\obj\led.o: .\SYSTEM\delay\delay.h
+..\obj\led.o: Driver\led.h
diff --git a/2.Firmware/STM32/OBJ/led.o b/2.Firmware/STM32/OBJ/led.o
new file mode 100644
index 0000000..be138dd
Binary files /dev/null and b/2.Firmware/STM32/OBJ/led.o differ
diff --git a/2.Firmware/STM32/OBJ/lis3mdl.crf b/2.Firmware/STM32/OBJ/lis3mdl.crf
new file mode 100644
index 0000000..963fde4
Binary files /dev/null and b/2.Firmware/STM32/OBJ/lis3mdl.crf differ
diff --git a/2.Firmware/STM32/OBJ/lis3mdl.d b/2.Firmware/STM32/OBJ/lis3mdl.d
new file mode 100644
index 0000000..a6099c1
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/lis3mdl.d
@@ -0,0 +1,25 @@
+..\obj\lis3mdl.o: sensor\lis3mdl.c
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\lis3mdl.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\lis3mdl.o: .\cmsis\core_cm3.h
+..\obj\lis3mdl.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\lis3mdl.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\lis3mdl.o: ..\Firmware\stm32f10x_conf.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\lis3mdl.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\lis3mdl.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\lis3mdl.o: .\stm_lib\inc\misc.h
+..\obj\lis3mdl.o: sensor\calibrate.h
+..\obj\lis3mdl.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\lis3mdl.o: sensor\LIS3MDL_register_map.h
+..\obj\lis3mdl.o: sensor\LIS3MDL.h
+..\obj\lis3mdl.o: .\SYSTEM\sys\sys.h
+..\obj\lis3mdl.o: .\SYSTEM\delay\delay.h
+..\obj\lis3mdl.o: .\Driver\spi.h
diff --git a/2.Firmware/STM32/OBJ/lis3mdl.o b/2.Firmware/STM32/OBJ/lis3mdl.o
new file mode 100644
index 0000000..a77103d
Binary files /dev/null and b/2.Firmware/STM32/OBJ/lis3mdl.o differ
diff --git a/2.Firmware/STM32/OBJ/main.crf b/2.Firmware/STM32/OBJ/main.crf
new file mode 100644
index 0000000..54653d7
Binary files /dev/null and b/2.Firmware/STM32/OBJ/main.crf differ
diff --git a/2.Firmware/STM32/OBJ/main.d b/2.Firmware/STM32/OBJ/main.d
new file mode 100644
index 0000000..16022da
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/main.d
@@ -0,0 +1,44 @@
+..\obj\main.o: main.c
+..\obj\main.o: hw_config.h
+..\obj\main.o: platform_config.h
+..\obj\main.o: .\Driver\platform_common.h
+..\obj\main.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\main.o: .\cmsis\core_cm3.h
+..\obj\main.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\main.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\main.o: ..\Firmware\stm32f10x_conf.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\main.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\main.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\main.o: .\stm_lib\inc\misc.h
+..\obj\main.o: .\stm_usb\inc\usb_type.h
+..\obj\main.o: .\usb\inc\usb_conf.h
+..\obj\main.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\main.o: .\stm_usb\inc\usb_lib.h
+..\obj\main.o: .\stm_usb\inc\usb_regs.h
+..\obj\main.o: .\stm_usb\inc\usb_def.h
+..\obj\main.o: .\stm_usb\inc\usb_core.h
+..\obj\main.o: .\stm_usb\inc\usb_init.h
+..\obj\main.o: .\stm_usb\inc\usb_sil.h
+..\obj\main.o: .\stm_usb\inc\usb_mem.h
+..\obj\main.o: .\stm_usb\inc\usb_int.h
+..\obj\main.o: .\SYSTEM\delay\delay.h
+..\obj\main.o: .\SYSTEM\usart\usart.h
+..\obj\main.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdio.h
+..\obj\main.o: .\SYSTEM\sys\sys.h
+..\obj\main.o: .\usb\inc\usb_pwr.h
+..\obj\main.o: .\sensor\calibrate.h
+..\obj\main.o: .\sensor\senddata.h
+..\obj\main.o: .\Driver\gpio.h
+..\obj\main.o: .\Driver\led.h
+..\obj\main.o: .\sensor\mpu6500.h
+..\obj\main.o: .\sensor\lis3mdl.h
+..\obj\main.o: .\Driver\spi.h
+..\obj\main.o: .\sensor\time.h
diff --git a/2.Firmware/STM32/OBJ/main.o b/2.Firmware/STM32/OBJ/main.o
new file mode 100644
index 0000000..385de34
Binary files /dev/null and b/2.Firmware/STM32/OBJ/main.o differ
diff --git a/2.Firmware/STM32/OBJ/misc.crf b/2.Firmware/STM32/OBJ/misc.crf
new file mode 100644
index 0000000..b1d8a03
Binary files /dev/null and b/2.Firmware/STM32/OBJ/misc.crf differ
diff --git a/2.Firmware/STM32/OBJ/misc.d b/2.Firmware/STM32/OBJ/misc.d
new file mode 100644
index 0000000..2d74ed7
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/misc.d
@@ -0,0 +1,18 @@
+..\obj\misc.o: stm_lib\src\misc.c
+..\obj\misc.o: .\stm_lib\inc\misc.h
+..\obj\misc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\misc.o: .\cmsis\core_cm3.h
+..\obj\misc.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\misc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\misc.o: ..\Firmware\stm32f10x_conf.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\misc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\misc.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\misc.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/misc.o b/2.Firmware/STM32/OBJ/misc.o
new file mode 100644
index 0000000..b5860b9
Binary files /dev/null and b/2.Firmware/STM32/OBJ/misc.o differ
diff --git a/2.Firmware/STM32/OBJ/mpu6500.crf b/2.Firmware/STM32/OBJ/mpu6500.crf
new file mode 100644
index 0000000..ef0c254
Binary files /dev/null and b/2.Firmware/STM32/OBJ/mpu6500.crf differ
diff --git a/2.Firmware/STM32/OBJ/mpu6500.d b/2.Firmware/STM32/OBJ/mpu6500.d
new file mode 100644
index 0000000..32d10b0
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/mpu6500.d
@@ -0,0 +1,25 @@
+..\obj\mpu6500.o: sensor\mpu6500.c
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\mpu6500.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\mpu6500.o: .\cmsis\core_cm3.h
+..\obj\mpu6500.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\mpu6500.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\mpu6500.o: ..\Firmware\stm32f10x_conf.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\mpu6500.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\mpu6500.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\mpu6500.o: .\stm_lib\inc\misc.h
+..\obj\mpu6500.o: sensor\mpu6500_register_map.h
+..\obj\mpu6500.o: sensor\MPU6500.h
+..\obj\mpu6500.o: .\SYSTEM\sys\sys.h
+..\obj\mpu6500.o: .\SYSTEM\delay\delay.h
+..\obj\mpu6500.o: .\Driver\spi.h
+..\obj\mpu6500.o: sensor\calibrate.h
+..\obj\mpu6500.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
diff --git a/2.Firmware/STM32/OBJ/mpu6500.o b/2.Firmware/STM32/OBJ/mpu6500.o
new file mode 100644
index 0000000..bb5c332
Binary files /dev/null and b/2.Firmware/STM32/OBJ/mpu6500.o differ
diff --git a/2.Firmware/STM32/OBJ/senddata.crf b/2.Firmware/STM32/OBJ/senddata.crf
new file mode 100644
index 0000000..d990b52
Binary files /dev/null and b/2.Firmware/STM32/OBJ/senddata.crf differ
diff --git a/2.Firmware/STM32/OBJ/senddata.d b/2.Firmware/STM32/OBJ/senddata.d
new file mode 100644
index 0000000..07cf44a
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/senddata.d
@@ -0,0 +1,36 @@
+..\obj\senddata.o: sensor\senddata.c
+..\obj\senddata.o: sensor\senddata.h
+..\obj\senddata.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\senddata.o: .\stm_usb\inc\usb_lib.h
+..\obj\senddata.o: ..\Firmware\hw_config.h
+..\obj\senddata.o: ..\Firmware\platform_config.h
+..\obj\senddata.o: .\Driver\platform_common.h
+..\obj\senddata.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\senddata.o: .\cmsis\core_cm3.h
+..\obj\senddata.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\senddata.o: ..\Firmware\stm32f10x_conf.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\senddata.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\senddata.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\senddata.o: .\stm_lib\inc\misc.h
+..\obj\senddata.o: .\stm_usb\inc\usb_type.h
+..\obj\senddata.o: .\usb\inc\usb_conf.h
+..\obj\senddata.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\senddata.o: .\stm_usb\inc\usb_regs.h
+..\obj\senddata.o: .\stm_usb\inc\usb_def.h
+..\obj\senddata.o: .\stm_usb\inc\usb_core.h
+..\obj\senddata.o: .\stm_usb\inc\usb_init.h
+..\obj\senddata.o: .\stm_usb\inc\usb_sil.h
+..\obj\senddata.o: .\stm_usb\inc\usb_mem.h
+..\obj\senddata.o: .\stm_usb\inc\usb_int.h
+..\obj\senddata.o: .\SYSTEM\delay\delay.h
+..\obj\senddata.o: sensor\mpu6500.h
+..\obj\senddata.o: sensor\lis3mdl.h
+..\obj\senddata.o: sensor\calibrate.h
diff --git a/2.Firmware/STM32/OBJ/senddata.o b/2.Firmware/STM32/OBJ/senddata.o
new file mode 100644
index 0000000..dd21813
Binary files /dev/null and b/2.Firmware/STM32/OBJ/senddata.o differ
diff --git a/2.Firmware/STM32/OBJ/spi.crf b/2.Firmware/STM32/OBJ/spi.crf
new file mode 100644
index 0000000..a3030de
Binary files /dev/null and b/2.Firmware/STM32/OBJ/spi.crf differ
diff --git a/2.Firmware/STM32/OBJ/spi.d b/2.Firmware/STM32/OBJ/spi.d
new file mode 100644
index 0000000..ee0d430
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/spi.d
@@ -0,0 +1,21 @@
+..\obj\spi.o: driver\spi.c
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\spi.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\spi.o: .\cmsis\core_cm3.h
+..\obj\spi.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\spi.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\spi.o: ..\Firmware\stm32f10x_conf.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\spi.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\spi.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\spi.o: .\stm_lib\inc\misc.h
+..\obj\spi.o: driver\spi.h
+..\obj\spi.o: .\SYSTEM\sys\sys.h
+..\obj\spi.o: .\SYSTEM\delay\delay.h
diff --git a/2.Firmware/STM32/OBJ/spi.o b/2.Firmware/STM32/OBJ/spi.o
new file mode 100644
index 0000000..e6c2f81
Binary files /dev/null and b/2.Firmware/STM32/OBJ/spi.o differ
diff --git a/2.Firmware/STM32/OBJ/startup_stm32f10x_md.d b/2.Firmware/STM32/OBJ/startup_stm32f10x_md.d
new file mode 100644
index 0000000..b38b3f9
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/startup_stm32f10x_md.d
@@ -0,0 +1 @@
+..\obj\startup_stm32f10x_md.o: cmsis_boot\startup\startup_stm32f10x_md.s
diff --git a/2.Firmware/STM32/OBJ/startup_stm32f10x_md.o b/2.Firmware/STM32/OBJ/startup_stm32f10x_md.o
new file mode 100644
index 0000000..b3b8e6c
Binary files /dev/null and b/2.Firmware/STM32/OBJ/startup_stm32f10x_md.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32_it.crf b/2.Firmware/STM32/OBJ/stm32_it.crf
new file mode 100644
index 0000000..db23243
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32_it.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32_it.d b/2.Firmware/STM32/OBJ/stm32_it.d
new file mode 100644
index 0000000..4703257
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32_it.d
@@ -0,0 +1,35 @@
+..\obj\stm32_it.o: stm32_it.c
+..\obj\stm32_it.o: stm32_it.h
+..\obj\stm32_it.o: platform_config.h
+..\obj\stm32_it.o: .\Driver\platform_common.h
+..\obj\stm32_it.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32_it.o: .\cmsis\core_cm3.h
+..\obj\stm32_it.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32_it.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32_it.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32_it.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32_it.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32_it.o: .\stm_lib\inc\misc.h
+..\obj\stm32_it.o: .\usb\inc\usb_istr.h
+..\obj\stm32_it.o: .\usb\inc\usb_conf.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_lib.h
+..\obj\stm32_it.o: ..\Firmware\hw_config.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_type.h
+..\obj\stm32_it.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_regs.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_def.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_core.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_init.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_sil.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_mem.h
+..\obj\stm32_it.o: .\stm_usb\inc\usb_int.h
+..\obj\stm32_it.o: .\usb\inc\usb_pwr.h
+..\obj\stm32_it.o: .\SYSTEM\delay\delay.h
diff --git a/2.Firmware/STM32/OBJ/stm32_it.o b/2.Firmware/STM32/OBJ/stm32_it.o
new file mode 100644
index 0000000..d53408b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32_it.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_adc.crf b/2.Firmware/STM32/OBJ/stm32f10x_adc.crf
new file mode 100644
index 0000000..a827d2b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_adc.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_adc.d b/2.Firmware/STM32/OBJ/stm32f10x_adc.d
new file mode 100644
index 0000000..5cea5a7
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_adc.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_adc.o: stm_lib\src\stm32f10x_adc.c
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_adc.h
+..\obj\stm32f10x_adc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_adc.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_adc.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_adc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_adc.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_adc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_adc.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_adc.o b/2.Firmware/STM32/OBJ/stm32f10x_adc.o
new file mode 100644
index 0000000..e88e446
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_adc.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.crf b/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.crf
new file mode 100644
index 0000000..9583a85
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.d b/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.d
new file mode 100644
index 0000000..29b371b
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_dbgmcu.o: stm_lib\src\stm32f10x_dbgmcu.c
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_dbgmcu.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_dbgmcu.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_dbgmcu.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_dbgmcu.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_dbgmcu.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_dbgmcu.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_dbgmcu.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.o b/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.o
new file mode 100644
index 0000000..cd770ef
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_dbgmcu.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_dma.crf b/2.Firmware/STM32/OBJ/stm32f10x_dma.crf
new file mode 100644
index 0000000..dcc8bbf
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_dma.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_dma.d b/2.Firmware/STM32/OBJ/stm32f10x_dma.d
new file mode 100644
index 0000000..5210093
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_dma.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_dma.o: stm_lib\src\stm32f10x_dma.c
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_dma.h
+..\obj\stm32f10x_dma.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_dma.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_dma.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_dma.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_dma.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_dma.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_dma.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_dma.o b/2.Firmware/STM32/OBJ/stm32f10x_dma.o
new file mode 100644
index 0000000..2cece25
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_dma.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_exti.crf b/2.Firmware/STM32/OBJ/stm32f10x_exti.crf
new file mode 100644
index 0000000..c0e03be
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_exti.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_exti.d b/2.Firmware/STM32/OBJ/stm32f10x_exti.d
new file mode 100644
index 0000000..c3202e2
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_exti.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_exti.o: stm_lib\src\stm32f10x_exti.c
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_exti.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_exti.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_exti.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_exti.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_exti.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_exti.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_exti.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_exti.o b/2.Firmware/STM32/OBJ/stm32f10x_exti.o
new file mode 100644
index 0000000..e06c787
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_exti.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_flash.crf b/2.Firmware/STM32/OBJ/stm32f10x_flash.crf
new file mode 100644
index 0000000..c99b19b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_flash.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_flash.d b/2.Firmware/STM32/OBJ/stm32f10x_flash.d
new file mode 100644
index 0000000..9bea5bc
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_flash.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_flash.o: stm_lib\src\stm32f10x_flash.c
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_flash.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_flash.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_flash.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_flash.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_flash.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_flash.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_flash.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_flash.o b/2.Firmware/STM32/OBJ/stm32f10x_flash.o
new file mode 100644
index 0000000..bc41ac5
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_flash.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_gpio.crf b/2.Firmware/STM32/OBJ/stm32f10x_gpio.crf
new file mode 100644
index 0000000..63da10f
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_gpio.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_gpio.d b/2.Firmware/STM32/OBJ/stm32f10x_gpio.d
new file mode 100644
index 0000000..5d1c429
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_gpio.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_gpio.o: stm_lib\src\stm32f10x_gpio.c
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_gpio.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_gpio.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_gpio.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_gpio.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_gpio.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_gpio.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_gpio.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_gpio.o b/2.Firmware/STM32/OBJ/stm32f10x_gpio.o
new file mode 100644
index 0000000..34274d5
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_gpio.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_i2c.crf b/2.Firmware/STM32/OBJ/stm32f10x_i2c.crf
new file mode 100644
index 0000000..ea71a0b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_i2c.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_i2c.d b/2.Firmware/STM32/OBJ/stm32f10x_i2c.d
new file mode 100644
index 0000000..44fbdb3
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_i2c.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_i2c.o: stm_lib\src\stm32f10x_i2c.c
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_i2c.h
+..\obj\stm32f10x_i2c.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_i2c.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_i2c.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_i2c.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_i2c.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_i2c.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_i2c.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_i2c.o b/2.Firmware/STM32/OBJ/stm32f10x_i2c.o
new file mode 100644
index 0000000..5544948
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_i2c.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_pwr.crf b/2.Firmware/STM32/OBJ/stm32f10x_pwr.crf
new file mode 100644
index 0000000..7b0664e
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_pwr.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_pwr.d b/2.Firmware/STM32/OBJ/stm32f10x_pwr.d
new file mode 100644
index 0000000..2563c33
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_pwr.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_pwr.o: stm_lib\src\stm32f10x_pwr.c
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_pwr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_pwr.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_pwr.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_pwr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_pwr.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_pwr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_pwr.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_pwr.o b/2.Firmware/STM32/OBJ/stm32f10x_pwr.o
new file mode 100644
index 0000000..98f206b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_pwr.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_rcc.crf b/2.Firmware/STM32/OBJ/stm32f10x_rcc.crf
new file mode 100644
index 0000000..e89aef8
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_rcc.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_rcc.d b/2.Firmware/STM32/OBJ/stm32f10x_rcc.d
new file mode 100644
index 0000000..28fdc86
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_rcc.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_rcc.o: stm_lib\src\stm32f10x_rcc.c
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_rcc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_rcc.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_rcc.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_rcc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_rcc.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_rcc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_rcc.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_rcc.o b/2.Firmware/STM32/OBJ/stm32f10x_rcc.o
new file mode 100644
index 0000000..252d199
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_rcc.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_spi.crf b/2.Firmware/STM32/OBJ/stm32f10x_spi.crf
new file mode 100644
index 0000000..18bbabe
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_spi.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_spi.d b/2.Firmware/STM32/OBJ/stm32f10x_spi.d
new file mode 100644
index 0000000..e65c5dd
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_spi.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_spi.o: stm_lib\src\stm32f10x_spi.c
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_spi.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_spi.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_spi.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_spi.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_spi.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_spi.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_spi.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_spi.o b/2.Firmware/STM32/OBJ/stm32f10x_spi.o
new file mode 100644
index 0000000..a8b5e16
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_spi.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_tim.crf b/2.Firmware/STM32/OBJ/stm32f10x_tim.crf
new file mode 100644
index 0000000..9e76a2a
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_tim.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_tim.d b/2.Firmware/STM32/OBJ/stm32f10x_tim.d
new file mode 100644
index 0000000..4a6e29c
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_tim.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_tim.o: stm_lib\src\stm32f10x_tim.c
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_tim.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_tim.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_tim.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_tim.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_tim.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_tim.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_tim.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_tim.o b/2.Firmware/STM32/OBJ/stm32f10x_tim.o
new file mode 100644
index 0000000..de55562
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_tim.o differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_usart.crf b/2.Firmware/STM32/OBJ/stm32f10x_usart.crf
new file mode 100644
index 0000000..eeea19d
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_usart.crf differ
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_usart.d b/2.Firmware/STM32/OBJ/stm32f10x_usart.d
new file mode 100644
index 0000000..0eeedcf
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stm32f10x_usart.d
@@ -0,0 +1,18 @@
+..\obj\stm32f10x_usart.o: stm_lib\src\stm32f10x_usart.c
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_usart.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_usart.o: .\cmsis\core_cm3.h
+..\obj\stm32f10x_usart.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stm32f10x_usart.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stm32f10x_usart.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stm32f10x_usart.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stm32f10x_usart.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/stm32f10x_usart.o b/2.Firmware/STM32/OBJ/stm32f10x_usart.o
new file mode 100644
index 0000000..3bfc0c3
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stm32f10x_usart.o differ
diff --git a/2.Firmware/STM32/OBJ/stmflash.crf b/2.Firmware/STM32/OBJ/stmflash.crf
new file mode 100644
index 0000000..d348ab8
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stmflash.crf differ
diff --git a/2.Firmware/STM32/OBJ/stmflash.d b/2.Firmware/STM32/OBJ/stmflash.d
new file mode 100644
index 0000000..fed419a
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/stmflash.d
@@ -0,0 +1,22 @@
+..\obj\stmflash.o: driver\stmflash.c
+..\obj\stmflash.o: driver\stmflash.h
+..\obj\stmflash.o: .\SYSTEM\sys\sys.h
+..\obj\stmflash.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stmflash.o: .\cmsis\core_cm3.h
+..\obj\stmflash.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\stmflash.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\stmflash.o: ..\Firmware\stm32f10x_conf.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\stmflash.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\stmflash.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\stmflash.o: .\stm_lib\inc\misc.h
+..\obj\stmflash.o: .\SYSTEM\delay\delay.h
+..\obj\stmflash.o: .\SYSTEM\usart\usart.h
+..\obj\stmflash.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdio.h
diff --git a/2.Firmware/STM32/OBJ/stmflash.o b/2.Firmware/STM32/OBJ/stmflash.o
new file mode 100644
index 0000000..83ed78b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/stmflash.o differ
diff --git a/2.Firmware/STM32/OBJ/sys.crf b/2.Firmware/STM32/OBJ/sys.crf
new file mode 100644
index 0000000..4a8566d
Binary files /dev/null and b/2.Firmware/STM32/OBJ/sys.crf differ
diff --git a/2.Firmware/STM32/OBJ/sys.d b/2.Firmware/STM32/OBJ/sys.d
new file mode 100644
index 0000000..d93d0d2
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/sys.d
@@ -0,0 +1,19 @@
+..\obj\sys.o: SYSTEM\sys\sys.c
+..\obj\sys.o: SYSTEM\sys\sys.h
+..\obj\sys.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\sys.o: .\cmsis\core_cm3.h
+..\obj\sys.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\sys.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\sys.o: ..\Firmware\stm32f10x_conf.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\sys.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\sys.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\sys.o: .\stm_lib\inc\misc.h
+..\obj\sys.o: .\SYSTEM\delay\delay.h
diff --git a/2.Firmware/STM32/OBJ/sys.o b/2.Firmware/STM32/OBJ/sys.o
new file mode 100644
index 0000000..d76d54f
Binary files /dev/null and b/2.Firmware/STM32/OBJ/sys.o differ
diff --git a/2.Firmware/STM32/OBJ/system_stm32f10x.crf b/2.Firmware/STM32/OBJ/system_stm32f10x.crf
new file mode 100644
index 0000000..c35b04b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/system_stm32f10x.crf differ
diff --git a/2.Firmware/STM32/OBJ/system_stm32f10x.d b/2.Firmware/STM32/OBJ/system_stm32f10x.d
new file mode 100644
index 0000000..33db249
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/system_stm32f10x.d
@@ -0,0 +1,17 @@
+..\obj\system_stm32f10x.o: cmsis_boot\system_stm32f10x.c
+..\obj\system_stm32f10x.o: cmsis_boot\stm32f10x.h
+..\obj\system_stm32f10x.o: .\cmsis\core_cm3.h
+..\obj\system_stm32f10x.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\system_stm32f10x.o: cmsis_boot\system_stm32f10x.h
+..\obj\system_stm32f10x.o: cmsis_boot\stm32f10x_conf.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\system_stm32f10x.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\system_stm32f10x.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/system_stm32f10x.o b/2.Firmware/STM32/OBJ/system_stm32f10x.o
new file mode 100644
index 0000000..442a8f3
Binary files /dev/null and b/2.Firmware/STM32/OBJ/system_stm32f10x.o differ
diff --git a/2.Firmware/STM32/OBJ/time.crf b/2.Firmware/STM32/OBJ/time.crf
new file mode 100644
index 0000000..7c83367
Binary files /dev/null and b/2.Firmware/STM32/OBJ/time.crf differ
diff --git a/2.Firmware/STM32/OBJ/time.d b/2.Firmware/STM32/OBJ/time.d
new file mode 100644
index 0000000..18854e3
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/time.d
@@ -0,0 +1,18 @@
+..\obj\time.o: sensor\time.c
+..\obj\time.o: sensor\time.h
+..\obj\time.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\time.o: .\cmsis\core_cm3.h
+..\obj\time.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\time.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\time.o: ..\Firmware\stm32f10x_conf.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\time.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\time.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\time.o: .\stm_lib\inc\misc.h
diff --git a/2.Firmware/STM32/OBJ/time.o b/2.Firmware/STM32/OBJ/time.o
new file mode 100644
index 0000000..86af7b5
Binary files /dev/null and b/2.Firmware/STM32/OBJ/time.o differ
diff --git a/2.Firmware/STM32/OBJ/usart.crf b/2.Firmware/STM32/OBJ/usart.crf
new file mode 100644
index 0000000..9e89ff6
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usart.crf differ
diff --git a/2.Firmware/STM32/OBJ/usart.d b/2.Firmware/STM32/OBJ/usart.d
new file mode 100644
index 0000000..371fa75
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usart.d
@@ -0,0 +1,21 @@
+..\obj\usart.o: SYSTEM\usart\usart.c
+..\obj\usart.o: .\SYSTEM\sys\sys.h
+..\obj\usart.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usart.o: .\cmsis\core_cm3.h
+..\obj\usart.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usart.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usart.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usart.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usart.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usart.o: .\stm_lib\inc\misc.h
+..\obj\usart.o: .\SYSTEM\delay\delay.h
+..\obj\usart.o: SYSTEM\usart\usart.h
+..\obj\usart.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdio.h
diff --git a/2.Firmware/STM32/OBJ/usart.o b/2.Firmware/STM32/OBJ/usart.o
new file mode 100644
index 0000000..e493249
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usart.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_core.crf b/2.Firmware/STM32/OBJ/usb_core.crf
new file mode 100644
index 0000000..2637e70
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_core.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_core.d b/2.Firmware/STM32/OBJ/usb_core.d
new file mode 100644
index 0000000..c29ca76
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_core.d
@@ -0,0 +1,31 @@
+..\obj\usb_core.o: stm_usb\src\usb_core.c
+..\obj\usb_core.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_core.o: ..\Firmware\hw_config.h
+..\obj\usb_core.o: ..\Firmware\platform_config.h
+..\obj\usb_core.o: .\Driver\platform_common.h
+..\obj\usb_core.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_core.o: .\cmsis\core_cm3.h
+..\obj\usb_core.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_core.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_core.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_core.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_core.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_core.o: .\stm_lib\inc\misc.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_core.o: .\usb\inc\usb_conf.h
+..\obj\usb_core.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_core.o: .\stm_usb\inc\usb_int.h
diff --git a/2.Firmware/STM32/OBJ/usb_core.o b/2.Firmware/STM32/OBJ/usb_core.o
new file mode 100644
index 0000000..577bb4e
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_core.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_desc.crf b/2.Firmware/STM32/OBJ/usb_desc.crf
new file mode 100644
index 0000000..2298ff0
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_desc.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_desc.d b/2.Firmware/STM32/OBJ/usb_desc.d
new file mode 100644
index 0000000..e00b016
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_desc.d
@@ -0,0 +1,32 @@
+..\obj\usb_desc.o: usb\src\usb_desc.c
+..\obj\usb_desc.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_desc.o: ..\Firmware\hw_config.h
+..\obj\usb_desc.o: ..\Firmware\platform_config.h
+..\obj\usb_desc.o: .\Driver\platform_common.h
+..\obj\usb_desc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_desc.o: .\cmsis\core_cm3.h
+..\obj\usb_desc.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_desc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_desc.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_desc.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_desc.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_desc.o: .\stm_lib\inc\misc.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_desc.o: .\usb\inc\usb_conf.h
+..\obj\usb_desc.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_desc.o: .\stm_usb\inc\usb_int.h
+..\obj\usb_desc.o: .\usb\inc\usb_desc.h
diff --git a/2.Firmware/STM32/OBJ/usb_desc.o b/2.Firmware/STM32/OBJ/usb_desc.o
new file mode 100644
index 0000000..a3ac13c
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_desc.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_endp.crf b/2.Firmware/STM32/OBJ/usb_endp.crf
new file mode 100644
index 0000000..3e98b05
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_endp.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_endp.d b/2.Firmware/STM32/OBJ/usb_endp.d
new file mode 100644
index 0000000..c9daed1
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_endp.d
@@ -0,0 +1,33 @@
+..\obj\usb_endp.o: usb\src\usb_endp.c
+..\obj\usb_endp.o: ..\Firmware\hw_config.h
+..\obj\usb_endp.o: ..\Firmware\platform_config.h
+..\obj\usb_endp.o: .\Driver\platform_common.h
+..\obj\usb_endp.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_endp.o: .\cmsis\core_cm3.h
+..\obj\usb_endp.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_endp.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_endp.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_endp.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_endp.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_endp.o: .\stm_lib\inc\misc.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_endp.o: .\usb\inc\usb_conf.h
+..\obj\usb_endp.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_endp.o: .\stm_usb\inc\usb_int.h
+..\obj\usb_endp.o: .\usb\inc\usb_istr.h
+..\obj\usb_endp.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\string.h
diff --git a/2.Firmware/STM32/OBJ/usb_endp.o b/2.Firmware/STM32/OBJ/usb_endp.o
new file mode 100644
index 0000000..f59207e
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_endp.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_init.crf b/2.Firmware/STM32/OBJ/usb_init.crf
new file mode 100644
index 0000000..f93b50b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_init.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_init.d b/2.Firmware/STM32/OBJ/usb_init.d
new file mode 100644
index 0000000..64acf52
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_init.d
@@ -0,0 +1,31 @@
+..\obj\usb_init.o: stm_usb\src\usb_init.c
+..\obj\usb_init.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_init.o: ..\Firmware\hw_config.h
+..\obj\usb_init.o: ..\Firmware\platform_config.h
+..\obj\usb_init.o: .\Driver\platform_common.h
+..\obj\usb_init.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_init.o: .\cmsis\core_cm3.h
+..\obj\usb_init.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_init.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_init.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_init.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_init.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_init.o: .\stm_lib\inc\misc.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_init.o: .\usb\inc\usb_conf.h
+..\obj\usb_init.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_init.o: .\stm_usb\inc\usb_int.h
diff --git a/2.Firmware/STM32/OBJ/usb_init.o b/2.Firmware/STM32/OBJ/usb_init.o
new file mode 100644
index 0000000..d011f94
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_init.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_int.crf b/2.Firmware/STM32/OBJ/usb_int.crf
new file mode 100644
index 0000000..3dcc2af
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_int.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_int.d b/2.Firmware/STM32/OBJ/usb_int.d
new file mode 100644
index 0000000..e1e8ecf
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_int.d
@@ -0,0 +1,31 @@
+..\obj\usb_int.o: stm_usb\src\usb_int.c
+..\obj\usb_int.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_int.o: ..\Firmware\hw_config.h
+..\obj\usb_int.o: ..\Firmware\platform_config.h
+..\obj\usb_int.o: .\Driver\platform_common.h
+..\obj\usb_int.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_int.o: .\cmsis\core_cm3.h
+..\obj\usb_int.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_int.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_int.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_int.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_int.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_int.o: .\stm_lib\inc\misc.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_int.o: .\usb\inc\usb_conf.h
+..\obj\usb_int.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_int.o: .\stm_usb\inc\usb_int.h
diff --git a/2.Firmware/STM32/OBJ/usb_int.o b/2.Firmware/STM32/OBJ/usb_int.o
new file mode 100644
index 0000000..2cf2883
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_int.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_istr.crf b/2.Firmware/STM32/OBJ/usb_istr.crf
new file mode 100644
index 0000000..315a3f2
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_istr.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_istr.d b/2.Firmware/STM32/OBJ/usb_istr.d
new file mode 100644
index 0000000..159516b
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_istr.d
@@ -0,0 +1,34 @@
+..\obj\usb_istr.o: usb\src\usb_istr.c
+..\obj\usb_istr.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_istr.o: ..\Firmware\hw_config.h
+..\obj\usb_istr.o: ..\Firmware\platform_config.h
+..\obj\usb_istr.o: .\Driver\platform_common.h
+..\obj\usb_istr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_istr.o: .\cmsis\core_cm3.h
+..\obj\usb_istr.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_istr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_istr.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_istr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_istr.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_istr.o: .\stm_lib\inc\misc.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_istr.o: .\usb\inc\usb_conf.h
+..\obj\usb_istr.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_istr.o: .\stm_usb\inc\usb_int.h
+..\obj\usb_istr.o: .\usb\inc\usb_prop.h
+..\obj\usb_istr.o: .\usb\inc\usb_pwr.h
+..\obj\usb_istr.o: .\usb\inc\usb_istr.h
diff --git a/2.Firmware/STM32/OBJ/usb_istr.o b/2.Firmware/STM32/OBJ/usb_istr.o
new file mode 100644
index 0000000..5c3e434
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_istr.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_mem.crf b/2.Firmware/STM32/OBJ/usb_mem.crf
new file mode 100644
index 0000000..78ffbbe
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_mem.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_mem.d b/2.Firmware/STM32/OBJ/usb_mem.d
new file mode 100644
index 0000000..125b5e5
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_mem.d
@@ -0,0 +1,31 @@
+..\obj\usb_mem.o: stm_usb\src\usb_mem.c
+..\obj\usb_mem.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_mem.o: ..\Firmware\hw_config.h
+..\obj\usb_mem.o: ..\Firmware\platform_config.h
+..\obj\usb_mem.o: .\Driver\platform_common.h
+..\obj\usb_mem.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_mem.o: .\cmsis\core_cm3.h
+..\obj\usb_mem.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_mem.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_mem.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_mem.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_mem.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_mem.o: .\stm_lib\inc\misc.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_mem.o: .\usb\inc\usb_conf.h
+..\obj\usb_mem.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_mem.o: .\stm_usb\inc\usb_int.h
diff --git a/2.Firmware/STM32/OBJ/usb_mem.o b/2.Firmware/STM32/OBJ/usb_mem.o
new file mode 100644
index 0000000..f6d080b
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_mem.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_prop.crf b/2.Firmware/STM32/OBJ/usb_prop.crf
new file mode 100644
index 0000000..867ca00
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_prop.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_prop.d b/2.Firmware/STM32/OBJ/usb_prop.d
new file mode 100644
index 0000000..1cdf829
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_prop.d
@@ -0,0 +1,36 @@
+..\obj\usb_prop.o: usb\src\usb_prop.c
+..\obj\usb_prop.o: ..\Firmware\hw_config.h
+..\obj\usb_prop.o: ..\Firmware\platform_config.h
+..\obj\usb_prop.o: .\Driver\platform_common.h
+..\obj\usb_prop.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_prop.o: .\cmsis\core_cm3.h
+..\obj\usb_prop.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_prop.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_prop.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_prop.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_prop.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_prop.o: .\stm_lib\inc\misc.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_prop.o: .\usb\inc\usb_conf.h
+..\obj\usb_prop.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_prop.o: .\stm_usb\inc\usb_int.h
+..\obj\usb_prop.o: .\usb\inc\usb_prop.h
+..\obj\usb_prop.o: .\usb\inc\usb_desc.h
+..\obj\usb_prop.o: .\usb\inc\usb_pwr.h
+..\obj\usb_prop.o: .\Driver\feature_config.h
+..\obj\usb_prop.o: .\sensor\calibrate.h
diff --git a/2.Firmware/STM32/OBJ/usb_prop.o b/2.Firmware/STM32/OBJ/usb_prop.o
new file mode 100644
index 0000000..40b3dfe
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_prop.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_pwr.crf b/2.Firmware/STM32/OBJ/usb_pwr.crf
new file mode 100644
index 0000000..48f5273
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_pwr.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_pwr.d b/2.Firmware/STM32/OBJ/usb_pwr.d
new file mode 100644
index 0000000..54e0061
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_pwr.d
@@ -0,0 +1,32 @@
+..\obj\usb_pwr.o: usb\src\usb_pwr.c
+..\obj\usb_pwr.o: ..\Firmware\hw_config.h
+..\obj\usb_pwr.o: ..\Firmware\platform_config.h
+..\obj\usb_pwr.o: .\Driver\platform_common.h
+..\obj\usb_pwr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_pwr.o: .\cmsis\core_cm3.h
+..\obj\usb_pwr.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_pwr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_pwr.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_pwr.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_pwr.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_pwr.o: .\stm_lib\inc\misc.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_pwr.o: .\usb\inc\usb_conf.h
+..\obj\usb_pwr.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_pwr.o: .\stm_usb\inc\usb_int.h
+..\obj\usb_pwr.o: .\usb\inc\usb_pwr.h
diff --git a/2.Firmware/STM32/OBJ/usb_pwr.o b/2.Firmware/STM32/OBJ/usb_pwr.o
new file mode 100644
index 0000000..a586b90
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_pwr.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_regs.crf b/2.Firmware/STM32/OBJ/usb_regs.crf
new file mode 100644
index 0000000..f0d62b3
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_regs.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_regs.d b/2.Firmware/STM32/OBJ/usb_regs.d
new file mode 100644
index 0000000..77b288c
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_regs.d
@@ -0,0 +1,31 @@
+..\obj\usb_regs.o: stm_usb\src\usb_regs.c
+..\obj\usb_regs.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_regs.o: ..\Firmware\hw_config.h
+..\obj\usb_regs.o: ..\Firmware\platform_config.h
+..\obj\usb_regs.o: .\Driver\platform_common.h
+..\obj\usb_regs.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_regs.o: .\cmsis\core_cm3.h
+..\obj\usb_regs.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_regs.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_regs.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_regs.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_regs.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_regs.o: .\stm_lib\inc\misc.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_regs.o: .\usb\inc\usb_conf.h
+..\obj\usb_regs.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_regs.o: .\stm_usb\inc\usb_int.h
diff --git a/2.Firmware/STM32/OBJ/usb_regs.o b/2.Firmware/STM32/OBJ/usb_regs.o
new file mode 100644
index 0000000..ef35250
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_regs.o differ
diff --git a/2.Firmware/STM32/OBJ/usb_sil.crf b/2.Firmware/STM32/OBJ/usb_sil.crf
new file mode 100644
index 0000000..326aef2
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_sil.crf differ
diff --git a/2.Firmware/STM32/OBJ/usb_sil.d b/2.Firmware/STM32/OBJ/usb_sil.d
new file mode 100644
index 0000000..32fb951
--- /dev/null
+++ b/2.Firmware/STM32/OBJ/usb_sil.d
@@ -0,0 +1,31 @@
+..\obj\usb_sil.o: stm_usb\src\usb_sil.c
+..\obj\usb_sil.o: .\stm_usb\inc\usb_lib.h
+..\obj\usb_sil.o: ..\Firmware\hw_config.h
+..\obj\usb_sil.o: ..\Firmware\platform_config.h
+..\obj\usb_sil.o: .\Driver\platform_common.h
+..\obj\usb_sil.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_sil.o: .\cmsis\core_cm3.h
+..\obj\usb_sil.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdint.h
+..\obj\usb_sil.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\system_stm32f10x.h
+..\obj\usb_sil.o: ..\Firmware\stm32f10x_conf.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_dbgmcu.h
+..\obj\usb_sil.o: D:\Program Files\Keilv5\ARM\PACK\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_exti.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_flash.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_gpio.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_pwr.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_rcc.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_spi.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_tim.h
+..\obj\usb_sil.o: .\stm_lib\inc\stm32f10x_usart.h
+..\obj\usb_sil.o: .\stm_lib\inc\misc.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_type.h
+..\obj\usb_sil.o: .\usb\inc\usb_conf.h
+..\obj\usb_sil.o: D:\Program Files\Keilv5\ARM\ARMCC\Bin\..\include\stdbool.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_regs.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_def.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_core.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_init.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_sil.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_mem.h
+..\obj\usb_sil.o: .\stm_usb\inc\usb_int.h
diff --git a/2.Firmware/STM32/OBJ/usb_sil.o b/2.Firmware/STM32/OBJ/usb_sil.o
new file mode 100644
index 0000000..4844de7
Binary files /dev/null and b/2.Firmware/STM32/OBJ/usb_sil.o differ
diff --git a/2.Firmware/STM32/README.txt b/2.Firmware/STM32/README.txt
new file mode 100644
index 0000000..c8dba0f
--- /dev/null
+++ b/2.Firmware/STM32/README.txt
@@ -0,0 +1,2 @@
+* 2020/06/19:GeekIMU的STM32固件,采用Keil v4正常编译和使用
+* 2020/06/20:清理不用的文件,去掉Oculus相关无用文件
\ No newline at end of file
diff --git a/2.Firmware/STM32/clean.bat b/2.Firmware/STM32/clean.bat
new file mode 100644
index 0000000..accc110
--- /dev/null
+++ b/2.Firmware/STM32/clean.bat
@@ -0,0 +1,27 @@
+del *.bak /s
+del *.ddk /s
+del *.edk /s
+del *.lst /s
+del *.lnp /s
+del *.mpf /s
+del *.mpj /s
+del *.obj /s
+del *.omf /s
+::del *.opt /s ::不允许删除JLINK的设置
+del *.plg /s
+del *.rpt /s
+del *.tmp /s
+del *.__i /s
+del *.crf /s
+del *.o /s
+del *.d /s
+del *.axf /s
+del *.tra /s
+del *.dep /s
+del JLinkLog.txt /s
+
+del *.iex /s
+del *.htm /s
+del *.sct /s
+del *.map /s
+exit
diff --git a/3.Docs/Image/1.jpg b/3.Docs/Image/1.jpg
new file mode 100644
index 0000000..17937d1
Binary files /dev/null and b/3.Docs/Image/1.jpg differ
diff --git a/3.Docs/Image/2.jpg b/3.Docs/Image/2.jpg
new file mode 100644
index 0000000..eefc2cd
Binary files /dev/null and b/3.Docs/Image/2.jpg differ
diff --git a/3.Docs/Image/GeekIMU_Manager-Connect.png b/3.Docs/Image/GeekIMU_Manager-Connect.png
new file mode 100644
index 0000000..3791d6d
Binary files /dev/null and b/3.Docs/Image/GeekIMU_Manager-Connect.png differ
diff --git a/3.Docs/Image/GeekIMU_Manager-Disconnect.png b/3.Docs/Image/GeekIMU_Manager-Disconnect.png
new file mode 100644
index 0000000..43307ce
Binary files /dev/null and b/3.Docs/Image/GeekIMU_Manager-Disconnect.png differ
diff --git a/4.Software/DM_CalibrationTools.lnk b/4.Software/DM_CalibrationTools.lnk
new file mode 100644
index 0000000..8361f23
Binary files /dev/null and b/4.Software/DM_CalibrationTools.lnk differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/.vs/GEEKIMU Manager/v16/.suo b/4.Software/GeekIMU Manager GUI 1.0/.vs/GEEKIMU Manager/v16/.suo
new file mode 100644
index 0000000..021ffb8
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/.vs/GEEKIMU Manager/v16/.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.sln b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.sln
new file mode 100644
index 0000000..5edd7a0
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.sln
@@ -0,0 +1,31 @@
+锘
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32106.194
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GEEKIMU Manager", "GEEKIMU Manager\GEEKIMU Manager.csproj", "{58377382-2E93-4106-8AD5-E13A430802E5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|x86.ActiveCfg = Debug|x86
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|x86.Build.0 = Debug|x86
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|x86.ActiveCfg = Release|x86
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {CF11BC9C-A1BC-46AC-BE4B-0ABCE3E903EE}
+ EndGlobalSection
+EndGlobal
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.v11.suo b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.v11.suo
new file mode 100644
index 0000000..91bea1d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.v11.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.v12.suo b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.v12.suo
new file mode 100644
index 0000000..ade58dc
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager.v12.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/3rdparty/skin/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/3rdparty/skin/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/3rdparty/skin/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/App.config b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/App.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CSGL/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CaliAPI.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CaliAPI.cs
new file mode 100644
index 0000000..c43d0be
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/CaliAPI.cs
@@ -0,0 +1,69 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace DM_CalibrationTools
+{
+ struct Quaternion{
+ public float w, x, y, z;
+ };
+ struct mVector3
+ {
+ public float x, y, z;
+ };
+ struct MagCaliParam
+ {
+ public float xOffset;
+ public float yOffset;
+ public float zOffset;
+ public float xScale;
+ public float yScale;
+ public float zScale;
+ };
+ [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ class CaliAPI
+ {
+
+ [DllImport("libDM.dll", EntryPoint = "Init", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int InitCaliAPI([MarshalAs(UnmanagedType.LPStr)]string devpath);
+
+ [DllImport("libDM.dll", EntryPoint = "CheckDevice", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int CheckDevice();
+
+ [DllImport("libDM.dll", EntryPoint = "GyroCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int GyroCali();
+
+ [DllImport("libDM.dll", EntryPoint = "GetGyroCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static mVector3 GetGyroCali();
+
+ [DllImport("libDM.dll", EntryPoint = "GetMagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static MagCaliParam GetMagCali();
+
+ [DllImport("libDM.dll", EntryPoint = "MagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int MagCali();
+
+ [DllImport("libDM.dll", EntryPoint = "FinishMagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int FinishMagCali();
+
+ [DllImport("libDM.dll", EntryPoint = "SetMagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int SetMagCali(float x, float y, float z, float x0, float y0, float z0);
+
+ [DllImport("libDM.dll", EntryPoint = "CalculateMagParam", CallingConvention = CallingConvention.Cdecl)]
+ public extern static MagCaliParam CalculateMagParam();
+
+ [DllImport("libDM.dll", EntryPoint = "GetPoint", CallingConvention = CallingConvention.Cdecl)]
+ public extern static mVector3 GetPoint();
+
+ [DllImport("libDM.dll", EntryPoint = "GetEulerianAngle", CallingConvention = CallingConvention.Cdecl)]
+ public extern static mVector3 GetEulerianAngle();
+
+ [DllImport("libDM.dll", EntryPoint = "Correction", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int Correction();
+
+ [DllImport("libDM.dll", EntryPoint = "GetQuaternion", CallingConvention = CallingConvention.Cdecl)]
+ public extern static Quaternion GetQuaternion();
+
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/GEEKIMU Manager.csproj b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/GEEKIMU Manager.csproj
new file mode 100644
index 0000000..5b980fb
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/GEEKIMU Manager.csproj
@@ -0,0 +1,172 @@
+锘
+
+
+
+ Debug
+ AnyCPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}
+ WinExe
+ Properties
+ DM_CalibrationTools
+ DM_CalibrationTools
+ v4.5
+ 512
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ DM_CalibrationTools.Program
+
+
+ tools.ico
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE
+ full
+ x86
+ 7.3
+ prompt
+ true
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ 7.3
+ prompt
+ true
+
+
+
+ False
+ CSGL\SharpGL.dll
+
+
+ False
+ CSGL\SharpGL.SceneGraph.dll
+
+
+ False
+ CSGL\SharpGL.WinForms.dll
+
+
+ 3rdparty\skin\SkinForm.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ IMUConnect.cs
+
+
+ Form
+
+
+ IMUInformation.cs
+
+
+ Form
+
+
+ MainForms.cs
+
+
+
+
+
+ IMUConnect.cs
+
+
+ IMUInformation.cs
+
+
+ MainForms.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.Designer.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.Designer.cs
new file mode 100644
index 0000000..c1853e1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.Designer.cs
@@ -0,0 +1,112 @@
+锘縩amespace DM_CalibrationTools
+{
+ partial class IMUConnect
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.Btn_not_recognition = new System.Windows.Forms.Button();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("寰蒋闆呴粦", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(68)))), ((int)(((byte)(68)))), ((int)(((byte)(68)))));
+ this.label2.Location = new System.Drawing.Point(227, 437);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(544, 28);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "璇风敤USB杩炴帴IMU璁惧鎴栬呴噰鐢ㄦ棤绾挎帴鏀跺櫒杩炴帴IMU璁惧";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label1.Location = new System.Drawing.Point(379, 523);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(263, 17);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "浣跨敤涓亣鍒伴棶棰樿鍔犲叆鎶鏈敮鎸佺兢锛115438931";
+ //
+ // Btn_not_recognition
+ //
+ this.Btn_not_recognition.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.question_32px;
+ this.Btn_not_recognition.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.Btn_not_recognition.FlatAppearance.BorderSize = 0;
+ this.Btn_not_recognition.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_not_recognition.Font = new System.Drawing.Font("寰蒋闆呴粦", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_not_recognition.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(120)))), ((int)(((byte)(213)))));
+ this.Btn_not_recognition.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.Btn_not_recognition.Location = new System.Drawing.Point(785, 436);
+ this.Btn_not_recognition.Name = "Btn_not_recognition";
+ this.Btn_not_recognition.Size = new System.Drawing.Size(198, 32);
+ this.Btn_not_recognition.TabIndex = 3;
+ this.Btn_not_recognition.Text = "宸茬粡杩炴帴锛屼絾鏃犳硶璇嗗埆锛";
+ this.Btn_not_recognition.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.Btn_not_recognition.UseVisualStyleBackColor = true;
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Image = global::DM_CalibrationTools.Properties.Resources.usb_783px;
+ this.pictureBox1.Location = new System.Drawing.Point(332, 44);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(349, 359);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox1.TabIndex = 0;
+ this.pictureBox1.TabStop = false;
+ //
+ // IMUConnect
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(1027, 557);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.Btn_not_recognition);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.pictureBox1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Name = "IMUConnect";
+ this.Text = "IMUConnect";
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button Btn_not_recognition;
+ private System.Windows.Forms.Label label1;
+ }
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.cs
new file mode 100644
index 0000000..c8a03ae
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.cs
@@ -0,0 +1,20 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace DM_CalibrationTools
+{
+ public partial class IMUConnect : Form
+ {
+ public IMUConnect()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.resx b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUConnect.resx
@@ -0,0 +1,120 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.Designer.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.Designer.cs
new file mode 100644
index 0000000..14dd344
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.Designer.cs
@@ -0,0 +1,506 @@
+锘縩amespace DM_CalibrationTools
+{
+ partial class IMUInformation
+ {
+ ///
+ /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 娓呯悊鎵鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆
+ ///
+ /// 濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓 true锛涘惁鍒欎负 false銆
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 绐椾綋璁捐鍣ㄧ敓鎴愮殑浠g爜
+
+ ///
+ /// 璁捐鍣ㄦ敮鎸佹墍闇鐨勬柟娉 - 涓嶈
+ /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IMUInformation));
+ this.Gbox_OpenGL = new System.Windows.Forms.GroupBox();
+ this.GLpanel = new System.Windows.Forms.Panel();
+ this.openGLControl1 = new SharpGL.OpenGLControl();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.Panel_Bottom = new System.Windows.Forms.Panel();
+ this.button1 = new System.Windows.Forms.Button();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ this.linkLabel1 = new System.Windows.Forms.LinkLabel();
+ this.BtnShowAngle = new System.Windows.Forms.Button();
+ this.btnLoadorCali = new System.Windows.Forms.Button();
+ this.btnResetCalibrationData = new System.Windows.Forms.Button();
+ this.btnCalliGyro = new System.Windows.Forms.Button();
+ this.Panel_Sensor_Information = new System.Windows.Forms.Panel();
+ this.label9 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnMagCalibtation = new System.Windows.Forms.Button();
+ this.label_dev_name = new System.Windows.Forms.Label();
+ this.labelAngle = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.labelMagOffset = new System.Windows.Forms.Label();
+ this.labelGyroOffset = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
+ this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
+ this.Gbox_OpenGL.SuspendLayout();
+ this.GLpanel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.openGLControl1)).BeginInit();
+ this.Panel_Bottom.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.Panel_Sensor_Information.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // Gbox_OpenGL
+ //
+ this.Gbox_OpenGL.Controls.Add(this.GLpanel);
+ this.Gbox_OpenGL.Location = new System.Drawing.Point(7, 6);
+ this.Gbox_OpenGL.Name = "Gbox_OpenGL";
+ this.Gbox_OpenGL.Size = new System.Drawing.Size(698, 499);
+ this.Gbox_OpenGL.TabIndex = 7;
+ this.Gbox_OpenGL.TabStop = false;
+ this.Gbox_OpenGL.Text = "3D鏄剧ず";
+ //
+ // GLpanel
+ //
+ this.GLpanel.Controls.Add(this.openGLControl1);
+ this.GLpanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.GLpanel.Location = new System.Drawing.Point(3, 17);
+ this.GLpanel.Name = "GLpanel";
+ this.GLpanel.Size = new System.Drawing.Size(692, 479);
+ this.GLpanel.TabIndex = 10;
+ this.GLpanel.MouseEnter += new System.EventHandler(this.GLpanel_MouseEnter);
+ this.GLpanel.MouseLeave += new System.EventHandler(this.GLpanel_MouseLeave);
+ //
+ // openGLControl1
+ //
+ this.openGLControl1.BitDepth = 24;
+ this.openGLControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.openGLControl1.DrawFPS = true;
+ this.openGLControl1.FrameRate = 20;
+ this.openGLControl1.Location = new System.Drawing.Point(0, 0);
+ this.openGLControl1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.openGLControl1.Name = "openGLControl1";
+ this.openGLControl1.RenderContextType = SharpGL.RenderContextType.NativeWindow;
+ this.openGLControl1.Size = new System.Drawing.Size(692, 479);
+ this.openGLControl1.TabIndex = 0;
+ this.openGLControl1.OpenGLDraw += new System.Windows.Forms.PaintEventHandler(this.sceneControl1_OpenGLDraw);
+ this.openGLControl1.Resized += new System.EventHandler(this.sceneControl1_Resized);
+ this.openGLControl1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseDoubleClick);
+ this.openGLControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseDown);
+ this.openGLControl1.MouseEnter += new System.EventHandler(this.GLpanel_MouseEnter);
+ this.openGLControl1.MouseLeave += new System.EventHandler(this.GLpanel_MouseLeave);
+ this.openGLControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseMove);
+ this.openGLControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseUp);
+ //
+ // timer1
+ //
+ this.timer1.Enabled = true;
+ this.timer1.Interval = 50;
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // Panel_Bottom
+ //
+ this.Panel_Bottom.Controls.Add(this.button1);
+ this.Panel_Bottom.Controls.Add(this.pictureBox1);
+ this.Panel_Bottom.Controls.Add(this.linkLabel1);
+ this.Panel_Bottom.Controls.Add(this.BtnShowAngle);
+ this.Panel_Bottom.Controls.Add(this.btnLoadorCali);
+ this.Panel_Bottom.Controls.Add(this.btnResetCalibrationData);
+ this.Panel_Bottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.Panel_Bottom.Location = new System.Drawing.Point(0, 506);
+ this.Panel_Bottom.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.Panel_Bottom.Name = "Panel_Bottom";
+ this.Panel_Bottom.Size = new System.Drawing.Size(1027, 51);
+ this.Panel_Bottom.TabIndex = 12;
+ //
+ // button1
+ //
+ this.button1.BackgroundImage = global::DM_CalibrationTools.Properties.Resources._3d_32px;
+ this.button1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.button1.FlatAppearance.BorderSize = 0;
+ this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.button1.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.button1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.button1.Location = new System.Drawing.Point(13, 7);
+ this.button1.Margin = new System.Windows.Forms.Padding(0, 2, 2, 2);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(119, 32);
+ this.button1.TabIndex = 19;
+ this.button1.Text = "3D鍦烘櫙鏄剧ず";
+ this.button1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.button1.UseVisualStyleBackColor = true;
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Image = global::DM_CalibrationTools.Properties.Resources.link_48px;
+ this.pictureBox1.Location = new System.Drawing.Point(866, 7);
+ this.pictureBox1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(32, 32);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox1.TabIndex = 13;
+ this.pictureBox1.TabStop = false;
+ this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
+ //
+ // linkLabel1
+ //
+ this.linkLabel1.AutoSize = true;
+ this.linkLabel1.Font = new System.Drawing.Font("寰蒋闆呴粦", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.linkLabel1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.linkLabel1.LinkColor = System.Drawing.Color.Black;
+ this.linkLabel1.Location = new System.Drawing.Point(899, 12);
+ this.linkLabel1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.linkLabel1.Name = "linkLabel1";
+ this.linkLabel1.Size = new System.Drawing.Size(122, 21);
+ this.linkLabel1.TabIndex = 12;
+ this.linkLabel1.TabStop = true;
+ this.linkLabel1.Text = "鐢电绁炴妧娣樺疂搴";
+ this.linkLabel1.VisitedLinkColor = System.Drawing.Color.Aqua;
+ this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
+ //
+ // BtnShowAngle
+ //
+ this.BtnShowAngle.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.pose_32px;
+ this.BtnShowAngle.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.BtnShowAngle.FlatAppearance.BorderSize = 0;
+ this.BtnShowAngle.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.BtnShowAngle.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.BtnShowAngle.Location = new System.Drawing.Point(136, 7);
+ this.BtnShowAngle.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.BtnShowAngle.Name = "BtnShowAngle";
+ this.BtnShowAngle.Size = new System.Drawing.Size(102, 32);
+ this.BtnShowAngle.TabIndex = 10;
+ this.BtnShowAngle.Text = "鑸悜瀵瑰噯";
+ this.BtnShowAngle.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.BtnShowAngle.UseVisualStyleBackColor = true;
+ this.BtnShowAngle.Click += new System.EventHandler(this.BtnShowAngle_Click);
+ //
+ // btnLoadorCali
+ //
+ this.btnLoadorCali.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.earth_grid_32px;
+ this.btnLoadorCali.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnLoadorCali.FlatAppearance.BorderSize = 0;
+ this.btnLoadorCali.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnLoadorCali.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnLoadorCali.Location = new System.Drawing.Point(245, 7);
+ this.btnLoadorCali.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.btnLoadorCali.Name = "btnLoadorCali";
+ this.btnLoadorCali.Size = new System.Drawing.Size(128, 32);
+ this.btnLoadorCali.TabIndex = 10;
+ this.btnLoadorCali.Text = "鍔犺浇纾佸姏鏁版嵁";
+ this.btnLoadorCali.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnLoadorCali.UseVisualStyleBackColor = false;
+ this.btnLoadorCali.Click += new System.EventHandler(this.button4_Click);
+ //
+ // btnResetCalibrationData
+ //
+ this.btnResetCalibrationData.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.refresh_32px;
+ this.btnResetCalibrationData.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnResetCalibrationData.FlatAppearance.BorderSize = 0;
+ this.btnResetCalibrationData.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnResetCalibrationData.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnResetCalibrationData.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnResetCalibrationData.Location = new System.Drawing.Point(376, 7);
+ this.btnResetCalibrationData.Margin = new System.Windows.Forms.Padding(0, 2, 2, 2);
+ this.btnResetCalibrationData.Name = "btnResetCalibrationData";
+ this.btnResetCalibrationData.Size = new System.Drawing.Size(127, 32);
+ this.btnResetCalibrationData.TabIndex = 9;
+ this.btnResetCalibrationData.Text = "閲嶇疆鏍″噯鏁版嵁";
+ this.btnResetCalibrationData.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnResetCalibrationData.UseVisualStyleBackColor = true;
+ this.btnResetCalibrationData.Click += new System.EventHandler(this.button2_Click);
+ //
+ // btnCalliGyro
+ //
+ this.btnCalliGyro.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.refresh_32px1;
+ this.btnCalliGyro.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnCalliGyro.FlatAppearance.BorderSize = 0;
+ this.btnCalliGyro.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnCalliGyro.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnCalliGyro.Location = new System.Drawing.Point(19, 430);
+ this.btnCalliGyro.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.btnCalliGyro.Name = "btnCalliGyro";
+ this.btnCalliGyro.Size = new System.Drawing.Size(117, 32);
+ this.btnCalliGyro.TabIndex = 10;
+ this.btnCalliGyro.Text = "鏍″噯闄铻轰华";
+ this.btnCalliGyro.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCalliGyro.UseVisualStyleBackColor = true;
+ this.btnCalliGyro.Click += new System.EventHandler(this.button6_Click);
+ //
+ // Panel_Sensor_Information
+ //
+ this.Panel_Sensor_Information.BackColor = System.Drawing.Color.White;
+ this.Panel_Sensor_Information.Controls.Add(this.label9);
+ this.Panel_Sensor_Information.Controls.Add(this.label8);
+ this.Panel_Sensor_Information.Controls.Add(this.label7);
+ this.Panel_Sensor_Information.Controls.Add(this.label6);
+ this.Panel_Sensor_Information.Controls.Add(this.label5);
+ this.Panel_Sensor_Information.Controls.Add(this.label2);
+ this.Panel_Sensor_Information.Controls.Add(this.btnMagCalibtation);
+ this.Panel_Sensor_Information.Controls.Add(this.label_dev_name);
+ this.Panel_Sensor_Information.Controls.Add(this.btnCalliGyro);
+ this.Panel_Sensor_Information.Controls.Add(this.labelAngle);
+ this.Panel_Sensor_Information.Controls.Add(this.label4);
+ this.Panel_Sensor_Information.Controls.Add(this.label3);
+ this.Panel_Sensor_Information.Controls.Add(this.labelMagOffset);
+ this.Panel_Sensor_Information.Controls.Add(this.labelGyroOffset);
+ this.Panel_Sensor_Information.Controls.Add(this.label1);
+ this.Panel_Sensor_Information.Location = new System.Drawing.Point(710, 13);
+ this.Panel_Sensor_Information.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.Panel_Sensor_Information.Name = "Panel_Sensor_Information";
+ this.Panel_Sensor_Information.Size = new System.Drawing.Size(306, 491);
+ this.Panel_Sensor_Information.TabIndex = 13;
+ this.Panel_Sensor_Information.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint);
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.BackColor = System.Drawing.Color.Transparent;
+ this.label9.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label9.Location = new System.Drawing.Point(15, 128);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(121, 20);
+ this.label9.TabIndex = 18;
+ this.label9.Text = "鏃犵嚎浼犺緭锛氫笉鏀寔";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.BackColor = System.Drawing.Color.Transparent;
+ this.label8.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label8.ForeColor = System.Drawing.Color.Red;
+ this.label8.Location = new System.Drawing.Point(245, 103);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(44, 17);
+ this.label8.TabIndex = 17;
+ this.label8.Text = "鏈牎鍑";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.BackColor = System.Drawing.Color.Transparent;
+ this.label7.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label7.ForeColor = System.Drawing.Color.Red;
+ this.label7.Location = new System.Drawing.Point(245, 75);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(44, 17);
+ this.label7.TabIndex = 16;
+ this.label7.Text = "鏈牎鍑";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.BackColor = System.Drawing.Color.Transparent;
+ this.label6.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label6.Location = new System.Drawing.Point(16, 101);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(105, 20);
+ this.label6.TabIndex = 15;
+ this.label6.Text = "纾佸姏璁★細 鏀寔";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.BackColor = System.Drawing.Color.Transparent;
+ this.label5.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label5.Location = new System.Drawing.Point(16, 73);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(105, 20);
+ this.label5.TabIndex = 14;
+ this.label5.Text = "闄铻轰华锛 鏀寔";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label2.Location = new System.Drawing.Point(16, 45);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(107, 20);
+ this.label2.TabIndex = 13;
+ this.label2.Text = "鍔犻熷害璁★細鏀寔";
+ //
+ // btnMagCalibtation
+ //
+ this.btnMagCalibtation.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.refresh_32px1;
+ this.btnMagCalibtation.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnMagCalibtation.FlatAppearance.BorderSize = 0;
+ this.btnMagCalibtation.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnMagCalibtation.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnMagCalibtation.Location = new System.Drawing.Point(156, 430);
+ this.btnMagCalibtation.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.btnMagCalibtation.Name = "btnMagCalibtation";
+ this.btnMagCalibtation.Size = new System.Drawing.Size(115, 32);
+ this.btnMagCalibtation.TabIndex = 10;
+ this.btnMagCalibtation.Text = "鏍″噯纾佸姏璁";
+ this.btnMagCalibtation.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnMagCalibtation.UseVisualStyleBackColor = true;
+ this.btnMagCalibtation.Click += new System.EventHandler(this.button3_Click);
+ //
+ // label_dev_name
+ //
+ this.label_dev_name.AutoSize = true;
+ this.label_dev_name.BackColor = System.Drawing.Color.Transparent;
+ this.label_dev_name.Font = new System.Drawing.Font("寰蒋闆呴粦", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label_dev_name.Location = new System.Drawing.Point(16, 11);
+ this.label_dev_name.Name = "label_dev_name";
+ this.label_dev_name.Size = new System.Drawing.Size(234, 19);
+ this.label_dev_name.TabIndex = 12;
+ this.label_dev_name.Text = "璁惧鍚嶇О锛欸eekIMU鏈夌嚎鐗 v1.0";
+ //
+ // labelAngle
+ //
+ this.labelAngle.AutoSize = true;
+ this.labelAngle.BackColor = System.Drawing.Color.Transparent;
+ this.labelAngle.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.labelAngle.Location = new System.Drawing.Point(16, 184);
+ this.labelAngle.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.labelAngle.Name = "labelAngle";
+ this.labelAngle.Size = new System.Drawing.Size(27, 20);
+ this.labelAngle.TabIndex = 11;
+ this.labelAngle.Text = "---";
+ this.labelAngle.Click += new System.EventHandler(this.labelAngle_Click);
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.BackColor = System.Drawing.Color.Transparent;
+ this.label4.Font = new System.Drawing.Font("寰蒋闆呴粦", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label4.Location = new System.Drawing.Point(16, 157);
+ this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(52, 19);
+ this.label4.TabIndex = 1;
+ this.label4.Text = "娆ф媺瑙:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.BackColor = System.Drawing.Color.Transparent;
+ this.label3.Font = new System.Drawing.Font("寰蒋闆呴粦", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label3.Location = new System.Drawing.Point(16, 267);
+ this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(87, 19);
+ this.label3.TabIndex = 1;
+ this.label3.Text = "纾佸姏璁℃牎鍑嗗";
+ //
+ // labelMagOffset
+ //
+ this.labelMagOffset.AutoSize = true;
+ this.labelMagOffset.BackColor = System.Drawing.Color.Transparent;
+ this.labelMagOffset.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.labelMagOffset.Location = new System.Drawing.Point(16, 295);
+ this.labelMagOffset.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.labelMagOffset.Name = "labelMagOffset";
+ this.labelMagOffset.Size = new System.Drawing.Size(27, 20);
+ this.labelMagOffset.TabIndex = 0;
+ this.labelMagOffset.Text = "---";
+ //
+ // labelGyroOffset
+ //
+ this.labelGyroOffset.AutoSize = true;
+ this.labelGyroOffset.BackColor = System.Drawing.Color.Transparent;
+ this.labelGyroOffset.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.labelGyroOffset.Location = new System.Drawing.Point(16, 239);
+ this.labelGyroOffset.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.labelGyroOffset.Name = "labelGyroOffset";
+ this.labelGyroOffset.Size = new System.Drawing.Size(27, 20);
+ this.labelGyroOffset.TabIndex = 0;
+ this.labelGyroOffset.Text = "---";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Font = new System.Drawing.Font("寰蒋闆呴粦", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label1.Location = new System.Drawing.Point(16, 214);
+ this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(91, 19);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "闄铻轰华鏍″噯鍊:";
+ //
+ // IMUInformation
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(1027, 557);
+ this.Controls.Add(this.Panel_Sensor_Information);
+ this.Controls.Add(this.Panel_Bottom);
+ this.Controls.Add(this.Gbox_OpenGL);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.Name = "IMUInformation";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Form1";
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.Resize += new System.EventHandler(this.Form1_Resize);
+ this.Gbox_OpenGL.ResumeLayout(false);
+ this.GLpanel.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.openGLControl1)).EndInit();
+ this.Panel_Bottom.ResumeLayout(false);
+ this.Panel_Bottom.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.Panel_Sensor_Information.ResumeLayout(false);
+ this.Panel_Sensor_Information.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox Gbox_OpenGL;
+ private System.Windows.Forms.Panel GLpanel;
+ private System.Windows.Forms.Button btnResetCalibrationData;
+ private System.Windows.Forms.Button btnMagCalibtation;
+ private System.Windows.Forms.Timer timer1;
+ private System.Windows.Forms.Button btnLoadorCali;
+ private System.Windows.Forms.Panel Panel_Bottom;
+ private System.Windows.Forms.Button btnCalliGyro;
+ private System.Windows.Forms.LinkLabel linkLabel1;
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.Panel Panel_Sensor_Information;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label labelMagOffset;
+ private System.Windows.Forms.Label labelGyroOffset;
+ private System.Windows.Forms.Button BtnShowAngle;
+ private System.Windows.Forms.Label labelAngle;
+ private System.Windows.Forms.Label label4;
+ private SharpGL.OpenGLControl openGLControl1;
+ private System.ComponentModel.BackgroundWorker backgroundWorker1;
+ private System.Windows.Forms.BindingSource bindingSource1;
+ private System.Windows.Forms.Label label_dev_name;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Button button1;
+
+ }
+}
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.cs
new file mode 100644
index 0000000..012c6c7
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.cs
@@ -0,0 +1,433 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using SharpGL;
+using System.Drawing.Imaging;
+using System.Drawing.Drawing2D;
+using System.Diagnostics;
+using System.Threading;
+using CCWin;
+namespace DM_CalibrationTools
+{
+// struct mVector3
+// {
+// public float x, y, z;
+// };
+ public partial class IMUInformation : Form
+ {
+ Boolean global_IsCali=false;
+ HashSet magcalidata = new HashSet();
+
+ private Point mPoint;
+
+ bool isGetCalibrateData = false;
+
+ public IMUInformation()
+ {
+ InitializeComponent();
+ }
+
+ csgl gl;
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ Console.WriteLine("C#:InitCaliAPI");
+ Debug.WriteLine(CaliAPI.InitCaliAPI("VID_2833&PID_0002"));
+
+ this.Text = "GeekIMU绠$悊杞欢";
+ gl = new csgl(openGLControl1);
+ this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.GLpanel_MouseWheel);
+
+ // 榛樿鐘舵佷负闅愯棌
+ //Gbox_OpenGL.Hide();
+ //Panel_Sensor_Information.Hide();
+ //Panel_Bottom.Hide();
+
+ DrawIMUInformationGrid(0, 0);
+ }
+
+ private void GLpanel_MouseWheel(object sender, MouseEventArgs e)
+ {
+ if (gl.Global_MouseInGLPanel)
+ gl.zoomCameraDelta(e.Delta / 60);
+ }
+
+ private void GLpanel_MouseEnter(object sender, EventArgs e)
+ {
+ gl.Global_MouseInGLPanel = true;
+ }
+
+ private void GLpanel_MouseLeave(object sender, EventArgs e)
+ {
+ gl.Global_MouseInGLPanel = false;
+ }
+
+ private void sceneControl1_OpenGLDraw(object sender, PaintEventArgs e)
+ {
+ gl.Draw();
+ }
+
+ private void sceneControl1_MouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Middle)
+ {
+ gl.resetView();
+ }
+
+ }
+
+ private void sceneControl1_MouseDown(object sender, MouseEventArgs e)
+ {
+ gl.Global_MouseDown = true;
+ gl.setMousePos(e.X, e.Y);
+ }
+
+ private void sceneControl1_MouseMove(object sender, MouseEventArgs e)
+ {if(gl!=null)
+ if (gl.Global_MouseDown)
+ {
+ if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.Control)
+ {
+ gl.moveCameraXY(e.X, e.Y);
+ }
+ else if (e.Button == MouseButtons.Right && Control.ModifierKeys == Keys.Control)
+ {
+ gl.moveCameraZ(e.X, e.Y);
+ }
+ else if (e.Button == MouseButtons.Left)
+ {
+ gl.rotateCamera(e.X, e.Y);
+ }
+ else if (e.Button == MouseButtons.Right)
+ {
+ gl.zoomCamera(e.Y);
+ }
+
+ }
+ }
+
+ private void sceneControl1_MouseUp(object sender, MouseEventArgs e)
+ {
+ gl.Global_MouseDown = false;
+ gl.setMousePos(e.X, e.Y);
+ }
+
+ private void Form1_Resize(object sender, EventArgs e)
+ {
+ }
+
+ private void sceneControl1_Resized(object sender, EventArgs e)
+ {if(gl!=null)
+ gl.resize();
+ }
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ this.Invoke(new EventHandler(delegate
+ {
+ if(global_IsCali)
+ {
+ if (magcalidata.Count <= 4000)
+ {
+ mVector3 v3f = CaliAPI.GetPoint();
+ double[] v3d = { v3f.x, v3f.y, v3f.z };
+ if (v3d[0] != -99999.0 || v3d[1] != -99999.0 || v3d[2] != -99999.0)
+ magcalidata.Add(v3d);
+ gl.setPointarr(magcalidata);
+ }
+ else
+ {
+ global_IsCali = false;
+ timer1.Interval = 100;
+ Debug.WriteLine("auto stop:" + CaliAPI.FinishMagCali());
+ }
+ }
+ if (global_IsCali)
+ {
+ btnLoadorCali.Enabled = false;
+ }
+ else
+ {
+ btnLoadorCali.Enabled = true;
+ }
+ if (CaliAPI.CheckDevice() == 1)
+ {
+ btnCalliGyro.Enabled = true;
+ btnResetCalibrationData.Enabled = true;
+ btnMagCalibtation.Enabled = true;
+ mVector3 v = CaliAPI.GetEulerianAngle();
+ if (v.x != -99999.0 || v.y != -99999.0 || v.z != -99999.0)
+ {
+ v.z += v.z > 0 ? -90 : 90;
+ v.y += 180;
+ v.y = v.y > 180 ? v.y - 360 : v.y;
+
+ labelAngle.Text = "Pitch : " + v.z.ToString("+#.#;-#.#;0") + "掳 " +
+ " Roll : " + v.y.ToString("+#.#;-#.#;0") + "掳 " +
+ " Yaw : " + v.x.ToString("+#.#;-#.#;0") + "掳";
+ }
+
+ if (isGetCalibrateData == false) {
+ MagCaliParam p = CaliAPI.GetMagCali();
+ mVector3 g = CaliAPI.GetGyroCali();
+
+ labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset + " " + p.zScale;
+ labelGyroOffset.Text = g.x + " " + g.y + " " + g.z;
+
+ isGetCalibrateData = true;
+ }
+ }
+ else
+ {
+ btnCalliGyro.Enabled = false;
+ btnResetCalibrationData.Enabled = false;
+ btnMagCalibtation.Enabled = false;
+ }
+
+ }));
+ }
+
+ private void button3_Click(object sender, EventArgs e)
+ {
+ gl.DrawFlag = 1;
+ if (btnMagCalibtation.Text.Equals("寮濮嬫牎鍑嗙鍔涜"))
+ {
+ this.Invoke(new EventHandler(delegate
+ {
+ magcalidata.Clear();
+ CaliAPI.MagCali();
+ global_IsCali = true;
+ timer1.Interval = 5;
+ }));
+ btnMagCalibtation.Text = "缁撴潫鏍″噯纾佸姏璁";
+ }
+ else
+ {
+ global_IsCali = false;
+ timer1.Interval = 50;
+ CaliAPI.FinishMagCali();
+ txtreader.saveData(magcalidata);
+ MagCaliParam p = CaliAPI.CalculateMagParam();
+ //Debug.WriteLine(p.xOffset + "," + p.yOffset + "," + p.zOffset + "," + p.xScale + "," + p.yScale + "," + p.zScale);
+ labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset + " " + p.zScale;
+ CaliAPI.SetMagCali(p.xOffset, p.yOffset, p.zOffset, p.xScale, p.yScale, p.zScale);
+ pointstage = 0;
+ button4_Click(sender, e);
+ btnMagCalibtation.Text = "寮濮嬫牎鍑嗙鍔涜";
+ }
+
+
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ if(MessageBox.Show("璇ユ搷浣滀笉鍙嗭紝鏄惁缁х画锛","閲嶇疆鏍″噯鏁版嵁",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2)==DialogResult.OK)
+ {
+ if (CaliAPI.SetMagCali(0, 0, 0, 1, 1, 1) == 1) {
+ isGetCalibrateData = false;
+ }
+
+ }
+
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ MagCaliParam p = CaliAPI.GetMagCali();
+ mVector3 g = CaliAPI.GetGyroCali();
+
+ labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset +" "+ p.zScale ;
+ labelGyroOffset.Text = g.x + " " + g.y + " "+g.z;
+
+ }
+ static int pointstage = 0;
+ txtreader global_tr = null;
+ HashSet hs;
+ private void button4_Click(object sender, EventArgs e)
+ {
+ gl.DrawFlag = 1;
+ //mVector3 v3 = CaliAPI.GetPoint();
+ //Debug.WriteLine(v3.x+" "+v3.y+" "+v3.z+" ");
+
+ if ((global_tr == null) || (pointstage == 0))
+ {
+ btnLoadorCali.Text = "缁樺埗鏍″噯鏁版嵁";
+ global_tr = new txtreader("data");
+ global_tr.GetData();
+ pointstage=1;
+ hs = global_tr.getHashset();
+ }
+ else if(pointstage == 1 )
+ {
+ btnLoadorCali.Text = "鍔犺浇鍘熷鏁版嵁";
+ HashSet hs1 = new HashSet();
+ if(hs.Count >100)
+ {
+ MagCaliParam mcp= CaliAPI.CalculateMagParam();
+
+ foreach (var d in hs)
+ {
+ double[] v = { (d[0] - mcp.xOffset) * mcp.xScale, (d[1] - mcp.yOffset) * mcp.yScale, (d[2] - mcp.zOffset) * mcp.zScale };
+ hs1.Add(v);
+ }
+ hs = hs1;
+ }
+ else
+ {
+ MessageBox.Show("鏁版嵁澶皯锛屾棤娉曡绠楁牎鍑嗗弬鏁帮紒");
+ }
+ pointstage = 0;
+ }
+
+ gl.setPointarr(hs);
+
+ }
+
+ private void DrawIMUInformationGrid(int cols, int rows)
+ {
+
+ Bitmap b = new Bitmap(Panel_Sensor_Information.Width, Panel_Sensor_Information.Height);
+ Graphics g = Graphics.FromImage(b);
+ Rectangle rect = new Rectangle(5,
+ 0,
+ Panel_Sensor_Information.Width - 10, 360);
+ g.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228), 1), rect);
+
+ g.FillRectangle(new SolidBrush(Color.FromArgb(249, 249, 249)),
+ new Rectangle(new Point(6, 1),
+ new Size(Panel_Sensor_Information.Width - 11, 40)));
+
+ int padding = 28;
+ int stLocation = 68;
+ for (int i = 0; i < 4; i++) {
+ g.FillRectangle(new SolidBrush(Color.FromArgb(249, 249, 249)),
+ new Rectangle(new Point(6, 1 + i * padding * 2 + stLocation),
+ new Size(Panel_Sensor_Information.Width - 11, padding)));
+ }
+
+ g.Dispose();
+
+ Panel_Sensor_Information.Show();
+ Panel_Sensor_Information.BackgroundImage = b;
+
+
+ }
+ // 鑾峰彇浼犳劅鍣ㄧ殑鐘舵
+ public bool GetIMUStatus()
+ {
+ if (CaliAPI.CheckDevice() == 1) {
+ return true;
+ }
+ return false;
+ }
+ private void button5_Click(object sender, EventArgs e)
+ {
+ global_IsCali = false;
+ timer1.Interval = 100;
+ Debug.WriteLine(CaliAPI.FinishMagCali());
+ txtreader.saveData(magcalidata);
+ MagCaliParam p = CaliAPI.CalculateMagParam();
+ Debug.WriteLine(p.xOffset + "," + p.yOffset + "," + p.zOffset + "," + p.xScale + "," + p.yScale + "," + p.zScale);
+ Debug.WriteLine(CaliAPI.SetMagCali(p.xOffset, p.yOffset, p.zOffset, p.xScale, p.yScale, p.zScale));
+ pointstage = 0;
+ button4_Click(sender, e);
+ }
+
+ private void button6_Click(object sender, EventArgs e)
+ {
+ DialogResult dr = MessageBox.Show("鏍″噯杩囩▼绾2绉掞紝璇蜂繚鎸佽澶囬潤缃紝鍗曞嚮纭畾寮濮嬨", "闄铻轰华鏍″噯", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
+ if (dr != DialogResult.OK && CaliAPI.CheckDevice() == 1)
+ {
+ return;
+ }
+ else
+ {
+ int result = CaliAPI.GyroCali();
+ Thread.Sleep(1000);
+ if (result == 1)
+ {
+ MessageBox.Show("鏍″噯鎴愬姛!");
+ mVector3 g = CaliAPI.GetGyroCali();
+ labelGyroOffset.Text = g.x + " " + g.y + " " + g.z + "\n";
+ }
+ else
+ MessageBox.Show("鏍″噯澶辫触!");
+ }
+ }
+
+ private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+ {
+ System.Diagnostics.Process.Start("https://shop408976235.taobao.com/");
+ }
+
+ private void pictureBox1_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start("https://shop408976235.taobao.com/");
+ }
+
+ private void BtnShowAngle_Click(object sender, EventArgs e)
+ {
+ gl.DrawFlag = 2;
+ CaliAPI.Correction();
+ }
+
+ private void BtnHelp_Click(object sender, EventArgs e)
+ {
+
+ System.Diagnostics.Process.Start(Application.StartupPath+"/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf");
+ }
+
+ private void sceneControl1_OpenGLDraw(object sender)
+ {
+ }
+
+ private void sceneControl1_OpenGLInitialized(object sender, EventArgs e)
+ {
+ OpenGL gl = openGLControl1.OpenGL;
+ gl.ClearColor(0, 0, 0, 0);
+ }
+
+ private void Btn_Close_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void Control_Panel_MouseDown(object sender, MouseEventArgs e)
+ {
+ mPoint = new Point(e.X, e.Y);
+ }
+
+ private void Control_Panel_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
+ }
+ }
+
+ private void Btn_min_Click(object sender, EventArgs e)
+ {
+ this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void Btn_support_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start(Application.StartupPath + "/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf");
+ }
+
+ private void panel2_Paint(object sender, PaintEventArgs e)
+ {
+
+ }
+
+ private void labelAngle_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.resx b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.resx
new file mode 100644
index 0000000..57c19e1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/IMUInformation.resx
@@ -0,0 +1,1265 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 107, 17
+
+
+ 281, 17
+
+
+ 61
+
+
+
+
+ AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/CdkCvwnaAr8J2j6/Cdr+vwna/r8J276/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/Cdr+vwnaPr8J2gK/C
+ dkCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdkCvwnaAr8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/CdoCvwnZAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwnZwr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2cK/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnavr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dq+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdoCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdoCvwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ doCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnaAr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwna/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ doAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2YK/Cdu+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYwr8J236/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/63Adf+ktnD/na1r/5en
+ aP+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZgr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2YAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//83Z
+ qf/c4sj/6+3i/////////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5enaP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYwr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP//////////////////////////////////////////////
+ /////////////////////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6u+dP+ounL/qLpy/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/Cdt+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ///k6Nn/rbmM/5KhZf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6K0b/+WpWf/kqFl/5Kh
+ Zf+SoWX/kqFl/5SjZv+drWv/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Xp2j/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Uo2b/prhx/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2j6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/prhx/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ////////////////////////////////////////////////////////////////////////+Pn1/6az
+ gv+SoWX/kqFl/6i6cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5KhZf+SoWX/kad3/4+tif+PrYn/kKqA/5KhZf+SoWX/kqFl/5Kh
+ Zf+Uo2b/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+SoWX/jbWk/4jJ
+ 4/+Hz/X/h8/1/4fP9f+Hz/X/iMzs/4u+v/+Rp3f/kqFl/5KhZf+drWv/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4nG2v+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4jM
+ 7P+Pr5L/kqFl/5SjZv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cds8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Pr5L/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+twHX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4jM7P+Rp3f/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwna/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6S2cP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4u+v/+ounL/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ //////////////////////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/iMzs/6u+dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+Xp2j/prOC/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf///////////////////////////////////////////////////////////////////////////93i
+ z/+Xp2j/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/5mn
+ b///////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////////////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+lxZb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/6XF
+ lv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/W3MX/////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+HozP//////////////
+ ///////////////////////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5Kh
+ Zf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qsSG/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+vt4v//////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////////////////////////////////////
+ /////////////+vt4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4zN
+ 5f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2cK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/3OTD////
+ /////////////////////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5Cq
+ gP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/nsiu/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/BzZ3/////////////////////////////////////////
+ ////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4/N
+ 3f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/rcB1/6+7
+ jf////////////////////////////////////////////////////////////////+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM
+ 7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnavr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/rbmM////////////////////////////////////
+ /////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdq8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/pLZw/5Kh
+ Zf+0vpX/////////////////////////////////////////////////////////////////r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZwr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/52ta/+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/rcB1/52ta/+SoWX/kqFl/8/WvP//////////////////////////////
+ //////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/8PTl////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/5SjZv+fr2z/prhx/6i6cv+ounL/prhx/5+vbP+Uo2b/kqFl/5Kh
+ Zf+Zp2//+Pn1////////////////////////////////////////////////////////////8PTl/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/9bcxf//////////////////////////////
+ ///////////////////////////////////Y3sb/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAA
+ AAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+7xJ///////////////////////////////////////////////////////////////////////7vE
+ n/+Uo2b/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAr8J2v6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////
+ ////////////////////////////////////////////////////////////////////////1tzF/5mn
+ b/+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Zp2//1tzF////////////////////////////////////
+ ////////////////////////////////////////oK14/5KhZf+Uo2b/qrxz/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAACvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////
+ ////////////////////////////////////////+Pn1/8/WvP+0vpX/rbmM/625jP+0vpX/z9a8//j5
+ 9f////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+Uo2b/qrxz/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/AAAAAAAAAAAAAAAAr8J2QK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/kqFl/5KhZf+QnmT/kJ5k/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/jpxj/3yJWf98iVn/jpxj/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+Vn3j/e4dY/3uH
+ WP97kG7/hMbk/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2vwAAAAAAAAAAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////f49f+Unnf/eY5u/3OqxP9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvAAAAAK/CdiCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D05f//////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////f4
+ 9f+Nuc7/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnYgr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r7
+ 9v//////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO
+ 7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkCvwnaAr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2gK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPr8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwna/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/5uzU////////////////////////////////////////////////////////////////////
+ ////////+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////
+ //////////////////////////////D05f/h6Mz/zdmp/7nKh/++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/hsjl/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Srxf+OpXn/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+Ou87/jKN4/5KhZf+Uo2b/qrxz/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/kqFl/5KhZf+Uo2b/qrxz/63Adf+ktnD/na1r/5enaP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6S2cP+ms4L/+Pn1////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+ms4L/kqFl/5Kh
+ Zf+Uo2b/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+ms4L/+Pn1////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////j59f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6cv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/n69s/5KhZf+SoWX/kqFl/4aIXf+Ne3D/9vX0////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf+GiF3/c11P/3Nd
+ T/+Ne3D/9vX0////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/oK14/7vEn//W3MX/6+3i////
+ /////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5KhZf+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+drWv/kqFl/5KhZf+SoWX/hohd/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f//////////////////////////////////////////////////////////////
+ /////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5KhZf+SoWX/kqFl/4aIXf9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/rbmM/5Kh
+ Zf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52t
+ a/+SoWX/kqFl/5KhZf+Be1n/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5enaP+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2j6/C
+ doCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5WW
+ Zf++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////+Pn1/6azgv+SoWX/kqFl/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf9/d1f/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dkCvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5Kh
+ Zf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////6+3i/5mn
+ b/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2IAAAAACvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+muHH/lqVn/5KhZf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du8AAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5Kh
+ Zf9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////k6Nn/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAACvwnZAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/393
+ V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkAAAAAAAAAAAAAAAACvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/4iMXv93ZlL/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+suYX/+Pn1////////////////////////////////////////////////////
+ ////////////////////////+vv2/9zkw//I1aH/w9GY/8PRmP/I1aH/3OTD//r79v//////////////
+ /////////////////////////////////////////////////////////////93iz/+Xp2j/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/AAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+rvnT/na1r/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6CteP//////////////
+ /////////////////////////////////////////////////////////////+HozP+0xn//r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ//+HozP//////////////////////////////////////////////
+ /////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr8AAAAAAAAAAAAAAAAAAAAAr8J2cK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/q750/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////////////////////////////////////////////
+ ///////////////////N2an/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////u8Sf/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/W3MX/////////
+ ////////////////////////////////////////////////////////4ejM/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ///////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+SoWX/kqFl/4qQ
+ YP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/q750/+vt4v//////////////////////////////////////////////
+ //////////////r79v+0xn//r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf///////////////////////////////////////////////////////////+vt
+ 4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/46ZYv9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/////////
+ ////////////////////////////////////////////////////////3OTD/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ /////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZwAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+OmWL/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+Kg17/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////
+ ///////////////////BzZ3/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2r6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/6i1cf+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////
+ /////////////////////////////////////////////////////////////6+7jf+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf////////////////////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////////////////////
+ ////////////////////////rbmM/52ta/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv////////////////////////////////////////////////////////////////+0vpX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////////////////////
+ /////////////////////////////8/WvP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ //////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/8PTl////////////////////////////////////////////////////////////+Pn1/5mn
+ b/+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////8PTl/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/prhx/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////////////////////
+ ////////////////////////////////////////1tzF/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf/////////////////h6Mz/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYQr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+WpWf/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf///////////83Zqf+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////tMZ//6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/35yV/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+comr/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/3tqVP9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//fnBW/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQ
+ Y/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PR
+ mP//////////////////////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3Nd
+ T/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/jYlg/4qD
+ Xv+otXH/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D0
+ 5f//////////////////////////////////////////////////////////////////////////////
+ ////////wMqi/6S2cP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdo8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////////////////////
+ ////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J236/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/5uzU////
+ ////////////////////////////////////////////////////////////////////////vs2Q/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////////////////////
+ //////////////D05f/h6Mz/zdmp/7TGf/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ djAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ djCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdt+vwnYwAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2jwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnZgr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J276/CdmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnaAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYQr8J2gK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2r6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavr8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dnCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnZwr8J2IAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZAr8J2gK/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnaAr8J2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYgr8J2QK/CdoCvwnaPr8J2v6/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwna/r8J2v6/Cdo+vwnaAr8J2QK/CdiAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////////8AAAD////////////////wAAAAD///////////////AAAAAA
+ D/////////////+AAAAAAAH////////////+AAAAAAAAf///////////8AAAAAAAAA///////////8AA
+ AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH///////
+ //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////gAAAAAAAAAAAAf///////wAAAAAAAAAAAAD/
+ //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA
+ AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA
+ AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///w
+ AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA
+ A///gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA
+ AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA
+ AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAD/AA
+ AAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA
+ AAfAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA
+ AAAAAAADgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA
+ AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA
+ AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAADwAAAAAAA
+ AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAB+AA
+ AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA
+ AA/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA
+ AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA
+ AAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///g
+ AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///4AAAAAAAAAAAAAAAA
+ H////AAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA
+ AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA
+ AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP///////AAAAAAAAAAAAAP//////
+ /4AAAAAAAAAAAAH////////AAAAAAAAAAAAD////////8AAAAAAAAAAAD/////////gAAAAAAAAAAB//
+ ///////+AAAAAAAAAAB//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA
+ AA////////////4AAAAAAAB/////////////gAAAAAAB//////////////AAAAAAD///////////////
+ AAAAAP////////////////AAAA////////8=
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.Designer.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.Designer.cs
new file mode 100644
index 0000000..1b57795
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.Designer.cs
@@ -0,0 +1,300 @@
+锘縩amespace DM_CalibrationTools
+{
+ partial class MainForms
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForms));
+ this.Control_Panel = new System.Windows.Forms.Panel();
+ this.label_line = new System.Windows.Forms.Label();
+ this.Panel_logo = new System.Windows.Forms.Panel();
+ this.label_dev_status = new System.Windows.Forms.Label();
+ this.label_Form_Name = new System.Windows.Forms.Label();
+ this.MainPanel = new System.Windows.Forms.Panel();
+ this.Btn_my_dev = new System.Windows.Forms.Button();
+ this.Btn_support = new System.Windows.Forms.Button();
+ this.Btn_software_Setting = new System.Windows.Forms.Button();
+ this.Btn_min = new System.Windows.Forms.Button();
+ this.Btn_dev_Setting = new System.Windows.Forms.Button();
+ this.Btn_DFU_DownLoad = new System.Windows.Forms.Button();
+ this.pictureBox2 = new System.Windows.Forms.PictureBox();
+ this.pictureBox3 = new System.Windows.Forms.PictureBox();
+ this.Btn_Close = new System.Windows.Forms.Button();
+ this.Control_Panel.SuspendLayout();
+ this.Panel_logo.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
+ this.SuspendLayout();
+ //
+ // Control_Panel
+ //
+ this.Control_Panel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Control_Panel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(58)))), ((int)(((byte)(151)))), ((int)(((byte)(229)))));
+ this.Control_Panel.Controls.Add(this.Btn_my_dev);
+ this.Control_Panel.Controls.Add(this.Btn_support);
+ this.Control_Panel.Controls.Add(this.Btn_software_Setting);
+ this.Control_Panel.Controls.Add(this.label_line);
+ this.Control_Panel.Controls.Add(this.Btn_min);
+ this.Control_Panel.Controls.Add(this.Btn_dev_Setting);
+ this.Control_Panel.Controls.Add(this.Btn_DFU_DownLoad);
+ this.Control_Panel.Controls.Add(this.Panel_logo);
+ this.Control_Panel.Controls.Add(this.Btn_Close);
+ this.Control_Panel.Location = new System.Drawing.Point(-1, 0);
+ this.Control_Panel.Name = "Control_Panel";
+ this.Control_Panel.Size = new System.Drawing.Size(1028, 88);
+ this.Control_Panel.TabIndex = 16;
+ this.Control_Panel.Paint += new System.Windows.Forms.PaintEventHandler(this.Control_Panel_Paint);
+ this.Control_Panel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Control_Panel_MouseDown);
+ this.Control_Panel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Control_Panel_MouseMove);
+ //
+ // label_line
+ //
+ this.label_line.AutoSize = true;
+ this.label_line.BackColor = System.Drawing.Color.Transparent;
+ this.label_line.ForeColor = System.Drawing.Color.White;
+ this.label_line.Location = new System.Drawing.Point(959, 7);
+ this.label_line.Name = "label_line";
+ this.label_line.Size = new System.Drawing.Size(11, 12);
+ this.label_line.TabIndex = 16;
+ this.label_line.Text = "|";
+ //
+ // Panel_logo
+ //
+ this.Panel_logo.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(42)))), ((int)(((byte)(138)))), ((int)(((byte)(219)))));
+ this.Panel_logo.Controls.Add(this.pictureBox2);
+ this.Panel_logo.Controls.Add(this.pictureBox3);
+ this.Panel_logo.Controls.Add(this.label_dev_status);
+ this.Panel_logo.Controls.Add(this.label_Form_Name);
+ this.Panel_logo.Location = new System.Drawing.Point(3, 0);
+ this.Panel_logo.Name = "Panel_logo";
+ this.Panel_logo.Size = new System.Drawing.Size(207, 88);
+ this.Panel_logo.TabIndex = 16;
+ this.Panel_logo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_logo_MouseDown);
+ this.Panel_logo.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_logo_MouseMove);
+ //
+ // label_dev_status
+ //
+ this.label_dev_status.AutoSize = true;
+ this.label_dev_status.Font = new System.Drawing.Font("寰蒋闆呴粦", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label_dev_status.ForeColor = System.Drawing.Color.White;
+ this.label_dev_status.Location = new System.Drawing.Point(88, 47);
+ this.label_dev_status.Name = "label_dev_status";
+ this.label_dev_status.Size = new System.Drawing.Size(79, 20);
+ this.label_dev_status.TabIndex = 11;
+ this.label_dev_status.Text = "璁惧鏈繛鎺";
+ //
+ // label_Form_Name
+ //
+ this.label_Form_Name.AutoSize = true;
+ this.label_Form_Name.Font = new System.Drawing.Font("寰蒋闆呴粦", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label_Form_Name.ForeColor = System.Drawing.Color.White;
+ this.label_Form_Name.Location = new System.Drawing.Point(70, 19);
+ this.label_Form_Name.Name = "label_Form_Name";
+ this.label_Form_Name.Size = new System.Drawing.Size(130, 19);
+ this.label_Form_Name.TabIndex = 16;
+ this.label_Form_Name.Text = "GeekIMU绠$悊涓績";
+ //
+ // MainPanel
+ //
+ this.MainPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.MainPanel.Location = new System.Drawing.Point(0, 91);
+ this.MainPanel.Name = "MainPanel";
+ this.MainPanel.Size = new System.Drawing.Size(1027, 554);
+ this.MainPanel.TabIndex = 17;
+ //
+ // Btn_my_dev
+ //
+ this.Btn_my_dev.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_my_dev.FlatAppearance.BorderSize = 0;
+ this.Btn_my_dev.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_my_dev.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_my_dev.ForeColor = System.Drawing.Color.White;
+ this.Btn_my_dev.Image = global::DM_CalibrationTools.Properties.Resources.home_48px;
+ this.Btn_my_dev.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_my_dev.Location = new System.Drawing.Point(209, 1);
+ this.Btn_my_dev.Name = "Btn_my_dev";
+ this.Btn_my_dev.Size = new System.Drawing.Size(77, 87);
+ this.Btn_my_dev.TabIndex = 22;
+ this.Btn_my_dev.Text = "鎴戠殑浼犳劅鍣";
+ this.Btn_my_dev.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_my_dev.UseVisualStyleBackColor = true;
+ //
+ // Btn_support
+ //
+ this.Btn_support.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_support.FlatAppearance.BorderSize = 0;
+ this.Btn_support.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_support.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_support.ForeColor = System.Drawing.Color.White;
+ this.Btn_support.Image = global::DM_CalibrationTools.Properties.Resources.help_48px;
+ this.Btn_support.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_support.Location = new System.Drawing.Point(441, 1);
+ this.Btn_support.Name = "Btn_support";
+ this.Btn_support.Size = new System.Drawing.Size(77, 87);
+ this.Btn_support.TabIndex = 21;
+ this.Btn_support.Text = "甯姪涓庢敮鎸";
+ this.Btn_support.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_support.UseVisualStyleBackColor = true;
+ this.Btn_support.Click += new System.EventHandler(this.Btn_support_Click);
+ //
+ // Btn_software_Setting
+ //
+ this.Btn_software_Setting.FlatAppearance.BorderSize = 0;
+ this.Btn_software_Setting.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_software_Setting.Image = global::DM_CalibrationTools.Properties.Resources.btn_setting_18px_1;
+ this.Btn_software_Setting.Location = new System.Drawing.Point(933, 3);
+ this.Btn_software_Setting.Name = "Btn_software_Setting";
+ this.Btn_software_Setting.Size = new System.Drawing.Size(18, 18);
+ this.Btn_software_Setting.TabIndex = 20;
+ this.Btn_software_Setting.UseVisualStyleBackColor = true;
+ //
+ // Btn_min
+ //
+ this.Btn_min.FlatAppearance.BorderSize = 0;
+ this.Btn_min.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_min.Image = global::DM_CalibrationTools.Properties.Resources.btn_mini_18px_1;
+ this.Btn_min.Location = new System.Drawing.Point(978, 3);
+ this.Btn_min.Name = "Btn_min";
+ this.Btn_min.Size = new System.Drawing.Size(18, 18);
+ this.Btn_min.TabIndex = 19;
+ this.Btn_min.UseVisualStyleBackColor = true;
+ this.Btn_min.Click += new System.EventHandler(this.Btn_min_Click);
+ //
+ // Btn_dev_Setting
+ //
+ this.Btn_dev_Setting.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_dev_Setting.FlatAppearance.BorderSize = 0;
+ this.Btn_dev_Setting.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_dev_Setting.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_dev_Setting.ForeColor = System.Drawing.Color.White;
+ this.Btn_dev_Setting.Image = global::DM_CalibrationTools.Properties.Resources.settings_48px;
+ this.Btn_dev_Setting.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_dev_Setting.Location = new System.Drawing.Point(285, 1);
+ this.Btn_dev_Setting.Name = "Btn_dev_Setting";
+ this.Btn_dev_Setting.Size = new System.Drawing.Size(77, 87);
+ this.Btn_dev_Setting.TabIndex = 18;
+ this.Btn_dev_Setting.Text = "璁惧璁剧疆";
+ this.Btn_dev_Setting.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_dev_Setting.UseVisualStyleBackColor = true;
+ //
+ // Btn_DFU_DownLoad
+ //
+ this.Btn_DFU_DownLoad.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_DFU_DownLoad.FlatAppearance.BorderSize = 0;
+ this.Btn_DFU_DownLoad.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_DFU_DownLoad.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_DFU_DownLoad.ForeColor = System.Drawing.Color.White;
+ this.Btn_DFU_DownLoad.Image = global::DM_CalibrationTools.Properties.Resources.download_48px;
+ this.Btn_DFU_DownLoad.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_DFU_DownLoad.Location = new System.Drawing.Point(359, 1);
+ this.Btn_DFU_DownLoad.Name = "Btn_DFU_DownLoad";
+ this.Btn_DFU_DownLoad.Size = new System.Drawing.Size(77, 87);
+ this.Btn_DFU_DownLoad.TabIndex = 17;
+ this.Btn_DFU_DownLoad.Text = "鍥轰欢鍗囩骇";
+ this.Btn_DFU_DownLoad.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_DFU_DownLoad.UseVisualStyleBackColor = true;
+ //
+ // pictureBox2
+ //
+ this.pictureBox2.Image = global::DM_CalibrationTools.Properties.Resources.tools;
+ this.pictureBox2.Location = new System.Drawing.Point(6, 13);
+ this.pictureBox2.Name = "pictureBox2";
+ this.pictureBox2.Size = new System.Drawing.Size(60, 60);
+ this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox2.TabIndex = 15;
+ this.pictureBox2.TabStop = false;
+ //
+ // pictureBox3
+ //
+ this.pictureBox3.Image = global::DM_CalibrationTools.Properties.Resources.test;
+ this.pictureBox3.Location = new System.Drawing.Point(75, 47);
+ this.pictureBox3.Name = "pictureBox3";
+ this.pictureBox3.Size = new System.Drawing.Size(12, 21);
+ this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox3.TabIndex = 17;
+ this.pictureBox3.TabStop = false;
+ //
+ // Btn_Close
+ //
+ this.Btn_Close.FlatAppearance.BorderSize = 0;
+ this.Btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_Close.Image = global::DM_CalibrationTools.Properties.Resources.btn_close_18px_1;
+ this.Btn_Close.Location = new System.Drawing.Point(1002, 3);
+ this.Btn_Close.Name = "Btn_Close";
+ this.Btn_Close.Size = new System.Drawing.Size(18, 18);
+ this.Btn_Close.TabIndex = 14;
+ this.Btn_Close.UseVisualStyleBackColor = true;
+ this.Btn_Close.Click += new System.EventHandler(this.Btn_Close_Click);
+ //
+ // MainForms
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1027, 645);
+ this.Controls.Add(this.MainPanel);
+ this.Controls.Add(this.Control_Panel);
+ this.CornerRadius = 1;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "MainForms";
+ this.ShadowStyle = CCWin.RoundStyle.None;
+ this.Text = "MainForms";
+ this.Control_Panel.ResumeLayout(false);
+ this.Control_Panel.PerformLayout();
+ this.Panel_logo.ResumeLayout(false);
+ this.Panel_logo.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel Control_Panel;
+ private System.Windows.Forms.Button Btn_my_dev;
+ private System.Windows.Forms.Button Btn_support;
+ private System.Windows.Forms.Button Btn_software_Setting;
+ private System.Windows.Forms.Label label_line;
+ private System.Windows.Forms.Button Btn_min;
+ private System.Windows.Forms.Button Btn_dev_Setting;
+ private System.Windows.Forms.Button Btn_DFU_DownLoad;
+ private System.Windows.Forms.Panel Panel_logo;
+ private System.Windows.Forms.PictureBox pictureBox2;
+ private System.Windows.Forms.PictureBox pictureBox3;
+ private System.Windows.Forms.Label label_dev_status;
+ private System.Windows.Forms.Label label_Form_Name;
+ private System.Windows.Forms.Button Btn_Close;
+ private System.Windows.Forms.Panel MainPanel;
+
+
+ }
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.cs
new file mode 100644
index 0000000..2f97802
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.cs
@@ -0,0 +1,120 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using CCWin;
+namespace DM_CalibrationTools
+{
+ public partial class MainForms : SkinMain
+ {
+ private Point mPoint;
+ private Point mPoint_logo;
+
+ IMUInformation frm_IMUInformation;
+ IMUConnect frm_IMUConnect;
+
+ System.Windows.Forms.Timer mTimer_Main;
+ public MainForms()
+ {
+ InitializeComponent();
+ this.Load += new System.EventHandler(this.MainForms_Load);
+
+ }
+
+ private void MainForms_Load(object sender, EventArgs e)
+ {
+ this.Text = "GeekIMU绠$悊涓績";
+
+ // 璁剧疆浼犳劅鍣ㄤ俊鎭负涓婚粯璁ょ獥鍙
+ frm_IMUInformation = new IMUInformation();
+ frm_IMUInformation.TopLevel = false;
+ this.MainPanel.Controls.Add(frm_IMUInformation);
+
+ frm_IMUConnect = new IMUConnect();
+ frm_IMUConnect.TopLevel = false;
+ this.MainPanel.Controls.Add(frm_IMUConnect);
+
+ frm_IMUInformation.Show();
+ frm_IMUConnect.Show();
+ frm_IMUInformation.Hide();
+
+ // 閰嶇疆瀹氭椂鍣紝瀹氭椂鍣ㄧ敤浜庡畾鏈熸煡璇㈣澶囩姸鎬
+ mTimer_Main = new System.Windows.Forms.Timer();
+ mTimer_Main.Interval = 1500;
+ mTimer_Main.Enabled = true;
+ mTimer_Main.Tick += new EventHandler(timer_Tick);
+
+
+ }
+
+ void timer_Tick(object sender, EventArgs e)
+ {
+ label_dev_status.Text = frm_IMUInformation.GetIMUStatus() == true ? "璁惧宸茶繛鎺" : "鏈繛鎺";
+
+ if (frm_IMUInformation.GetIMUStatus() == false)
+ {
+ frm_IMUInformation.Hide();
+ frm_IMUConnect.Show();
+ Console.WriteLine("C#:璁惧鏈繛鎺");
+ }
+ else
+ {
+ frm_IMUInformation.Show();
+ frm_IMUConnect.Hide();
+ Console.WriteLine("C#:璁惧宸茶繛鎺");
+ }
+ }
+
+ private void Btn_Close_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void Btn_min_Click(object sender, EventArgs e)
+ {
+ this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void Control_Panel_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
+ }
+ }
+
+ private void Control_Panel_MouseDown(object sender, MouseEventArgs e)
+ {
+ mPoint = new Point(e.X, e.Y);
+ }
+
+
+ private void Panel_logo_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ this.Location = new Point(this.Location.X + e.X - mPoint_logo.X, this.Location.Y + e.Y - mPoint_logo.Y);
+ }
+ }
+
+ private void Panel_logo_MouseDown(object sender, MouseEventArgs e)
+ {
+ mPoint_logo = new Point(e.X, e.Y);
+ }
+
+ private void Control_Panel_Paint(object sender, PaintEventArgs e)
+ {
+
+ }
+
+ private void Btn_support_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start(Application.StartupPath + "/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf");
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.resx b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.resx
new file mode 100644
index 0000000..f635787
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/MainForms.resx
@@ -0,0 +1,1253 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/CdkCvwnaAr8J2j6/Cdr+vwna/r8J276/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/Cdr+vwnaPr8J2gK/C
+ dkCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdkCvwnaAr8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/CdoCvwnZAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwnZwr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2cK/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnavr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dq+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdoCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdoCvwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ doCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnaAr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwna/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ doAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2YK/Cdu+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYwr8J236/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/63Adf+ktnD/na1r/5en
+ aP+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZgr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2YAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//83Z
+ qf/c4sj/6+3i/////////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5enaP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYwr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP//////////////////////////////////////////////
+ /////////////////////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6u+dP+ounL/qLpy/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/Cdt+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ///k6Nn/rbmM/5KhZf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6K0b/+WpWf/kqFl/5Kh
+ Zf+SoWX/kqFl/5SjZv+drWv/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Xp2j/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Uo2b/prhx/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2j6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/prhx/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ////////////////////////////////////////////////////////////////////////+Pn1/6az
+ gv+SoWX/kqFl/6i6cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5KhZf+SoWX/kad3/4+tif+PrYn/kKqA/5KhZf+SoWX/kqFl/5Kh
+ Zf+Uo2b/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+SoWX/jbWk/4jJ
+ 4/+Hz/X/h8/1/4fP9f+Hz/X/iMzs/4u+v/+Rp3f/kqFl/5KhZf+drWv/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4nG2v+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4jM
+ 7P+Pr5L/kqFl/5SjZv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cds8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Pr5L/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+twHX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4jM7P+Rp3f/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwna/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6S2cP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4u+v/+ounL/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ //////////////////////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/iMzs/6u+dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+Xp2j/prOC/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf///////////////////////////////////////////////////////////////////////////93i
+ z/+Xp2j/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/5mn
+ b///////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////////////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+lxZb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/6XF
+ lv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/W3MX/////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+HozP//////////////
+ ///////////////////////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5Kh
+ Zf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qsSG/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+vt4v//////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////////////////////////////////////
+ /////////////+vt4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4zN
+ 5f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2cK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/3OTD////
+ /////////////////////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5Cq
+ gP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/nsiu/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/BzZ3/////////////////////////////////////////
+ ////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4/N
+ 3f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/rcB1/6+7
+ jf////////////////////////////////////////////////////////////////+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM
+ 7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnavr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/rbmM////////////////////////////////////
+ /////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdq8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/pLZw/5Kh
+ Zf+0vpX/////////////////////////////////////////////////////////////////r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZwr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/52ta/+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/rcB1/52ta/+SoWX/kqFl/8/WvP//////////////////////////////
+ //////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/8PTl////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/5SjZv+fr2z/prhx/6i6cv+ounL/prhx/5+vbP+Uo2b/kqFl/5Kh
+ Zf+Zp2//+Pn1////////////////////////////////////////////////////////////8PTl/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/9bcxf//////////////////////////////
+ ///////////////////////////////////Y3sb/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAA
+ AAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+7xJ///////////////////////////////////////////////////////////////////////7vE
+ n/+Uo2b/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAr8J2v6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////
+ ////////////////////////////////////////////////////////////////////////1tzF/5mn
+ b/+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Zp2//1tzF////////////////////////////////////
+ ////////////////////////////////////////oK14/5KhZf+Uo2b/qrxz/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAACvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////
+ ////////////////////////////////////////+Pn1/8/WvP+0vpX/rbmM/625jP+0vpX/z9a8//j5
+ 9f////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+Uo2b/qrxz/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/AAAAAAAAAAAAAAAAr8J2QK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/kqFl/5KhZf+QnmT/kJ5k/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/jpxj/3yJWf98iVn/jpxj/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+Vn3j/e4dY/3uH
+ WP97kG7/hMbk/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2vwAAAAAAAAAAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////f49f+Unnf/eY5u/3OqxP9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvAAAAAK/CdiCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D05f//////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////f4
+ 9f+Nuc7/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnYgr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r7
+ 9v//////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO
+ 7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkCvwnaAr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2gK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPr8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwna/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/5uzU////////////////////////////////////////////////////////////////////
+ ////////+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////
+ //////////////////////////////D05f/h6Mz/zdmp/7nKh/++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/hsjl/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Srxf+OpXn/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+Ou87/jKN4/5KhZf+Uo2b/qrxz/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/kqFl/5KhZf+Uo2b/qrxz/63Adf+ktnD/na1r/5enaP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6S2cP+ms4L/+Pn1////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+ms4L/kqFl/5Kh
+ Zf+Uo2b/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+ms4L/+Pn1////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////j59f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6cv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/n69s/5KhZf+SoWX/kqFl/4aIXf+Ne3D/9vX0////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf+GiF3/c11P/3Nd
+ T/+Ne3D/9vX0////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/oK14/7vEn//W3MX/6+3i////
+ /////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5KhZf+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+drWv/kqFl/5KhZf+SoWX/hohd/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f//////////////////////////////////////////////////////////////
+ /////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5KhZf+SoWX/kqFl/4aIXf9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/rbmM/5Kh
+ Zf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52t
+ a/+SoWX/kqFl/5KhZf+Be1n/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5enaP+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2j6/C
+ doCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5WW
+ Zf++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////+Pn1/6azgv+SoWX/kqFl/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf9/d1f/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dkCvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5Kh
+ Zf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////6+3i/5mn
+ b/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2IAAAAACvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+muHH/lqVn/5KhZf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du8AAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5Kh
+ Zf9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////k6Nn/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAACvwnZAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/393
+ V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkAAAAAAAAAAAAAAAACvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/4iMXv93ZlL/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+suYX/+Pn1////////////////////////////////////////////////////
+ ////////////////////////+vv2/9zkw//I1aH/w9GY/8PRmP/I1aH/3OTD//r79v//////////////
+ /////////////////////////////////////////////////////////////93iz/+Xp2j/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/AAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+rvnT/na1r/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6CteP//////////////
+ /////////////////////////////////////////////////////////////+HozP+0xn//r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ//+HozP//////////////////////////////////////////////
+ /////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr8AAAAAAAAAAAAAAAAAAAAAr8J2cK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/q750/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////////////////////////////////////////////
+ ///////////////////N2an/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////u8Sf/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/W3MX/////////
+ ////////////////////////////////////////////////////////4ejM/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ///////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+SoWX/kqFl/4qQ
+ YP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/q750/+vt4v//////////////////////////////////////////////
+ //////////////r79v+0xn//r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf///////////////////////////////////////////////////////////+vt
+ 4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/46ZYv9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/////////
+ ////////////////////////////////////////////////////////3OTD/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ /////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZwAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+OmWL/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+Kg17/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////
+ ///////////////////BzZ3/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2r6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/6i1cf+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////
+ /////////////////////////////////////////////////////////////6+7jf+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf////////////////////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////////////////////
+ ////////////////////////rbmM/52ta/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv////////////////////////////////////////////////////////////////+0vpX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////////////////////
+ /////////////////////////////8/WvP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ //////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/8PTl////////////////////////////////////////////////////////////+Pn1/5mn
+ b/+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////8PTl/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/prhx/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////////////////////
+ ////////////////////////////////////////1tzF/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf/////////////////h6Mz/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYQr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+WpWf/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf///////////83Zqf+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////tMZ//6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/35yV/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+comr/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/3tqVP9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//fnBW/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQ
+ Y/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PR
+ mP//////////////////////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3Nd
+ T/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/jYlg/4qD
+ Xv+otXH/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D0
+ 5f//////////////////////////////////////////////////////////////////////////////
+ ////////wMqi/6S2cP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdo8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////////////////////
+ ////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J236/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/5uzU////
+ ////////////////////////////////////////////////////////////////////////vs2Q/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////////////////////
+ //////////////D05f/h6Mz/zdmp/7TGf/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ djAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ djCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdt+vwnYwAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2jwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnZgr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J276/CdmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnaAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYQr8J2gK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2r6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavr8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dnCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnZwr8J2IAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZAr8J2gK/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnaAr8J2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYgr8J2QK/CdoCvwnaPr8J2v6/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwna/r8J2v6/Cdo+vwnaAr8J2QK/CdiAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////////8AAAD////////////////wAAAAD///////////////AAAAAA
+ D/////////////+AAAAAAAH////////////+AAAAAAAAf///////////8AAAAAAAAA///////////8AA
+ AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH///////
+ //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////gAAAAAAAAAAAAf///////wAAAAAAAAAAAAD/
+ //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA
+ AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA
+ AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///w
+ AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA
+ A///gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA
+ AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA
+ AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAD/AA
+ AAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA
+ AAfAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA
+ AAAAAAADgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA
+ AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA
+ AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAADwAAAAAAA
+ AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAB+AA
+ AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA
+ AA/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA
+ AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA
+ AAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///g
+ AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///4AAAAAAAAAAAAAAAA
+ H////AAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA
+ AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA
+ AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP///////AAAAAAAAAAAAAP//////
+ /4AAAAAAAAAAAAH////////AAAAAAAAAAAAD////////8AAAAAAAAAAAD/////////gAAAAAAAAAAB//
+ ///////+AAAAAAAAAAB//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA
+ AA////////////4AAAAAAAB/////////////gAAAAAAB//////////////AAAAAAD///////////////
+ AAAAAP////////////////AAAA////////8=
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Program.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Program.cs
new file mode 100644
index 0000000..2836caf
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Program.cs
@@ -0,0 +1,22 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace DM_CalibrationTools
+{
+ static class Program
+ {
+ ///
+ /// 搴旂敤绋嬪簭鐨勪富鍏ュ彛鐐广
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForms());
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/AssemblyInfo.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..cc36887
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑甯歌淇℃伅閫氳繃浠ヤ笅
+// 鐗规ч泦鎺у埗銆傛洿鏀硅繖浜涚壒鎬у煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭
+[assembly: AssemblyTitle("DM_CalibrationTools")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("DM_CalibrationTools")]
+[assembly: AssemblyCopyright("Copyright 漏 Microsoft 2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏 ComVisible 璁剧疆涓 false 浣挎绋嬪簭闆嗕腑鐨勭被鍨
+// 瀵 COM 缁勪欢涓嶅彲瑙併 濡傛灉闇瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷锛
+// 鍒欏皢璇ョ被鍨嬩笂鐨 ComVisible 鐗规ц缃负 true銆
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("a6d4a950-c32d-4c5e-be41-7d489806fe28")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅闈㈠洓涓肩粍鎴:
+//
+// 涓荤増鏈
+// 娆$増鏈
+// 鐢熸垚鍙
+// 淇鍙
+//
+// 鍙互鎸囧畾鎵鏈夎繖浜涘硷紝涔熷彲浠ヤ娇鐢ㄢ滅敓鎴愬彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊硷紝
+// 鏂规硶鏄寜濡備笅鎵绀轰娇鐢ㄢ*鈥:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Resources.Designer.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..3d05a4e
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Resources.Designer.cs
@@ -0,0 +1,253 @@
+锘//------------------------------------------------------------------------------
+//
+// 姝や唬鐮佺敱宸ュ叿鐢熸垚銆
+// 杩愯鏃剁増鏈:4.0.30319.42000
+//
+// 瀵规鏂囦欢鐨勬洿鏀瑰彲鑳戒細瀵艰嚧涓嶆纭殑琛屼负锛屽苟涓斿鏋
+// 閲嶆柊鐢熸垚浠g爜锛岃繖浜涙洿鏀瑰皢浼氫涪澶便
+//
+//------------------------------------------------------------------------------
+
+namespace DM_CalibrationTools.Properties {
+ using System;
+
+
+ ///
+ /// 涓涓己绫诲瀷鐨勮祫婧愮被锛岀敤浜庢煡鎵炬湰鍦板寲鐨勫瓧绗︿覆绛夈
+ ///
+ // 姝ょ被鏄敱 StronglyTypedResourceBuilder
+ // 绫婚氳繃绫讳技浜 ResGen 鎴 Visual Studio 鐨勫伐鍏疯嚜鍔ㄧ敓鎴愮殑銆
+ // 鑻ヨ娣诲姞鎴栫Щ闄ゆ垚鍛橈紝璇风紪杈 .ResX 鏂囦欢锛岀劧鍚庨噸鏂拌繍琛 ResGen
+ // (浠 /str 浣滀负鍛戒护閫夐」)锛屾垨閲嶆柊鐢熸垚 VS 椤圭洰銆
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 杩斿洖姝ょ被浣跨敤鐨勭紦瀛樼殑 ResourceManager 瀹炰緥銆
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DM_CalibrationTools.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 浣跨敤姝ゅ己绫诲瀷璧勬簮绫伙紝涓烘墍鏈夎祫婧愭煡鎵
+ /// 閲嶅啓褰撳墠绾跨▼鐨 CurrentUICulture 灞炴с
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap _3d_32px {
+ get {
+ object obj = ResourceManager.GetObject("3d_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap btn_close_18px_1 {
+ get {
+ object obj = ResourceManager.GetObject("btn_close_18px_1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap btn_mini_18px_1 {
+ get {
+ object obj = ResourceManager.GetObject("btn_mini_18px_1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap btn_setting_18px_1 {
+ get {
+ object obj = ResourceManager.GetObject("btn_setting_18px_1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap cancel_24px {
+ get {
+ object obj = ResourceManager.GetObject("cancel_24px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap download_48px {
+ get {
+ object obj = ResourceManager.GetObject("download_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap earth_grid_32px {
+ get {
+ object obj = ResourceManager.GetObject("earth_grid_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap help_48px {
+ get {
+ object obj = ResourceManager.GetObject("help_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap home_48px {
+ get {
+ object obj = ResourceManager.GetObject("home_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap link_48px {
+ get {
+ object obj = ResourceManager.GetObject("link_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap pose_32px {
+ get {
+ object obj = ResourceManager.GetObject("pose_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap question_32px {
+ get {
+ object obj = ResourceManager.GetObject("question_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap question_48px {
+ get {
+ object obj = ResourceManager.GetObject("question_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap refresh_32px {
+ get {
+ object obj = ResourceManager.GetObject("refresh_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap refresh_32px1 {
+ get {
+ object obj = ResourceManager.GetObject("refresh_32px1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap settings_48px {
+ get {
+ object obj = ResourceManager.GetObject("settings_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap test {
+ get {
+ object obj = ResourceManager.GetObject("test", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap tools {
+ get {
+ object obj = ResourceManager.GetObject("tools", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap usb_783px {
+ get {
+ object obj = ResourceManager.GetObject("usb_783px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Resources.resx b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Resources.resx
new file mode 100644
index 0000000..d96163e
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Resources.resx
@@ -0,0 +1,178 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resource\btn_setting_18px_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\3d_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\btn_mini_18px_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\tools.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\question_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\usb_783px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\settings_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\question_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\pose_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\help_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\home_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\btn_close_18px_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\test.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\cancel_24px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\earth_grid_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\refresh_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\link_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\download_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\refresh_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Settings.Designer.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..2b60f3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+锘//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.36415
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace DM_CalibrationTools.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Settings.settings b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘
+
+
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/3d_256px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/3d_256px.png
new file mode 100644
index 0000000..b0e3d04
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/3d_256px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/3d_32px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/3d_32px.png
new file mode 100644
index 0000000..b701ace
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/3d_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/add_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/add_48px.png
new file mode 100644
index 0000000..502ff87
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/add_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/adjustment_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/adjustment_48px.png
new file mode 100644
index 0000000..e73fead
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/adjustment_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/adjustment_logo.ico b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/adjustment_logo.ico
new file mode 100644
index 0000000..315fcaa
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/adjustment_logo.ico differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_Add.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_Add.png
new file mode 100644
index 0000000..257c791
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_Add.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_1.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_1.png
new file mode 100644
index 0000000..5724899
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_1.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_2.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_2.png
new file mode 100644
index 0000000..0ca1482
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_2.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_3.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_3.png
new file mode 100644
index 0000000..2f21702
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_close_18px_3.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_1.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_1.png
new file mode 100644
index 0000000..6fe4747
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_1.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_2.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_2.png
new file mode 100644
index 0000000..00dc5f1
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_2.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_3.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_3.png
new file mode 100644
index 0000000..2c4e583
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_mini_18px_3.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_1.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_1.png
new file mode 100644
index 0000000..f0bda5b
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_1.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_2.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_2.png
new file mode 100644
index 0000000..5583789
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_2.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_3.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_3.png
new file mode 100644
index 0000000..3272a2b
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/btn_setting_18px_3.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/cancel_24px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/cancel_24px.png
new file mode 100644
index 0000000..d78a102
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/cancel_24px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/download_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/download_48px.png
new file mode 100644
index 0000000..18c64e6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/download_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/earth_grid_32px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/earth_grid_32px.png
new file mode 100644
index 0000000..f3fa008
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/earth_grid_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/help_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/help_48px.png
new file mode 100644
index 0000000..bd2f8cf
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/help_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/home_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/home_48px.png
new file mode 100644
index 0000000..08b2734
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/home_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/link_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/link_48px.png
new file mode 100644
index 0000000..d4705a6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/link_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/main_light_bkg_top123.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/main_light_bkg_top123.png
new file mode 100644
index 0000000..43b1190
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/main_light_bkg_top123.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_32px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_32px.png
new file mode 100644
index 0000000..a430360
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_48px - 鍓湰.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_48px - 鍓湰.png
new file mode 100644
index 0000000..7bbcdca
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_48px - 鍓湰.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_48px.png
new file mode 100644
index 0000000..7bbcdca
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/ouput_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/photo_32px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/photo_32px.png
new file mode 100644
index 0000000..004efe5
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/photo_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/photo_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/photo_48px.png
new file mode 100644
index 0000000..544c0f0
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/photo_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/pose_256px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/pose_256px.png
new file mode 100644
index 0000000..274cd58
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/pose_256px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/pose_32px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/pose_32px.png
new file mode 100644
index 0000000..642afaf
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/pose_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/question_32px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/question_32px.png
new file mode 100644
index 0000000..a1ca84d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/question_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/question_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/question_48px.png
new file mode 100644
index 0000000..7e88982
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/question_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/refresh_32px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/refresh_32px.png
new file mode 100644
index 0000000..7a660e2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/refresh_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/refresh_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/refresh_48px.png
new file mode 100644
index 0000000..e47d826
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/refresh_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/render_set_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/render_set_48px.png
new file mode 100644
index 0000000..766ad04
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/render_set_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/settings_48px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/settings_48px.png
new file mode 100644
index 0000000..a652dc3
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/settings_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/test.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/test.png
new file mode 100644
index 0000000..79f3d5d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/test.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/tools.ico b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/tools.ico
new file mode 100644
index 0000000..4bb026f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/tools.ico differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/usb_783px.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/usb_783px.png
new file mode 100644
index 0000000..33e0110
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/Resource/usb_783px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..9564e24
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..b76277a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe
new file mode 100644
index 0000000..8c84517
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.config b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.manifest b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.manifest
new file mode 100644
index 0000000..061c9ca
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.manifest
@@ -0,0 +1,11 @@
+锘
+
+
+
+
+
+
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf
new file mode 100644
index 0000000..cbdb8d4
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf
@@ -0,0 +1,72 @@
+ 鐢电绁炴妧 DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+ DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+ Version 1.0
+ By JustFeng @2017-10-23 16:40:16
+
+杩炴帴浼犳劅鍣
+
+ 1. 灏 DM9 杞翠紶鎰熷櫒鏉垮瓙閫氳繃 USB 杩炴帴鑷崇數鑴戯紝骞跺皢鏉垮瓙涓婄殑鐢垫簮寮鍏虫嫧鍚 Micro-USB
+ 鍙f柟鍚戙
+
+2. 鍙屽嚮杩愯杞欢 鐣岄潰濡備笅鍥炬墍绀
+
+鏌ョ湅杩炴帴鐘舵
+
+ 宸︿笅瑙掓樉绀鸿繛鎺ョ姸鎬侊細濡傛灉妯″潡姝e父杩炴帴鍒欐樉绀衡濆凡杩炴帴鈥濓紱鍙嶄箣濡傛灉妯″潡鏈繛鍒欎細鏄剧ず鈥
+ 鏈繛鎺モ濓紝涓斿ぇ閮ㄥ垎鍔熻兘灏嗗浜庝笉鍙敤鐘舵併
+
+鑾峰彇鏍″噯鏁版嵁
+
+鍗曞嚮 鎸夐挳鍙鍙栭檧铻轰华鏍″噯鍊煎拰纾佸姏璁℃牎鍑嗗硷紝骞舵樉绀哄湪鍙充晶銆
+
+閲嶇疆鏍″噯鏁版嵁
+
+鍗曞嚮 鎸夐挳灏嗕細涓嶅彲閫嗙殑娓呴櫎纾佸姏璁℃牎鍑嗘暟鎹紝鍙兘閫氳繃纾佸姏璁℃牎鍑嗙殑鏂瑰紡閲嶆柊鍐
+ 鐢电绁炴妧 DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+鍏ユ牎鍑嗘暟鎹
+
+鏍″噯闄铻轰华
+
+鍗曞嚮 鎸夐挳鍙牎鍑嗛檧铻轰华闈欐佸亸绉汇傝杩囩▼闇瑕佷繚鎸佹ā鍧楅潤姝笉鍔紝鍚﹀垯鏍″噯鍚
+
+闈欐佹紓绉诲皢浼氭洿澶с
+
+鏍″噯纾佸姏璁
+
+鍗曞嚮 鎸夐挳鍗冲彲杩涘叆纾佸姏璁℃牎鍑嗙姸鎬侊紝璇ョ姸鎬佷笅锛岄渶瑕佺敤鎴锋寜涓嬪浘 a 鏂瑰紡鐢╃┖
+
+闂 8 瀛楋紝鍚屾椂 3D 鏄剧ず浼氬疄鏃剁粯鍒跺嚭褰撳墠绌洪棿纾佸満鐨勬暎鐐瑰浘锛岃灏介噺璁╂暎鐐瑰浘鐪嬭捣鏉ュ儚
+
+涓涓腑蹇冧笉鍦ㄥ渾鐐圭殑妞悆浣擄紝渚嬪涓嬪浘 b 鎵绀恒傚緟瀹屾垚涓婃鎿嶄綔鍗曞嚮 鎸夐挳璁
+
+绠楀苟鍐欏叆纾佸姏璁℃牎鍑嗗笺
+
+ (a) (b)
+
+缁樺埗纾佸姏璁″師濮嬫暟鎹殑鏁g偣鍥
+
+榛樿鐘舵佷负鏄剧ず瑙g畻濮挎侊紝濡傞渶鏌ョ湅涔嬪墠鐨勭鍔涜鏁g偣鍥撅紝鍙崟鍑 鎸夐挳锛
+3D 鏄剧ず涓細鑷姩鍔犺浇涓婃纾佸姏璁¢噰鏍峰煎苟缁樺埗鍘熷鏁g偣鍥俱傛寜閽細鍙樹负 銆
+
+缁樺埗纾佸姏璁℃牎鍑嗗悗鐨勬暎鐐瑰浘
+
+鍗曞嚮 鎸夐挳,鍙煡鐪嬬粡杩囨き鐞冩嫙鍚堜箣鍚庣殑鐞冨舰纾佸姏璁℃暎鐐瑰浘銆傚涓嬪浘鎵绀
+ 鐢电绁炴妧 DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+鏄剧ず濮挎 鎸夐挳鍙垏鎹㈣嚦鏄剧ず濮挎佹ā寮忋
+
+鍗曞嚮
+
+鍏朵粬
+
+ 鍙﹀鍏充簬 3D 鏄剧ず鍣ㄥ尯鍩熺殑鎿嶄綔:
+ 鎸変綇榧犳爣宸﹂敭鎷栧姩锛屽彲鏃嬭浆瑙嗗浘锛
+ 鎸変綇榧犳爣鍙抽敭鎷栧姩锛屾垨婊氬姩榧犳爣婊氳疆锛屽彲缂╂斁瑙嗗浘锛
+ 鍙屽嚮榧犳爣婊氳疆锛屽彲杩樺師榛樿瑙嗗浘锛
+ 鎸変綇 Ctrl 閿拰榧犳爣宸﹂敭骞舵嫋鍔紝鍙Щ鍔ㄨ鍥撅紱
+
+娆㈣繋璁块棶鐢电绁炴妧娣樺疂搴:https://shop408976235.taobao.com
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/Magnet Data.txt b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/Magnet Data.txt
new file mode 100644
index 0000000..196b239
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/Magnet Data.txt
@@ -0,0 +1,1237 @@
+-86 -521 46
+-85 -522 46
+-86 -521 50
+-87 -520 50
+-89 -518 50
+-85 -521 44
+-85 -523 45
+-86 -522 46
+-87 -520 48
+-84 -519 46
+-86 -519 48
+-82 -524 46
+-83 -515 52
+-82 -520 54
+-80 -516 52
+-79 -520 52
+-82 -520 51
+-84 -518 52
+-80 -518 56
+-83 -522 51
+-83 -520 48
+-78 -519 47
+-84 -519 50
+-82 -521 50
+-79 -520 51
+-79 -518 54
+-77 -521 53
+-76 -522 50
+-77 -522 55
+-73 -520 55
+-77 -516 53
+-76 -517 54
+-74 -519 55
+-75 -519 57
+-77 -519 58
+-76 -516 63
+-73 -519 56
+-70 -514 60
+-71 -517 59
+-73 -516 60
+-72 -518 59
+-71 -519 53
+-72 -523 53
+-72 -520 56
+-72 -518 57
+-71 -521 59
+-70 -520 56
+-72 -521 60
+-76 -521 58
+-72 -519 60
+-71 -519 65
+-68 -517 66
+-68 -518 60
+-66 -518 59
+-64 -519 59
+-64 -513 62
+-60 -514 63
+-60 -511 69
+-55 -512 66
+-57 -511 66
+-57 -513 67
+-51 -512 69
+-51 -512 69
+-56 -511 71
+-52 -509 75
+-51 -508 73
+-51 -508 73
+-41 -507 78
+-40 -506 77
+-40 -504 77
+-40 -504 77
+-32 -504 78
+-33 -504 77
+-33 -500 84
+-37 -503 85
+-38 -501 81
+-41 -502 88
+-47 -502 88
+-47 -502 88
+-48 -501 93
+-47 -500 92
+-47 -499 88
+-44 -500 92
+-44 -500 96
+-46 -496 101
+-47 -491 118
+-44 -493 116
+-45 -490 119
+-39 -488 119
+-34 -486 124
+-33 -486 121
+-31 -482 127
+-35 -481 128
+-49 -486 133
+-76 -488 139
+-85 -492 142
+-86 -492 142
+-95 -492 144
+-96 -492 144
+-99 -494 142
+-108 -495 140
+-112 -497 140
+-115 -498 138
+-113 -498 139
+-116 -495 138
+-111 -491 141
+-106 -494 137
+-103 -496 138
+-100 -496 132
+-100 -497 131
+-100 -501 129
+-107 -504 118
+-125 -515 103
+-125 -515 103
+-132 -515 92
+-151 -520 78
+-159 -524 60
+-159 -524 60
+-171 -523 54
+-187 -522 49
+-210 -522 26
+-224 -519 4
+-230 -514 -5
+-259 -500 -48
+-264 -500 -58
+-270 -498 -64
+-266 -491 -91
+-264 -489 -102
+-266 -482 -110
+-274 -474 -115
+-282 -464 -131
+-285 -461 -135
+-289 -454 -134
+-288 -452 -134
+-297 -452 -130
+-295 -451 -134
+-291 -450 -138
+-293 -447 -135
+-290 -456 -129
+-291 -461 -115
+-288 -466 -107
+-293 -478 -72
+-292 -489 -52
+-288 -488 -29
+-289 -496 -2
+-269 -500 48
+-251 -502 72
+-235 -500 95
+-216 -499 112
+-181 -488 141
+-165 -486 154
+-147 -483 167
+-113 -475 179
+-86 -464 188
+-70 -461 186
+-70 -461 186
+-28 -449 178
+-23 -448 171
+-16 -447 168
+-10 -450 161
+-5 -454 158
+-3 -454 158
+0 -452 149
+0 -449 155
+0 -449 155
+1 -448 155
+0 -448 160
+-1 -447 159
+0 -445 160
+4 -439 164
+4 -441 170
+9 -426 183
+9 -426 190
+9 -426 190
+5 -417 192
+1 -410 204
+1 -410 204
+-9 -397 220
+-9 -397 220
+-23 -383 240
+-23 -383 240
+-35 -379 252
+-52 -380 253
+-88 -374 260
+-88 -374 263
+-128 -375 263
+-144 -379 259
+-184 -388 252
+-184 -388 252
+-226 -406 226
+-242 -412 212
+-259 -430 191
+-259 -430 191
+-269 -451 163
+-264 -460 146
+-257 -486 115
+-246 -499 92
+-237 -507 76
+-228 -514 62
+-188 -532 29
+-175 -533 16
+-158 -532 5
+-120 -529 -48
+-120 -529 -48
+-120 -529 -64
+-121 -527 -81
+-120 -518 -99
+-127 -516 -116
+-134 -512 -125
+-145 -507 -136
+-176 -499 -144
+-176 -499 -144
+-190 -497 -145
+-204 -499 -142
+-252 -497 -123
+-252 -497 -123
+-264 -496 -113
+-278 -493 -104
+-311 -484 -55
+-311 -484 -55
+-322 -485 -35
+-328 -485 13
+-315 -487 51
+-315 -487 51
+-304 -486 76
+-284 -484 111
+-257 -491 134
+-257 -491 134
+-235 -486 144
+-193 -490 158
+-158 -496 162
+-131 -495 159
+-119 -494 159
+-91 -496 141
+-91 -496 141
+-65 -493 132
+-55 -491 130
+-33 -492 120
+-6 -480 107
+3 -482 103
+32 -459 96
+38 -453 95
+67 -430 96
+68 -431 103
+78 -414 107
+80 -408 115
+85 -398 127
+85 -398 127
+79 -399 130
+78 -397 132
+74 -389 147
+68 -387 155
+47 -389 185
+43 -389 187
+21 -393 203
+12 -398 200
+0 -405 208
+-18 -406 210
+-38 -413 221
+-52 -418 217
+-56 -423 220
+-71 -429 225
+-101 -437 222
+-107 -439 215
+-124 -442 213
+-124 -442 213
+-133 -446 212
+-147 -454 205
+-172 -459 198
+-186 -471 187
+-193 -474 177
+-206 -488 152
+-210 -496 140
+-215 -500 126
+-216 -513 83
+-208 -518 73
+-202 -522 64
+-182 -532 2
+-178 -533 -14
+-165 -526 -59
+-162 -524 -70
+-164 -522 -82
+-172 -506 -122
+-179 -500 -128
+-188 -496 -139
+-228 -486 -139
+-244 -481 -139
+-258 -480 -137
+-296 -471 -111
+-309 -468 -104
+-320 -470 -89
+-344 -459 -40
+-352 -457 -26
+-358 -454 -7
+-347 -455 70
+-337 -454 96
+-328 -455 115
+-264 -454 178
+-235 -450 189
+-217 -452 202
+-145 -453 211
+-128 -454 212
+-111 -457 205
+-71 -461 190
+-61 -464 188
+-51 -462 177
+-23 -467 153
+-11 -468 141
+3 -465 128
+30 -468 96
+35 -470 78
+44 -461 64
+70 -449 25
+68 -449 18
+74 -444 3
+88 -427 -41
+91 -419 -47
+91 -419 -47
+92 -416 -50
+102 -401 -59
+106 -398 -61
+107 -399 -56
+116 -389 -36
+115 -387 -30
+121 -388 -15
+128 -379 31
+123 -374 52
+119 -377 65
+107 -387 104
+99 -387 116
+92 -390 126
+74 -397 143
+67 -399 153
+57 -406 163
+21 -425 166
+21 -425 166
+18 -432 162
+6 -446 158
+4 -448 157
+-3 -453 153
+-4 -462 145
+-11 -474 133
+-11 -475 132
+-16 -482 124
+-10 -481 124
+-16 -482 121
+-22 -489 120
+-26 -490 122
+-26 -489 121
+-38 -498 119
+-44 -501 117
+-51 -499 114
+-56 -505 107
+-56 -504 108
+-61 -506 103
+-69 -513 100
+-71 -516 105
+-69 -514 97
+-74 -513 93
+-67 -517 95
+-69 -514 88
+-61 -515 75
+-56 -517 75
+-47 -515 71
+-35 -514 53
+-38 -516 49
+-36 -518 45
+-37 -521 29
+-37 -521 29
+-41 -523 17
+-55 -525 -3
+-60 -528 -2
+-75 -529 -13
+-82 -529 -12
+-116 -538 -16
+-125 -536 -19
+-141 -540 -3
+-147 -537 -3
+-158 -539 6
+-157 -538 9
+-165 -540 19
+-169 -536 19
+-171 -540 25
+-170 -538 37
+-170 -534 39
+-173 -539 41
+-169 -530 59
+-171 -536 62
+-161 -528 83
+-161 -528 83
+-158 -526 87
+-150 -521 99
+-150 -521 99
+-146 -523 105
+-133 -516 115
+-124 -515 117
+-116 -513 125
+-116 -513 125
+-110 -515 132
+-96 -510 132
+-96 -510 132
+-84 -504 139
+-73 -499 147
+-73 -499 147
+-68 -498 145
+-51 -492 147
+-51 -492 147
+-43 -489 151
+-22 -483 152
+-22 -483 152
+-11 -482 141
+6 -475 135
+6 -475 135
+15 -469 137
+32 -467 127
+38 -464 123
+44 -459 117
+63 -461 101
+67 -458 102
+72 -455 97
+82 -446 78
+91 -444 73
+89 -447 71
+97 -437 58
+104 -439 52
+106 -434 40
+115 -432 29
+115 -432 29
+113 -431 20
+117 -428 3
+117 -428 3
+117 -428 3
+125 -418 -13
+125 -418 -13
+127 -421 -15
+133 -415 -15
+133 -415 -15
+134 -410 -18
+128 -409 -9
+128 -409 -9
+130 -415 -5
+124 -415 22
+124 -415 22
+120 -418 35
+107 -425 74
+107 -425 74
+102 -428 82
+86 -430 113
+86 -430 113
+67 -435 133
+43 -440 156
+43 -440 156
+27 -440 171
+1 -448 188
+1 -448 188
+-14 -447 194
+-43 -452 204
+-54 -456 204
+-54 -456 204
+-80 -457 211
+-93 -459 209
+-97 -463 209
+-119 -468 196
+-120 -469 203
+-130 -470 202
+-149 -472 203
+-154 -472 201
+-162 -479 196
+-176 -485 183
+-181 -483 180
+-192 -488 175
+-216 -489 157
+-216 -489 157
+-223 -495 154
+-240 -504 122
+-240 -504 122
+-242 -508 117
+-250 -514 84
+-248 -516 79
+-258 -522 54
+-258 -522 54
+-258 -522 49
+-250 -527 12
+-250 -527 12
+-248 -529 5
+-244 -533 -29
+-232 -530 -62
+-227 -530 -68
+-201 -534 -90
+-196 -532 -97
+-161 -528 -115
+-128 -529 -121
+-94 -522 -115
+-66 -519 -108
+-47 -519 -94
+-66 -517 -121
+-114 -515 -142
+-125 -515 -147
+-142 -516 -146
+-137 -515 -144
+-140 -517 -146
+-147 -514 -141
+-146 -518 -145
+-146 -515 -139
+-151 -519 -135
+-148 -526 -129
+-143 -523 -122
+-130 -518 -127
+-122 -518 -131
+-112 -515 -140
+-107 -510 -140
+-107 -510 -140
+-97 -513 -132
+-97 -516 -130
+-84 -511 -131
+-75 -508 -131
+-39 -505 -115
+-32 -503 -109
+-3 -504 -90
+-2 -499 -81
+14 -497 -57
+13 -496 -55
+16 -498 -37
+20 -497 -37
+23 -501 -16
+19 -499 -13
+20 -503 -3
+18 -501 3
+13 -504 25
+11 -506 29
+10 -506 47
+10 -507 46
+-9 -505 59
+-11 -504 62
+-25 -509 72
+-27 -513 81
+-38 -518 92
+-41 -518 94
+-67 -516 104
+-80 -516 103
+-86 -522 101
+-95 -521 105
+-95 -521 105
+-112 -520 105
+-112 -520 105
+-117 -524 103
+-120 -522 104
+-140 -524 104
+-140 -524 104
+-144 -523 108
+-163 -527 107
+-169 -524 104
+-186 -525 94
+-189 -527 93
+-208 -522 82
+-215 -524 77
+-222 -522 58
+-228 -524 58
+-235 -522 39
+-238 -527 37
+-235 -527 23
+-237 -534 26
+-240 -529 8
+-243 -528 0
+-240 -528 -22
+-240 -528 -22
+-233 -527 -37
+-235 -527 -45
+-233 -526 -52
+-231 -531 -56
+-229 -526 -58
+-236 -526 -53
+-238 -525 -45
+-242 -527 -33
+-252 -527 -16
+-253 -523 -11
+-258 -524 9
+-254 -524 17
+-259 -522 38
+-245 -518 90
+-234 -511 110
+-223 -508 137
+-220 -506 140
+-214 -505 151
+-215 -506 151
+-202 -503 161
+-202 -503 161
+-181 -498 173
+-181 -498 173
+-154 -492 183
+-146 -490 186
+-118 -483 191
+-118 -483 191
+-67 -469 202
+-15 -455 184
+-15 -455 184
+5 -449 178
+41 -444 154
+48 -443 148
+74 -436 115
+78 -439 108
+98 -431 70
+112 -422 42
+114 -418 30
+114 -418 30
+122 -406 -37
+113 -400 -86
+88 -398 -133
+57 -397 -170
+50 -396 -178
+4 -399 -211
+-46 -399 -232
+-96 -402 -242
+-96 -402 -242
+-165 -408 -241
+-241 -416 -220
+-265 -423 -205
+-281 -420 -193
+-293 -422 -182
+-303 -421 -175
+-303 -421 -175
+-337 -421 -143
+-337 -421 -143
+-352 -421 -110
+-356 -420 -104
+-365 -418 -91
+-364 -416 -85
+-364 -416 -85
+-360 -418 -102
+-354 -423 -108
+-312 -419 -175
+-223 -417 -224
+-223 -417 -224
+-121 -406 -248
+-121 -406 -248
+-24 -386 -237
+-13 -383 -230
+21 -371 -220
+31 -370 -208
+63 -362 -191
+63 -362 -191
+118 -347 -133
+124 -344 -130
+131 -337 -121
+132 -325 -130
+124 -324 -145
+65 -320 -219
+40 -323 -239
+-58 -326 -272
+-58 -326 -272
+-83 -330 -279
+-194 -339 -274
+-194 -339 -274
+-266 -346 -247
+-266 -346 -247
+-311 -350 -213
+-328 -352 -193
+-328 -352 -193
+-342 -354 -177
+-345 -355 -177
+-359 -365 -148
+-359 -365 -148
+-358 -377 -132
+-361 -377 -132
+-357 -389 -129
+-357 -389 -129
+-359 -405 -106
+-359 -409 -109
+-350 -416 -104
+-350 -416 -104
+-350 -418 -99
+-351 -417 -103
+-348 -415 -103
+-352 -412 -104
+-350 -409 -118
+-350 -409 -118
+-346 -405 -132
+-346 -405 -132
+-323 -396 -165
+-323 -396 -165
+-292 -389 -198
+-292 -389 -198
+-264 -381 -219
+-264 -381 -219
+-238 -382 -235
+-238 -382 -235
+-216 -381 -231
+-212 -383 -239
+-159 -377 -252
+-144 -375 -255
+-116 -383 -250
+-112 -386 -250
+-51 -391 -239
+-45 -386 -232
+27 -390 -195
+27 -390 -195
+89 -388 -126
+89 -388 -126
+118 -391 -63
+127 -394 -12
+121 -399 49
+121 -399 49
+111 -401 99
+111 -401 99
+102 -404 121
+91 -399 146
+91 -399 146
+93 -389 146
+127 -384 88
+132 -382 59
+136 -376 -39
+136 -376 -39
+78 -382 -159
+-8 -393 -220
+-8 -393 -220
+-80 -409 -230
+-80 -409 -230
+-128 -426 -223
+-128 -426 -223
+-149 -447 -208
+-166 -476 -168
+-128 -494 -134
+-100 -510 -93
+-73 -510 -80
+-73 -510 -80
+-36 -498 -79
+-7 -489 -78
+31 -474 -49
+48 -469 -19
+62 -461 22
+67 -461 29
+59 -456 82
+47 -458 104
+27 -465 119
+5 -472 139
+-24 -480 153
+-59 -484 155
+-80 -487 162
+-98 -486 170
+-105 -487 176
+-55 -474 176
+-5 -453 165
+65 -434 131
+65 -434 131
+123 -404 1
+117 -398 -64
+53 -395 -169
+-30 -405 -227
+-97 -410 -234
+-146 -415 -237
+-160 -412 -234
+-212 -425 -220
+-237 -418 -214
+-272 -413 -197
+-294 -411 -186
+-306 -398 -186
+-306 -398 -186
+-306 -393 -189
+-278 -378 -220
+-278 -378 -220
+-170 -347 -272
+-170 -347 -272
+-46 -322 -266
+43 -306 -220
+126 -311 -122
+155 -324 -10
+129 -356 99
+32 -425 159
+9 -452 148
+-14 -481 113
+-24 -498 79
+-39 -506 76
+-33 -503 73
+-27 -504 63
+-22 -503 54
+-15 -504 40
+-5 -500 31
+-8 -502 23
+6 -499 6
+12 -494 -19
+8 -491 -45
+4 -495 -51
+-4 -491 -74
+-8 -491 -82
+-34 -493 -116
+-72 -492 -136
+-95 -493 -150
+-127 -487 -160
+-137 -486 -168
+-186 -473 -176
+-216 -447 -206
+-218 -437 -210
+-147 -380 -261
+-147 -380 -261
+-1 -330 -244
+141 -292 -126
+141 -292 -126
+168 -289 26
+154 -302 91
+114 -328 161
+114 -328 161
+84 -371 171
+64 -406 162
+75 -440 92
+72 -461 44
+64 -475 -20
+28 -486 -94
+-19 -489 -145
+-110 -498 -170
+-110 -498 -170
+-187 -516 -127
+-223 -531 -73
+-194 -543 -24
+-146 -550 -5
+-110 -543 -33
+-76 -532 -76
+-55 -502 -133
+-58 -471 -173
+-73 -439 -216
+-67 -396 -245
+0 -335 -249
+102 -299 -175
+169 -282 -15
+130 -308 152
+42 -342 236
+-61 -395 256
+-141 -457 210
+-143 -490 160
+-54 -524 65
+-35 -524 -1
+-58 -520 -93
+-127 -519 -120
+-176 -525 -108
+-223 -531 -57
+-228 -537 0
+-205 -535 54
+-170 -533 82
+-134 -531 87
+-91 -532 68
+-47 -526 35
+-32 -518 0
+11 -496 6
+38 -477 32
+42 -467 86
+31 -465 115
+4 -472 144
+-21 -476 157
+-54 -483 170
+-89 -491 175
+-89 -491 175
+-121 -494 176
+-125 -494 179
+-114 -490 183
+-58 -476 181
+-42 -477 180
+33 -455 138
+84 -440 69
+90 -440 -43
+50 -437 -131
+-11 -444 -176
+-63 -453 -190
+-93 -455 -201
+-133 -450 -208
+-157 -440 -216
+-171 -416 -233
+-66 -339 -267
+57 -274 -212
+161 -215 -68
+171 -200 22
+152 -209 126
+117 -251 189
+86 -324 196
+29 -417 174
+-61 -505 103
+-134 -529 14
+-191 -529 -35
+-246 -511 -61
+-285 -498 -59
+-298 -493 -59
+-312 -490 -51
+-326 -488 -29
+-315 -496 -3
+-292 -509 14
+-257 -521 13
+-187 -542 -7
+-129 -543 -23
+-86 -529 -36
+-53 -515 -64
+-22 -496 -94
+18 -466 -117
+54 -429 -127
+107 -385 -98
+150 -342 -45
+166 -304 28
+155 -286 103
+127 -289 170
+72 -305 223
+16 -336 253
+-31 -357 262
+-74 -391 259
+-121 -414 244
+-148 -432 233
+-158 -431 235
+-149 -413 252
+-64 -360 271
+37 -312 244
+124 -275 166
+170 -254 62
+175 -237 -34
+151 -225 -119
+95 -218 -208
+29 -217 -254
+-5 -218 -270
+-5 -200 -261
+7 -173 -256
+13 -144 -240
+29 -105 -218
+27 -88 -202
+18 -53 -189
+-10 -40 -187
+-37 -23 -184
+-57 -9 -177
+-70 0 -167
+-74 13 -151
+-91 22 -141
+-111 24 -142
+-133 24 -142
+-157 20 -145
+-161 18 -141
+-153 20 -130
+-148 24 -138
+-136 19 -146
+-140 10 -160
+-140 -3 -182
+-95 -26 -202
+-93 -57 -235
+-72 -96 -259
+-60 -137 -271
+-55 -172 -280
+-49 -201 -280
+-46 -225 -284
+-41 -236 -281
+-17 -245 -272
+17 -242 -255
+94 -231 -201
+162 -214 -82
+165 -216 74
+134 -229 151
+112 -234 187
+115 -227 186
+120 -217 180
+140 -205 144
+165 -186 73
+173 -181 -43
+141 -193 -138
+63 -229 -224
+-64 -275 -283
+-138 -311 -289
+-195 -341 -277
+-233 -361 -253
+-274 -393 -216
+-267 -425 -195
+-227 -461 -176
+-180 -471 -180
+-117 -468 -193
+-27 -454 -181
+24 -440 -169
+51 -430 -151
+39 -428 -159
+33 -424 -158
+43 -386 -180
+88 -342 -162
+152 -272 -89
+169 -222 65
+124 -231 180
+44 -274 251
+1 -389 224
+-11 -475 122
+23 -492 7
+23 -481 -64
+9 -466 -130
+-25 -457 -175
+-111 -467 -204
+-186 -490 -170
+-236 -511 -101
+-230 -530 -40
+-171 -542 -19
+-97 -533 -35
+12 -487 -62
+109 -410 -28
+155 -326 74
+115 -242 185
+40 -213 250
+-24 -216 283
+-63 -239 289
+-69 -257 292
+-50 -253 293
+53 -219 240
+114 -199 173
+169 -185 -8
+136 -195 -129
+28 -246 -250
+-77 -295 -282
+-198 -340 -270
+-260 -372 -234
+-288 -379 -213
+-284 -374 -219
+-201 -324 -273
+-3 -221 -257
+133 -164 -117
+149 -167 97
+84 -253 216
+43 -372 190
+5 -464 129
+-33 -513 17
+-5 -501 -38
+10 -483 -88
+-14 -490 -118
+-52 -511 -101
+-56 -523 -62
+-46 -523 -46
+-28 -517 -51
+-46 -496 -114
+-93 -483 -161
+-140 -472 -187
+-185 -441 -211
+-180 -383 -254
+21 -243 -247
+154 -153 -23
+115 -153 165
+-59 -235 290
+-128 -314 286
+-119 -428 220
+-146 -509 112
+-208 -521 29
+-247 -513 0
+-305 -492 19
+-331 -478 34
+-335 -472 47
+-290 -500 63
+-228 -526 69
+-156 -538 45
+-76 -532 28
+34 -482 46
+75 -418 123
+-51 -375 260
+-200 -366 266
+-327 -368 197
+-375 -406 92
+-358 -447 14
+-315 -485 23
+-226 -505 110
+-128 -485 163
+-63 -467 179
+21 -426 167
+88 -396 127
+135 -364 25
+122 -359 -83
+55 -387 -165
+4 -420 -180
+12 -461 -116
+59 -455 37
+85 -413 138
+55 -329 249
+-24 -232 302
+-99 -173 299
+-184 -131 270
+-291 -120 214
+-361 -145 153
+-394 -182 124
+-409 -263 127
+-382 -382 128
+-321 -459 104
+-239 -513 88
+-157 -528 79
+-50 -521 25
+34 -487 -7
+73 -438 -68
+44 -398 -178
+-89 -388 -260
+-239 -389 -245
+-354 -374 -167
+-400 -373 -86
+-411 -389 -1
+-376 -411 78
+-322 -450 112
+-302 -471 96
+-305 -471 99
+-338 -460 54
+-358 -427 -83
+-276 -390 -216
+-129 -345 -274
+38 -311 -227
+162 -313 -6
+104 -379 117
+7 -472 122
+-53 -520 55
+-62 -531 -25
+-89 -517 -113
+-138 -519 -134
+-179 -525 -116
+-207 -543 -16
+-161 -543 33
+-75 -537 15
+-67 -525 -54
+-94 -508 -122
+-116 -477 -180
+-78 -389 -248
+82 -260 -202
+171 -206 -11
+122 -223 180
+-7 -276 279
+-193 -388 258
+-256 -469 157
+-194 -514 110
+-110 -533 40
+-106 -532 -42
+-135 -535 -54
+-152 -537 1
+-110 -528 69
+-25 -503 67
+25 -483 -2
+17 -477 -82
+12 -443 -145
+48 -362 -199
+168 -231 -48
+139 -186 142
+-45 -201 285
+-203 -245 290
+-283 -307 252
+-199 -395 250
+-43 -479 151
+-33 -519 1
+-144 -532 -52
+-253 -521 -63
+-338 -487 -26
+-352 -469 50
+-298 -475 134
+-224 -500 148
+-127 -520 132
+-12 -507 60
+24 -490 -39
+36 -448 -129
+140 -332 -99
+160 -225 115
+11 -231 275
+-230 -333 269
+-335 -432 128
+-334 -473 -22
+-331 -449 -105
+-348 -396 -153
+-415 -333 96
+-180 -252 296
+125 -162 148
+171 -179 -35
+115 -253 -170
+82 -316 -185
+93 -369 -150
+130 -385 -42
+107 -397 108
+-8 -447 181
+-77 -479 175
+-113 -477 182
+-189 -481 173
+-241 -483 143
+-297 -487 82
+-314 -487 2
+-303 -495 -47
+-274 -516 -2
+-190 -529 92
+18 -473 145
+135 -408 31
+119 -386 -122
+66 -403 -161
+43 -439 -132
+44 -478 -5
+-20 -464 158
+-87 -412 244
+-171 -387 261
+-228 -395 246
+-259 -411 217
+-277 -431 186
+-281 -448 164
+-280 -462 151
+-283 -471 132
+-279 -476 123
+-290 -480 109
+-282 -480 107
+-282 -478 110
+-262 -478 135
+-218 -475 166
+-182 -483 166
+-127 -492 166
+-73 -501 130
+-42 -513 79
+-50 -530 35
+-69 -533 0
+-81 -539 -4
+-92 -543 -1
+-112 -542 10
+-123 -545 16
+-136 -544 4
+-141 -549 -5
+-155 -548 -4
+-152 -550 -11
+-153 -551 -1
+-151 -546 -13
+-148 -549 -7
+-145 -548 4
+-135 -551 5
+-127 -549 17
+-125 -546 20
+-127 -547 8
+-120 -550 2
+-114 -551 4
+-116 -547 0
+-120 -550 -20
+-117 -549 -57
+-112 -544 -81
+-109 -544 -77
+-99 -543 -79
+-68 -537 -79
+-58 -532 -82
+-52 -527 -79
+-44 -533 -80
+-44 -530 -71
+-37 -526 -70
+-35 -531 -70
+-40 -531 -71
+-35 -534 -65
+-37 -532 -54
+-38 -532 -56
+-35 -529 -58
+-35 -531 -55
+-34 -534 -62
+-29 -529 -61
+-33 -531 -61
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/data.txt b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/data.txt
new file mode 100644
index 0000000..bb5eed1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/data.txt
@@ -0,0 +1,1123 @@
+-350 -558 398
+-352 -557 401
+-354 -560 407
+-351 -562 405
+-354 -558 405
+-352 -559 401
+-350 -554 404
+-349 -558 400
+-349 -553 399
+-350 -553 399
+-348 -554 399
+-349 -551 400
+-346 -554 401
+-344 -553 404
+-348 -551 401
+-345 -551 404
+-347 -553 400
+-349 -554 406
+-349 -549 406
+-348 -551 412
+-350 -553 413
+-347 -550 418
+-347 -552 419
+-348 -550 421
+-349 -552 427
+-349 -554 430
+-348 -554 436
+-346 -550 439
+-344 -548 443
+-341 -549 447
+-340 -549 458
+-339 -550 466
+-341 -548 475
+-341 -548 475
+-343 -545 488
+-348 -547 496
+-358 -538 520
+-358 -538 520
+-363 -537 533
+-364 -535 544
+-357 -529 545
+-344 -527 546
+-336 -521 541
+-357 -518 571
+-392 -512 590
+-417 -507 601
+-435 -497 613
+-453 -490 624
+-476 -481 630
+-473 -478 627
+-458 -486 629
+-452 -487 630
+-455 -482 634
+-446 -489 624
+-440 -494 623
+-440 -495 618
+-453 -498 611
+-452 -496 609
+-462 -503 601
+-464 -504 599
+-487 -510 583
+-496 -509 568
+-503 -514 565
+-511 -514 554
+-521 -521 540
+-522 -517 534
+-520 -518 533
+-515 -523 521
+-511 -527 508
+-511 -527 508
+-500 -531 501
+-486 -538 500
+-458 -544 497
+-446 -544 493
+-440 -549 483
+-437 -550 475
+-430 -551 464
+-430 -551 464
+-423 -550 444
+-419 -548 438
+-411 -553 439
+-412 -551 441
+-413 -548 451
+-408 -547 456
+-380 -543 475
+-380 -543 475
+-339 -534 475
+-319 -526 464
+-286 -516 425
+-286 -516 425
+-266 -502 393
+-265 -494 368
+-261 -483 341
+-268 -472 314
+-277 -463 288
+-291 -452 267
+-320 -433 226
+-336 -425 215
+-356 -425 209
+-377 -415 200
+-412 -409 192
+-426 -402 191
+-439 -399 191
+-451 -399 193
+-466 -392 190
+-469 -389 185
+-469 -384 181
+-463 -385 183
+-440 -377 176
+-422 -379 174
+-396 -384 177
+-365 -382 186
+-301 -397 215
+-301 -397 215
+-245 -417 272
+-223 -426 315
+-213 -457 418
+-223 -467 469
+-250 -481 525
+-302 -492 574
+-502 -512 548
+-573 -512 455
+-599 -498 407
+-608 -471 335
+-595 -471 316
+-580 -467 292
+-559 -469 273
+-528 -468 257
+-477 -473 247
+-455 -479 247
+-441 -479 246
+-436 -484 243
+-432 -485 254
+-430 -488 262
+-434 -491 267
+-434 -491 267
+-444 -500 288
+-453 -510 301
+-456 -517 317
+-456 -525 330
+-470 -538 363
+-472 -543 386
+-476 -548 403
+-467 -551 426
+-431 -557 455
+-414 -554 465
+-392 -550 472
+-363 -545 480
+-281 -514 431
+-281 -514 431
+-270 -502 398
+-261 -488 366
+-277 -458 289
+-298 -446 261
+-324 -433 236
+-387 -414 209
+-437 -397 191
+-437 -397 191
+-456 -395 197
+-494 -383 196
+-520 -369 198
+-520 -369 198
+-531 -363 199
+-554 -350 204
+-565 -337 207
+-565 -337 207
+-573 -338 213
+-591 -338 221
+-602 -336 232
+-602 -336 232
+-608 -336 237
+-612 -336 240
+-589 -321 215
+-589 -321 215
+-577 -318 204
+-563 -309 190
+-492 -283 160
+-438 -267 148
+-438 -267 148
+-340 -249 155
+-237 -235 199
+-237 -235 199
+-190 -235 239
+-154 -236 283
+-109 -268 465
+-109 -268 465
+-118 -279 526
+-176 -307 625
+-258 -331 689
+-258 -331 689
+-307 -344 706
+-383 -378 703
+-452 -413 678
+-477 -431 656
+-477 -431 656
+-502 -467 616
+-493 -501 566
+-493 -501 566
+-481 -520 540
+-465 -531 512
+-414 -540 483
+-410 -543 463
+-404 -545 442
+-385 -545 395
+-369 -533 352
+-355 -523 329
+-349 -512 307
+-364 -488 262
+-364 -488 262
+-369 -482 245
+-382 -478 239
+-393 -480 239
+-393 -480 239
+-412 -493 252
+-422 -499 259
+-443 -520 273
+-443 -520 273
+-451 -523 288
+-467 -536 317
+-466 -540 329
+-456 -545 345
+-456 -545 345
+-424 -550 382
+-381 -547 383
+-381 -547 383
+-367 -537 373
+-343 -516 323
+-384 -478 248
+-384 -478 248
+-425 -458 227
+-521 -427 232
+-590 -425 271
+-590 -425 271
+-605 -419 289
+-634 -404 305
+-652 -398 338
+-663 -396 359
+-663 -396 359
+-673 -388 368
+-681 -371 374
+-683 -364 374
+-684 -358 382
+-690 -331 360
+-690 -331 360
+-684 -319 333
+-670 -305 288
+-533 -265 169
+-533 -265 169
+-458 -256 144
+-374 -255 147
+-147 -288 321
+-147 -288 321
+-127 -317 412
+-159 -368 547
+-244 -404 627
+-244 -404 627
+-288 -419 647
+-328 -439 648
+-407 -467 631
+-407 -467 631
+-416 -481 618
+-422 -491 601
+-443 -517 560
+-443 -517 560
+-442 -523 546
+-427 -537 517
+-411 -542 483
+-401 -544 474
+-393 -545 463
+-379 -544 451
+-325 -524 385
+-315 -514 346
+-318 -495 300
+-393 -451 224
+-478 -414 206
+-505 -410 216
+-546 -412 240
+-581 -408 257
+-601 -403 273
+-624 -402 295
+-639 -394 316
+-646 -390 330
+-658 -391 348
+-670 -382 362
+-678 -376 376
+-685 -364 414
+-693 -356 421
+-693 -356 421
+-699 -336 451
+-699 -336 451
+-706 -318 445
+-711 -291 416
+-710 -276 399
+-710 -276 399
+-647 -204 253
+-605 -181 215
+-555 -164 187
+-346 -137 173
+-264 -141 197
+-187 -151 259
+-104 -209 473
+-116 -229 539
+-141 -247 591
+-214 -284 675
+-258 -314 697
+-339 -361 708
+-414 -404 692
+-448 -426 669
+-466 -449 648
+-496 -504 560
+-498 -516 539
+-491 -525 517
+-463 -544 465
+-461 -544 453
+-454 -544 453
+-406 -548 451
+-383 -546 434
+-368 -542 422
+-352 -516 332
+-352 -516 332
+-390 -478 247
+-500 -425 223
+-500 -425 223
+-554 -419 242
+-597 -401 269
+-619 -396 280
+-619 -396 280
+-641 -378 303
+-657 -357 306
+-664 -348 304
+-668 -343 310
+-681 -328 334
+-686 -329 341
+-688 -326 342
+-694 -318 359
+-696 -319 364
+-698 -317 370
+-700 -326 399
+-703 -333 400
+-701 -343 400
+-689 -366 407
+-690 -374 403
+-684 -382 402
+-674 -392 379
+-669 -398 369
+-666 -403 356
+-653 -397 338
+-656 -395 330
+-659 -385 326
+-658 -367 311
+-655 -364 309
+-661 -360 307
+-666 -354 300
+-661 -354 292
+-656 -351 283
+-636 -343 241
+-636 -331 231
+-629 -328 221
+-607 -308 194
+-607 -308 194
+-596 -308 192
+-521 -265 153
+-468 -250 140
+-419 -245 140
+-268 -285 188
+-223 -310 224
+-180 -331 286
+-160 -392 437
+-176 -415 485
+-206 -438 521
+-304 -477 586
+-330 -490 585
+-352 -496 586
+-404 -512 579
+-411 -519 572
+-415 -522 568
+-435 -534 544
+-435 -534 544
+-442 -539 540
+-439 -542 528
+-441 -545 525
+-436 -545 510
+-411 -550 498
+-399 -550 489
+-385 -550 476
+-352 -546 447
+-352 -546 447
+-329 -541 431
+-297 -507 339
+-297 -507 339
+-306 -492 303
+-433 -425 204
+-433 -425 204
+-470 -411 201
+-555 -396 223
+-575 -388 233
+-586 -382 247
+-629 -380 280
+-643 -380 296
+-650 -379 311
+-664 -374 339
+-668 -378 349
+-674 -377 357
+-681 -386 404
+-683 -387 416
+-685 -391 428
+-694 -381 448
+-694 -375 451
+-697 -366 454
+-706 -330 450
+-706 -330 450
+-713 -301 419
+-660 -202 270
+-660 -202 270
+-607 -181 216
+-254 -161 205
+-254 -161 205
+-174 -177 279
+-115 -262 525
+-115 -262 525
+-143 -284 596
+-195 -307 659
+-429 -375 715
+-429 -375 715
+-429 -375 715
+-552 -430 635
+-578 -447 600
+-589 -461 574
+-586 -487 520
+-579 -501 500
+-570 -513 473
+-526 -532 421
+-526 -532 421
+-519 -536 416
+-505 -537 450
+-505 -537 450
+-487 -539 473
+-425 -550 496
+-425 -550 496
+-400 -546 493
+-272 -482 322
+-272 -482 322
+-285 -455 269
+-410 -408 191
+-410 -408 191
+-466 -378 187
+-547 -342 202
+-547 -342 202
+-592 -331 229
+-646 -313 275
+-646 -313 275
+-667 -314 305
+-686 -318 335
+-686 -318 335
+-698 -319 377
+-705 -338 439
+-705 -338 439
+-701 -360 446
+-701 -360 446
+-701 -354 419
+-700 -334 378
+-700 -334 378
+-696 -328 360
+-639 -286 242
+-639 -286 242
+-581 -257 195
+-424 -221 143
+-424 -221 143
+-261 -215 183
+-112 -260 388
+-112 -260 388
+-126 -305 543
+-296 -372 691
+-413 -402 695
+-522 -441 633
+-522 -441 633
+-552 -479 576
+-542 -513 519
+-534 -523 505
+-526 -530 492
+-510 -539 477
+-501 -545 468
+-484 -552 447
+-456 -552 427
+-456 -552 427
+-449 -554 412
+-443 -553 400
+-446 -553 398
+-463 -548 416
+-463 -548 416
+-448 -554 432
+-405 -555 457
+-405 -555 457
+-358 -548 444
+-290 -500 330
+-290 -500 330
+-321 -449 239
+-419 -408 192
+-419 -408 192
+-471 -379 182
+-543 -349 204
+-566 -343 207
+-586 -333 221
+-639 -305 267
+-659 -299 291
+-673 -292 310
+-698 -283 349
+-698 -283 349
+-701 -267 355
+-694 -220 331
+-677 -206 307
+-677 -206 307
+-442 -131 164
+-442 -131 164
+-371 -128 166
+-116 -163 378
+-116 -163 378
+-99 -190 463
+-207 -278 673
+-253 -296 699
+-373 -334 723
+-392 -358 712
+-400 -383 704
+-425 -441 663
+-437 -458 648
+-442 -481 626
+-438 -511 581
+-441 -527 548
+-441 -542 498
+-441 -542 498
+-432 -548 474
+-422 -553 454
+-422 -553 454
+-409 -551 451
+-371 -548 428
+-356 -544 412
+-373 -501 284
+-409 -490 261
+-561 -453 284
+-561 -453 284
+-581 -451 293
+-640 -426 338
+-640 -426 338
+-650 -421 352
+-683 -389 415
+-683 -389 415
+-686 -379 429
+-698 -347 470
+-703 -344 487
+-702 -331 502
+-713 -265 479
+-718 -248 454
+-649 -173 263
+-587 -159 211
+-312 -146 177
+-219 -165 226
+-140 -286 585
+-140 -286 585
+-226 -335 669
+-350 -406 685
+-350 -406 685
+-405 -471 636
+-409 -482 625
+-411 -494 610
+-403 -526 554
+-401 -532 545
+-385 -536 518
+-378 -541 510
+-364 -540 502
+-306 -527 417
+-300 -521 377
+-349 -482 257
+-387 -471 243
+-517 -454 239
+-544 -448 251
+-618 -429 302
+-637 -420 317
+-679 -394 391
+-689 -389 407
+-694 -366 497
+-690 -363 522
+-672 -326 591
+-664 -321 610
+-645 -289 643
+-641 -276 637
+-664 -222 615
+-672 -207 593
+-701 -160 483
+-701 -146 430
+-604 -114 245
+-548 -110 198
+-177 -151 270
+-120 -180 362
+-178 -335 614
+-210 -362 636
+-308 -459 621
+-326 -484 603
+-348 -523 545
+-347 -527 535
+-322 -525 499
+-312 -525 491
+-252 -498 402
+-245 -484 360
+-334 -429 211
+-387 -414 190
+-635 -370 276
+-663 -365 321
+-699 -352 441
+-699 -352 441
+-694 -342 525
+-686 -335 547
+-648 -324 622
+-641 -320 633
+-584 -293 687
+-565 -288 702
+-489 -273 737
+-473 -272 742
+-405 -258 748
+-391 -264 751
+-351 -272 741
+-351 -272 741
+-372 -264 753
+-377 -264 751
+-452 -252 747
+-484 -253 740
+-634 -225 653
+-663 -222 617
+-718 -219 436
+-715 -221 397
+-647 -252 247
+-620 -268 217
+-474 -339 166
+-449 -361 167
+-375 -404 194
+-375 -404 194
+-285 -453 267
+-285 -453 267
+-266 -479 322
+-256 -482 338
+-237 -490 403
+-236 -490 420
+-217 -479 454
+-213 -474 466
+-197 -464 460
+-190 -459 455
+-174 -440 414
+-174 -440 414
+-179 -435 384
+-179 -435 384
+-189 -446 372
+-185 -452 371
+-186 -449 367
+-186 -449 367
+-182 -434 340
+-185 -424 323
+-258 -383 209
+-356 -357 163
+-356 -357 163
+-468 -316 156
+-468 -316 156
+-557 -283 185
+-570 -279 194
+-640 -268 243
+-649 -268 261
+-692 -279 327
+-693 -283 340
+-709 -300 388
+-709 -300 388
+-706 -323 409
+-708 -324 408
+-707 -338 409
+-707 -338 409
+-702 -330 385
+-702 -330 385
+-699 -302 360
+-698 -300 354
+-686 -235 309
+-626 -186 229
+-600 -174 214
+-477 -148 162
+-477 -148 162
+-182 -220 245
+-156 -254 280
+-144 -352 366
+-144 -352 366
+-188 -445 451
+-188 -445 451
+-225 -483 443
+-225 -483 443
+-246 -496 433
+-246 -496 433
+-233 -484 398
+-233 -484 398
+-264 -429 256
+-264 -429 256
+-437 -369 177
+-437 -369 177
+-555 -336 199
+-579 -331 211
+-629 -306 254
+-648 -299 268
+-694 -283 351
+-699 -279 362
+-713 -272 418
+-714 -272 427
+-713 -273 445
+-713 -273 445
+-713 -277 434
+-713 -277 434
+-703 -304 372
+-703 -304 372
+-674 -327 306
+-674 -327 306
+-634 -352 260
+-634 -352 260
+-603 -369 241
+-603 -369 241
+-605 -372 245
+-608 -370 248
+-613 -373 246
+-608 -366 239
+-605 -366 233
+-543 -317 177
+-543 -317 177
+-385 -260 146
+-385 -260 146
+-184 -289 252
+-163 -299 286
+-135 -353 444
+-147 -375 486
+-240 -453 560
+-240 -453 560
+-355 -538 480
+-371 -545 449
+-455 -539 367
+-455 -539 367
+-511 -525 372
+-511 -525 372
+-449 -549 433
+-367 -543 403
+-361 -537 387
+-454 -497 276
+-454 -497 276
+-596 -481 370
+-596 -481 370
+-635 -458 478
+-637 -446 501
+-670 -383 540
+-688 -353 524
+-579 -202 186
+-579 -202 186
+-162 -199 272
+-105 -263 461
+-111 -279 486
+-162 -383 532
+-182 -412 539
+-267 -504 468
+-294 -520 445
+-420 -553 445
+-399 -542 521
+-399 -542 521
+-307 -527 494
+-307 -527 494
+-296 -513 346
+-296 -513 346
+-439 -489 268
+-439 -489 268
+-575 -485 338
+-575 -485 338
+-638 -460 432
+-638 -460 432
+-692 -342 374
+-692 -342 374
+-530 -208 163
+-530 -208 163
+-124 -264 362
+-124 -264 362
+-152 -352 553
+-221 -434 573
+-221 -434 573
+-254 -485 508
+-254 -485 508
+-277 -495 347
+-417 -469 240
+-417 -469 240
+-580 -455 301
+-580 -455 301
+-639 -450 400
+-639 -450 400
+-642 -437 525
+-642 -437 525
+-591 -430 613
+-563 -412 650
+-563 -412 650
+-623 -409 595
+-623 -409 595
+-617 -372 251
+-307 -427 237
+-307 -427 237
+-247 -490 447
+-327 -536 478
+-327 -536 478
+-381 -549 436
+-381 -549 436
+-395 -549 394
+-390 -521 315
+-411 -515 296
+-541 -474 295
+-624 -465 413
+-628 -464 443
+-618 -441 559
+-615 -431 584
+-534 -388 686
+-534 -388 686
+-457 -318 737
+-526 -218 716
+-580 -198 678
+-662 -100 351
+-286 -97 204
+-123 -280 550
+-204 -429 533
+-379 -536 520
+-393 -526 556
+-263 -502 428
+-306 -484 297
+-391 -491 269
+-485 -502 286
+-509 -494 292
+-609 -473 371
+-682 -358 359
+-412 -196 147
+-106 -258 477
+-233 -345 672
+-263 -358 677
+-357 -441 655
+-394 -479 619
+-394 -479 619
+-333 -492 587
+-219 -461 500
+-167 -391 346
+-396 -317 151
+-670 -334 316
+-705 -328 497
+-694 -305 553
+-687 -304 565
+-701 -274 521
+-680 -179 321
+-361 -128 168
+-105 -238 460
+-257 -413 623
+-357 -506 571
+-372 -512 579
+-421 -523 564
+-348 -510 563
+-246 -492 419
+-436 -430 210
+-648 -420 370
+-646 -405 561
+-709 -299 436
+-599 -190 211
+-543 -167 182
+-269 -152 191
+-140 -211 313
+-121 -229 348
+-113 -313 459
+-178 -401 543
+-292 -466 606
+-429 -506 589
+-463 -537 522
+-386 -542 487
+-337 -521 352
+-509 -485 290
+-608 -478 432
+-621 -437 564
+-642 -336 617
+-707 -212 380
+-457 -158 158
+-101 -227 460
+-162 -301 610
+-242 -390 638
+-301 -475 595
+-330 -498 586
+-354 -515 561
+-354 -515 561
+-361 -528 544
+-361 -536 503
+-359 -539 411
+-375 -516 311
+-538 -471 284
+-638 -373 294
+-583 -233 198
+-194 -211 249
+-141 -330 534
+-249 -427 599
+-267 -457 579
+-241 -450 568
+-241 -450 568
+-202 -446 478
+-220 -458 378
+-267 -474 314
+-425 -480 259
+-545 -469 294
+-642 -397 321
+-537 -284 177
+-192 -298 268
+-163 -387 493
+-304 -442 637
+-384 -435 670
+-298 -406 667
+-158 -372 535
+-164 -382 341
+-242 -393 240
+-383 -455 232
+-466 -497 276
+-544 -476 295
+-467 -387 186
+-150 -374 454
+-255 -408 636
+-289 -412 646
+-404 -443 662
+-404 -443 662
+-484 -450 642
+-466 -446 656
+-247 -410 610
+-123 -318 403
+-220 -186 203
+-381 -126 158
+-523 -139 184
+-596 -191 212
+-601 -276 207
+-545 -376 197
+-459 -440 210
+-388 -485 261
+-360 -514 328
+-341 -534 442
+-369 -527 522
+-380 -516 556
+-395 -499 591
+-402 -487 608
+-373 -465 634
+-286 -452 602
+-161 -397 443
+-196 -274 229
+-391 -176 151
+-614 -182 242
+-708 -247 392
+-704 -308 491
+-695 -349 494
+-692 -345 362
+-512 -367 188
+-307 -437 257
+-291 -506 485
+-393 -536 514
+-453 -548 463
+-451 -546 460
+-413 -547 469
+-344 -530 474
+-252 -462 335
+-373 -323 164
+-593 -229 221
+-689 -226 342
+-704 -267 515
+-668 -320 587
+-616 -376 629
+-616 -376 629
+-643 -399 563
+-664 -404 367
+-471 -422 209
+-323 -464 267
+-247 -490 447
+-441 -483 630
+-567 -474 562
+-560 -492 543
+-486 -504 570
+-402 -504 580
+-279 -490 494
+-294 -407 238
+-520 -308 187
+-679 -293 334
+-692 -343 484
+-635 -422 540
+-597 -464 531
+-615 -465 467
+-605 -442 315
+-480 -412 206
+-256 -412 264
+-171 -413 502
+-326 -419 674
+-569 -410 635
+-607 -454 534
+-549 -499 534
+-484 -514 550
+-350 -521 512
+-298 -440 252
+-514 -324 182
+-681 -294 334
+-694 -339 482
+-644 -395 563
+-631 -407 571
+-678 -382 469
+-620 -359 253
+-393 -343 166
+-147 -380 398
+-320 -394 700
+-579 -402 641
+-636 -426 528
+-607 -478 469
+-538 -517 463
+-484 -532 489
+-444 -515 552
+-399 -486 611
+-276 -448 592
+-182 -371 295
+-513 -270 170
+-686 -303 350
+-680 -352 355
+-626 -357 265
+-528 -329 177
+-405 -271 140
+-229 -264 192
+-108 -315 467
+-260 -370 685
+-543 -395 663
+-632 -441 511
+-606 -475 484
+-527 -513 515
+-381 -516 545
+-247 -477 421
+-264 -390 239
+-452 -286 161
+-668 -308 313
+-663 -389 384
+-641 -432 392
+-629 -415 317
+-524 -378 193
+-313 -363 189
+-149 -369 392
+-299 -403 676
+-593 -394 630
+-653 -420 495
+-628 -464 456
+-560 -502 503
+-383 -537 469
+-385 -464 238
+-602 -384 264
+-667 -368 361
+-678 -377 481
+-675 -377 505
+-692 -349 480
+-705 -287 393
+-617 -234 223
+-399 -259 146
+-142 -347 368
+-312 -394 687
+-493 -430 655
+-583 -458 567
+-541 -487 560
+-406 -525 536
+-334 -508 329
+-386 -481 267
+-487 -449 244
+-603 -429 317
+-658 -421 460
+-682 -356 509
+-687 -240 319
+-314 -151 176
+-111 -203 531
+-261 -273 707
+-419 -399 691
+-425 -480 620
+-327 -505 551
+-266 -472 315
+-355 -457 245
+-465 -463 244
+-542 -471 286
+-619 -435 338
+-621 -306 232
+-235 -201 214
+-139 -265 587
+-287 -373 679
+-422 -509 563
+-500 -532 440
+-526 -525 477
+-477 -538 483
+-392 -547 432
+-296 -485 307
+-322 -398 205
+-398 -283 151
+-332 -264 153
+-301 -313 171
+-279 -341 190
+-273 -370 213
+-257 -358 211
+-246 -350 213
+-203 -323 238
+-196 -319 245
+-195 -335 243
+-189 -336 257
+-167 -358 307
+-168 -389 342
+-166 -393 358
+-167 -407 374
+-193 -421 340
+-195 -408 296
+-178 -354 253
+-177 -335 207
+-184 -365 180
+-199 -392 160
+-222 -392 106
+-259 -422 84
+-291 -445 72
+-320 -453 71
+-314 -477 88
+-317 -487 89
+-314 -498 99
+-316 -496 95
+-318 -495 93
+-319 -492 97
+-316 -495 94
+-321 -491 95
+-321 -494 96
+-319 -495 97
+-315 -494 95
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/libdm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/libdm.dll
new file mode 100644
index 0000000..ac60b3c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Debug/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..efc3557
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..c01fb73
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/libdm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/libdm.dll
new file mode 100644
index 0000000..e9aac55
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/Release/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..5a5c37a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..2a027a6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/libdm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/libdm.dll
new file mode 100644
index 0000000..dd705f2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Debug/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..6983170
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..d0665f2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/libdm.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/libdm.dll
new file mode 100644
index 0000000..f869c84
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/bin/x86/Release/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/buy.png b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/buy.png
new file mode 100644
index 0000000..dd7721b
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/buy.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/csgl.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/csgl.cs
new file mode 100644
index 0000000..63c16b2
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/csgl.cs
@@ -0,0 +1,533 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using SharpGL;
+using System.Drawing.Imaging;
+using System.Drawing.Drawing2D;
+using System.Collections;
+using System.Diagnostics;
+
+namespace DM_CalibrationTools
+{
+ class csgl
+ {
+ private OpenGL glInstance;
+ private OpenGLControl scInstance;
+ public OpenGL getGlInstance(){ return glInstance;}
+ int mouseX;
+ int mouseY;
+ public bool Global_MouseDown = false;
+ public bool Global_MouseInGLPanel = false;
+ double[] matrixProjection = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ const float DEG2RAD = 3.141593f / 180;
+ const float FOV_Y = 120.0f; // vertical FOV in degree
+ const float NEAR_PLANE = 1.0f;
+ const float FAR_PLANE = 100.0f;
+
+ /* 鍒濆鎽勫儚澶翠綅缃互鍙婂Э鎬佺殑璁剧疆 */
+ const float CAMERA_ANGLE_X = 45.0f; // 鎽勫儚澶寸殑淇话瑙
+ const float CAMERA_ANGLE_Y = 0.0f; // 鎽勫儚澶村亸鑸
+ const float CAMERA_DISTANCE = 30.0f; // 鎽勫儚澶磋窛绂
+ const float CAMERA_HIGHT = -3.0f;
+
+
+
+ float cameraAngleX;
+ float cameraAngleY;
+ float cameraHight;
+ float cameraDistance;
+ double[] modelview = { 0.7071068, 0.5, -0.5, 0, 0, 0.7071068, 0.7071068, 0, 0.7071068, -0.0, 0.5, 0, 0, 0, -25, 1 };
+ bool drawModeChanged;
+ int drawMode;
+
+ float[] cameraPosition = { 0, 0, 0 };
+ float[] cameraAngle = { 0, 0, 0 };
+ float[] modelPosition = { 0, 0, 0 };
+ float[] modelAngle = { 0, 0, 0 };
+
+
+ float[] bgColor = { 0, 0, 0, 0};
+
+
+
+ public csgl(OpenGLControl sc)
+ {
+ scInstance=sc;
+ glInstance = sc.OpenGL;
+ cameraAngleX = CAMERA_ANGLE_X;
+ cameraAngleY = CAMERA_ANGLE_Y;
+ cameraHight = CAMERA_HIGHT;
+ cameraDistance = CAMERA_DISTANCE;
+
+ drawModeChanged = false;
+ drawMode = 0;
+ DrawFlag = 2;
+ Initialized();
+
+ }
+ ArrayList list = new ArrayList();
+ public void addPoint(double x, double y, double z)
+ {
+ list.Add(new double[] { x, y, z });
+ }
+ public void resetPoint()
+ {
+ list.Clear();
+ }
+ HashSet poinths;
+ public void setPoinths(HashSet hs)
+ {
+ poinths = hs;
+ }
+ double[][] pointarr;
+ public void setPointarr(HashSet hs)
+ {
+ pointarr = new double[hs.Count][];
+ hs.CopyTo(pointarr);
+ }
+ public void DrawPoints(OpenGL gl,float r = 0.1f)
+ {
+
+ if (pointarr == null)
+ {
+ // Debug.WriteLine("pointarr == null");
+ return;
+ }
+ foreach (double[] v in pointarr)
+ {
+ DrawPoint(gl, v[0] * 0.04, v[1] * 0.04, v[2] * 0.04);
+ }
+ }
+ public void DrawPoint(OpenGL gl,double x, double y, double z, float r = 0.05f)
+ {
+ gl.PushMatrix();
+// gl.Translate(modelPosition[0], modelPosition[1], modelPosition[2]);
+ gl.Translate(x, y, z);
+ gl.Color(1.0,1.0,1.0);
+ auxSolidSphere(r);
+ gl.PopMatrix();
+ }
+ public void drawAxis(float size)
+ {
+ OpenGL gl = glInstance;
+ //gl.Disable(OpenGL.GL_TEXTURE_2D);
+ //gl.DepthFunc(OpenGL.GL_ALWAYS); // to avoid visual artifacts with grid lines
+ gl.Disable(OpenGL.GL_LIGHTING);
+ // gl.PushMatrix(); //NOTE: There is a bug on Mac misbehaviours of
+ // the light position when you draw GL_LINES
+ // and GL_POINTS. remember the matrix.
+ // draw axis
+ gl.LineWidth(5);
+ gl.Begin(OpenGL.GL_LINES);
+ gl.Color(1.0, 0, 0);
+ gl.Vertex(0, 0, 0);
+ gl.Vertex(size, 0, 0);
+ gl.Color(0, 1.0, 0);
+ gl.Vertex(0, 0, 0);
+ gl.Vertex(0, size, 0);
+ gl.Color(0, 0, 1.0);
+ gl.Vertex(0, 0, 0);
+ gl.Vertex(0, 0, size);
+ gl.End();
+ gl.LineWidth(1);
+
+ // draw arrows(actually big square dots)
+// gl.PointSize(12);
+// gl.Begin(OpenGL.GL_POINTS);
+// gl.Color(1.0, 0, 0);
+// gl.Vertex(size, 0, 0);
+// gl.Color(0, 1.0, 0);
+// gl.Vertex(0, size, 0);
+// gl.Color(0, 0, 1.0);
+// gl.Vertex(0, 0, size);
+// gl.End();
+// gl.PointSize(1);
+ gl.PushMatrix();
+ IntPtr gluNewQuadric = gl.NewQuadric();
+ gl.QuadricNormals(gluNewQuadric, OpenGL.GLU_SMOOTH);
+ //鐢诲渾閿
+ //鍒涘缓浜屾鏇查潰瀵硅薄,X杞寸殑绠ご
+ gl.Translate(size, 0f, 0f);
+ gl.Rotate(90, 0.0f, 1.0f, 0.0f);
+ gl.Color(1.0f, 0.0f, 0.0f); // Red
+ gl.Cylinder(gluNewQuadric, 0.5f, 0.0f, 0.5f, 32, 320);
+ gl.Rotate(-90, 0.0f, 1.0f, 0.0f);
+ gl.Translate(-size, 0f, 0f);
+ //鍒涘缓浜屾鏇查潰瀵硅薄,Y杞寸殑绠ご
+ gl.Translate(0f, size, 0f);
+ gl.Rotate(-90, 1.0f, 0.0f, 0.0f);
+ gl.Color(0.0f, 1.0f, 0.0f); // Green
+ gl.Cylinder(gluNewQuadric, 0.5f, 0.0f, 0.5f, 32, 32);
+ gl.Rotate(90, 1.0f, 0.0f, 0.0f);
+ gl.Translate(0f, -size, 0f);
+ //鍒涘缓浜屾鏇查潰瀵硅薄,Z杞寸殑绠ご
+ gl.Translate(0f, 0f, size);
+ gl.Color(0.0f, 0.0f, 1.0f); // Blue
+ gl.Cylinder(gluNewQuadric, 0.5f, 0.0f, 0.5f, 32, 32);
+ gl.Translate(0f, 0f, -size);
+ //鍦ㄨ繖閲岀粯鍒跺潗鏍囩郴缁
+ // restore default settings
+ gl.PopMatrix();
+ gl.Enable(OpenGL.GL_LIGHTING);
+ //gl.DepthFunc(OpenGL.GL_LEQUAL);
+ }
+ public void Draw()
+ {
+ OpenGL gl = glInstance;
+ // set bottom viewport
+ setViewportSub(0, 0, scInstance.Width, scInstance.Height, NEAR_PLANE, FAR_PLANE);
+
+ // clear buffer
+ //gl.ClearColor(bgColor[0], bgColor[1], bgColor[2], bgColor[3]); // background color
+ gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT | OpenGL.GL_STENCIL_BUFFER_BIT);
+ gl.LoadIdentity();
+ //gl.PushMatrix();
+
+ // First, transform the camera (viewing matrix) from world space to eye space
+ gl.Translate(0, cameraHight, -cameraDistance);
+ //move camera
+
+ gl.Translate(cameraPosition[0], cameraPosition[1], cameraPosition[2]);
+
+ gl.Rotate(cameraAngleX, 1, 0, 0); // pitch
+ gl.Rotate(cameraAngleY, 0, 1, 0); // heading
+
+ // draw grid
+ drawGrid(300, 1);
+
+ // draw a teapot
+ gl.PushMatrix();
+ gl.Translate(modelPosition[0], modelPosition[1], modelPosition[2]);
+ gl.PopMatrix();
+
+ if (DrawFlag == 1)
+ {
+ DrawPoints(gl);
+ }
+ else if(DrawFlag==2)
+ {
+
+ // mVector3 v = CaliAPI.GetEulerianAngle();
+ gl.PushMatrix();
+// gl.Rotate(v.y, 1, 0, 0); // pitch
+// gl.Rotate(v.x, 0, 0, -1); // pitch
+// gl.Rotate(90, 0, 1, 0); // heading
+ Quaternion q =CaliAPI.GetQuaternion();
+ double halfsita = Math.Acos(q.w);
+ double nx = q.y / Math.Sin(halfsita);
+ double ny = q.z / Math.Sin(halfsita);
+ double nz = q.x/ Math.Sin(halfsita);
+ double SitaAngle = halfsita * 2 * (180.0f / 3.141592f);
+ //gl.Rotate(45, 0, 0);
+ gl.Rotate( 0, 90, 90f);
+ gl.Rotate(0, 0, 0);
+
+ gl.Rotate(SitaAngle, nx, ny, nz);
+ //gl.Rotate(SitaAngle, ny,nz,nx);
+ drawAxis(20);
+ DrawCube();
+ gl.PopMatrix();
+
+ }
+// else
+// {
+// drawAxis(20);
+// }
+
+
+
+ //gl.PopMatrix();
+
+
+
+ }
+ public void resize()
+ {
+ OpenGL gl = getGlInstance();
+
+ // 璁剧疆褰撳墠鐭╅樀妯″紡,瀵规姇褰辩煩闃靛簲鐢ㄩ殢鍚庣殑鐭╅樀鎿嶄綔
+ gl.MatrixMode(OpenGL.GL_PROJECTION);
+
+ // 閲嶇疆褰撳墠鎸囧畾鐨勭煩闃典负鍗曚綅鐭╅樀,灏嗗綋鍓嶇殑鐢ㄦ埛鍧愭爣绯荤殑鍘熺偣绉诲埌浜嗗睆骞曚腑蹇
+ gl.LoadIdentity();
+ // 鍒涘缓閫忚鎶曞奖鍙樻崲
+ gl.Perspective(FOV_Y, scInstance.Width/ scInstance.Height, 5, 100.0);
+
+ // 瑙嗙偣鍙樻崲
+ gl.LookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0);
+
+ // 璁剧疆褰撳墠鐭╅樀涓烘ā鍨嬭鍥剧煩闃
+ gl.MatrixMode(OpenGL.GL_MODELVIEW);
+ }
+ void auxSolidSphere(float p)
+ {
+ drawSphere(p);
+ return;
+// OpenGL gl = getGlInstance();
+//
+// gl.Color(0.5f, 0.5f, 0.5f); /**< 鐏拌壊 */
+// gl.Scale(p, p, p);
+// DrawCube(gl);
+
+
+ }
+ public void drawSphere(double radius, int segx = 40, int segy = 40, bool isLines = false)
+ {
+ float x = 0, y = 0, z = 0;
+ OpenGL gl = getGlInstance();
+ gl.PushMatrix();
+ gl.Translate(x, y, z);
+ var sphere = gl.NewQuadric();
+ if (isLines)
+ gl.QuadricDrawStyle(sphere, OpenGL.GL_LINES);
+ else
+ gl.QuadricDrawStyle(sphere, OpenGL.GL_QUADS);
+ gl.QuadricNormals(sphere, OpenGL.GLU_SMOOTH); //GLU_NONE,GLU_FLAT,GLU_SMOOTH
+ gl.QuadricOrientation(sphere, (int)OpenGL.GLU_OUTSIDE); //GLU_OUTSIDE,GLU_INSIDE
+ gl.QuadricTexture(sphere, (int)OpenGL.GLU_FALSE); //GL_TRUE,GLU_FALSE
+ gl.Sphere(sphere, radius, segx, segy);
+ gl.DeleteQuadric(sphere);
+ gl.PopMatrix();
+ }
+ public void DrawCube()
+ {
+ OpenGL gl = glInstance;
+ gl.PushMatrix();
+
+ // OpenGL gl = getGlInstance();
+ gl.Begin(OpenGL.GL_QUADS);
+
+ gl.Color(1.0, 0, 0);
+ gl.Vertex(-10.0f, -10.0f, -10.0f);
+ gl.Vertex(-10.0f, 10.0f, -10.0f);
+ gl.Vertex(10.0f, 10.0f, -10.0f);
+ gl.Vertex(10.0f, -10.0f, -10.0f);
+
+ gl.Color(1.0, 1, 0);
+ gl.Vertex(-10.0f, -10.0f, -10.0f);
+ gl.Vertex(10.0f, -10.0f, -10.0f);
+ gl.Vertex(10.0f, -10.0f, 10.0f);
+ gl.Vertex(-10.0f, -10.0f, 10.0f);
+
+ gl.Color(1.0, 0, 1);
+ gl.Vertex(-10.0f, -10.0f, -10.0f);
+ gl.Vertex(-10.0f, -10.0f, 10.0f);
+ gl.Vertex(-10.0f, 10.0f, 10.0f);
+ gl.Vertex(-10.0f, 10.0f, -10.0f);
+
+ gl.Color(0, 1.0, 0);
+ gl.Vertex(-10.0f, -10.0f, 10.0f);
+ gl.Vertex(10.0f, -10.0f, 10.0f);
+ gl.Vertex(10.0f, 10.0f, 10.0f);
+ gl.Vertex(-10.0f, 10.0f, 10.0f);
+
+ gl.Color(0, 0, 1.0);
+ gl.Vertex(-10.0f, 10.0f, -10.0f);
+ gl.Vertex(-10.0f, 10.0f, 10.0f);
+ gl.Vertex(10.0f, 10.0f, 10.0f);
+ gl.Vertex(10.0f, 10.0f, -10.0f);
+
+ gl.Color(0, 1, 1.0);
+ gl.Vertex(10.0f, -10.0f, -10.0f);
+ gl.Vertex(10.0f, 10.0f, -10.0f);
+ gl.Vertex(10.0f, 10.0f, 10.0f);
+ gl.Vertex(10.0f, -10.0f, 10.0f);
+ gl.End();
+ gl.PopMatrix();
+ }
+ public void Initialized()
+ {
+ OpenGL gl = getGlInstance();
+ gl.ClearColor(0, 0, 0, 0);
+ gl.ShadeModel(OpenGL.GL_SMOOTH); // shading mathod: GL_SMOOTH or GL_FLAT
+ gl.PixelStore(OpenGL.GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment
+
+ // enable/disable features
+ gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_NICEST);
+ //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+ //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
+ gl.Enable(OpenGL.GL_DEPTH_TEST);
+ gl.Enable(OpenGL.GL_LIGHTING);
+ gl.Enable(OpenGL.GL_TEXTURE_2D);
+ gl.Enable(OpenGL.GL_CULL_FACE);
+ gl.Enable(OpenGL.GL_BLEND);
+ gl.Enable(OpenGL.GL_SCISSOR_TEST);
+
+ // track material ambient and diffuse from surface color, call it before glEnable(GL_COLOR_MATERIAL)
+ gl.ColorMaterial(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_AMBIENT_AND_DIFFUSE);
+ gl.Enable(OpenGL.GL_COLOR_MATERIAL);
+
+ gl.ClearColor(bgColor[0], bgColor[1], bgColor[2], bgColor[3]); // background color
+ gl.ClearStencil(0); // clear stencil buffer
+ gl.ClearDepth(1.0); // 0 is near, 1 is far
+ gl.DepthFunc(OpenGL.GL_LEQUAL);
+
+
+
+
+ //initLights(); /* 鍒濆鍖朞penGL鐏厜 */
+ float[] lightKa = { 1.0f, 1.0f, 1.0f, 0.0f }; // 鐜鍏夛紝鍩烘湰浜害锛屽彲浠ヨ涓烘槸澶槼鍏
+ float[] lightKd = { 1.0f, 1.0f, 1.0f, 0.0f }; // diffuse light
+ float[] lightKs = { 1f,1f,1f,1f}; // specular light
+ gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, lightKa);
+ gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, lightKd);
+ // gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, lightKs);
+
+ // position the light in eye space
+ float[] lightPos = { 16f, 9f, -18f, 0f }; // directional light
+ gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, lightPos);
+ gl.LightModel(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT_AND_DIFFUSE);
+ gl.Enable(OpenGL.GL_LIGHT0); // MUST enable each light source after configuration
+
+ // gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_FILL);
+ // gl.Enable(OpenGL.GL_DEPTH_TEST);
+ // gl.Enable(OpenGL.GL_CULL_FACE);
+ gl.Enable(OpenGL.GL_NORMALIZE);
+
+
+ }
+
+ private double[] identity()
+ {
+ double[] m = new double[16];
+ m[0] = m[5] = m[10] = m[15] = 1.0;
+ m[1] = m[2] = m[3] = m[4] = m[6] = m[7] = m[8] = m[9] = m[11] = m[12] = m[13] = m[14] = 0.0;
+ return m;
+ }
+ private double[] getTranspose(double[] m)
+ {
+ double[] tm = new double[16];
+ tm[0] = m[0]; tm[1] = m[4]; tm[2] = m[8]; tm[3] = m[12];
+ tm[4] = m[1]; tm[5] = m[5]; tm[6] = m[9]; tm[7] = m[13];
+ tm[8] = m[2]; tm[9] = m[6]; tm[10] = m[10]; tm[11] = m[14];
+ tm[12] = m[3]; tm[13] = m[7]; tm[14] = m[11]; tm[15] = m[15];
+ return tm;
+ }
+ public void drawGrid(float size, float step)
+ {
+ OpenGL gl = glInstance;
+ // disable lighting
+ gl.Disable(OpenGL.GL_LIGHTING);
+
+ gl.Begin(OpenGL.GL_LINES);
+
+ gl.Color(0.3f, 0.3f, 0.3f);
+ for (float i = step; i <= size; i += step)
+ {
+ gl.Vertex(-size, 0, i); // lines parallel to X-axis
+ gl.Vertex(size, 0, i);
+ gl.Vertex(-size, 0, -i); // lines parallel to X-axis
+ gl.Vertex(size, 0, -i);
+
+ gl.Vertex(i, 0, -size); // lines parallel to Z-axis
+ gl.Vertex(i, 0, size);
+ gl.Vertex(-i, 0, -size); // lines parallel to Z-axis
+ gl.Vertex(-i, 0, size);
+ }
+
+ // x-axis
+ gl.Color(0.5f, 0, 0);
+ gl.Vertex(-size, 0, 0);
+ gl.Vertex(size, 0, 0);
+
+ // z-axis
+ gl.Color(0, 0, 0.5f);
+ gl.Vertex(0, 0, -size);
+ gl.Vertex(0, 0, size);
+
+ gl.End();
+
+ // enable lighting back
+ gl.Enable(OpenGL.GL_LIGHTING);
+ }
+ public void setViewportSub(int x, int y, int width, int height, float nearPlane, float farPlane)
+ {
+ OpenGL gl = glInstance;
+ // set viewport
+ gl.Viewport(x, y, width, height);
+ gl.Scissor(x, y, width, height);
+
+ // set perspective viewing frustum
+ setFrustum(FOV_Y, (float)(width) / height, nearPlane, farPlane); // FOV, AspectRatio, NearClip, FarClip
+ // copy projection matrix to OpenGL
+ gl.MatrixMode(OpenGL.GL_PROJECTION);
+ gl.LoadMatrix(getTranspose(matrixProjection));
+ gl.MatrixMode(OpenGL.GL_MODELVIEW);
+ gl.LoadIdentity();
+
+ }
+
+ public void setFrustum(float l, float r, float b, float t, float n, float f)
+ {
+ matrixProjection = identity();
+ matrixProjection[0] = 2 * n / (r - l);
+ matrixProjection[2] = (r + l) / (r - l);
+ matrixProjection[5] = 2 * n / (t - b);
+ matrixProjection[6] = (t + b) / (t - b);
+ matrixProjection[10] = -(f + n) / (f - n);
+ matrixProjection[11] = -(2 * f * n) / (f - n);
+ matrixProjection[14] = -1;
+ matrixProjection[15] = 0;
+ }
+ public void setFrustum(float fovY, float aspectRatio, float front, float back)
+ {
+ OpenGL gl = glInstance;
+ float tangent = (float)Math.Tan(fovY / 2 * DEG2RAD); // tangent of half fovY
+ float height = front * tangent; // half height of near plane
+ float width = height * aspectRatio; // half width of near plane
+
+ // params: left, right, bottom, top, near, far
+ setFrustum(-width, width, -height, height, front, back);
+ }
+
+ public void rotateCamera(int x, int y)
+ {
+ cameraAngleY += (x - mouseX);
+ cameraAngleX += (y - mouseY);
+ setMousePos(x, y);
+
+ }
+
+ public void moveCameraXY(int x, int y)
+ {
+ cameraPosition[0] += (x - mouseX) * 0.1f;
+ cameraPosition[1] += (y - mouseY) * -0.1f;
+ setMousePos(x, y);
+ Debug.WriteLine(cameraPosition[0] + " " + cameraPosition[1] + " " + cameraPosition[2] + " ");
+ }
+ public void moveCameraZ(int x, int y)
+ {
+ //cameraPosition[1] += (x - mouseX);
+ cameraPosition[2] += (y - mouseY) * 0.1f;
+ setMousePos(x, y);
+ }
+
+ public void setMousePos(int x, int y)
+ {
+ mouseX = x;
+ mouseY = y;
+ }
+ public void zoomCamera(int y)
+ {
+ cameraDistance -= (y - mouseY) * 0.1f;
+ mouseY = y;
+ }
+ public void zoomCameraDelta(int delta)
+ {
+ cameraDistance -= delta;
+ }
+ public void resetView()
+ {
+ cameraAngleX = CAMERA_ANGLE_X;
+ cameraAngleY = CAMERA_ANGLE_Y;
+ cameraHight = CAMERA_HIGHT;
+ cameraDistance = CAMERA_DISTANCE;
+ cameraPosition[0] = cameraPosition[1] = cameraPosition[2] = 0;
+ }
+
+ public int DrawFlag { get; set; }
+ }
+}
+
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..24f21b5
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.FileListAbsolute.txt
@@ -0,0 +1,21 @@
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.exe.config
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.exe
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.pdb
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.SceneGraph.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.WinForms.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.xml
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.SceneGraph.xml
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.WinForms.xml
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.csprojResolveAssemblyReference.cache
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.csproj.GenerateResource.Cache
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.exe
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.pdb
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SkinForm.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.MainForms.resources
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI1\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.exe.config
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI1\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.exe
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI1\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.GenerateResource.Cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.GenerateResource.Cache
new file mode 100644
index 0000000..4a9e961
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.GenerateResource.Cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csprojResolveAssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..f6823d8
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csprojResolveAssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..9564e24
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..b76277a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferences.cache
new file mode 100644
index 0000000..456694c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..924e1ae
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..1462c4c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..d5ceac7
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+cf42a9ccf104def591803676cdbb5ee89d6bfc85
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..884f680
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,76 @@
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csprojResolveAssemblyReference.cache
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.Cache
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csprojResolveAssemblyReference.cache
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.Cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.AssemblyReference.cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.AssemblyReference.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csprojResolveAssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..ded4ffb
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csprojResolveAssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..d3c3159
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..efc3557
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..c01fb73
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..d030ec5
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+edeb97e82e7439bc67c3a2d57a072f3aafa0f954
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..09ef3b7
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,19 @@
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..d3c5996
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/Release/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..5a5c37a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..2a027a6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..d04a2b2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..e544d3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+0874f8b198544ca52a3cb82a9726f714fc694ae2
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..6dc298b
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,19 @@
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..9c8c49c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..6983170
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..d0665f2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..672a29d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.AssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..f5e894a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.AssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..15fb653
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+3c213483541b93c88ba4dfc25281aebfc902924f
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..af3367c
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,20 @@
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.AssemblyReference.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..f99f523
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/obj/x86/Release/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/tools.ico b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/tools.ico
new file mode 100644
index 0000000..4bb026f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/tools.ico differ
diff --git a/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/txtreader.cs b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/txtreader.cs
new file mode 100644
index 0000000..7e78aab
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.0/GEEKIMU Manager/txtreader.cs
@@ -0,0 +1,88 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DM_CalibrationTools
+{
+ class txtreader
+ {
+ HashSet hs;
+ string filepath;
+ public txtreader(string s)
+ {
+ if(File.Exists(s))
+ {
+ filepath = s;
+ }
+ hs = new HashSet();
+ }
+ public void GetData()
+ {
+
+ // StreamReader sr = File.OpenText("task.txt",System.Text.Encoding.Default);
+ if (!File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + "data.txt"))
+ {
+ //StreamWriter sw = File.CreateText("task.txt");//鍦ㄧ▼搴忔墍鍦ㄦ枃浠跺す鍒涘缓txt鏂囦欢
+ //sw.Close();
+ }
+ FileStream fs = new FileStream("data.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
+ StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8);
+ //string[] parameters = sr.ReadLine().ToString().Split('|');
+ int i = 0;
+
+
+ ArrayList arr = new ArrayList();
+ while (true)
+ {
+ string cmdtempstr = sr.ReadLine();
+ if (cmdtempstr == null)
+ {
+ break;
+ }
+ i++;
+ string[] strarr = cmdtempstr.Split(' ');
+ ////add into arr to be finished
+ double[] v = { double.Parse(strarr[0]), double.Parse(strarr[1]), double.Parse(strarr[2]) };
+ arr.Add(v);
+ hs.Add(v);
+ }
+ sr.Close();
+ fs.Close();
+
+ }
+ public double[][] getArr()
+ {
+ double[][] result=new double [hs.Count][];
+ hs.CopyTo(result);
+ return result;
+ }
+ public HashSet getHashset()
+ {
+ return hs;
+ }
+ public void show()
+ {
+ for(int i = 0;i hs)
+ {
+ StreamWriter sw = File.CreateText("data.txt");//鍦ㄧ▼搴忔墍鍦ㄦ枃浠跺す鍒涘缓txt鏂囦欢
+
+ foreach (var d in hs)
+ {
+ sw.WriteLine(((float)d[0]).ToString() + " " + ((float)d[1]).ToString() + " " + ((float)d[2]).ToString());
+ }
+ sw.Close();
+ Debug.WriteLine("淇濆瓨鎴愬姛锛");
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/.vs/GEEKIMU Manager/v16/.suo b/4.Software/GeekIMU Manager GUI 1.2/.vs/GEEKIMU Manager/v16/.suo
new file mode 100644
index 0000000..d8263e6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/.vs/GEEKIMU Manager/v16/.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.sln b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.sln
new file mode 100644
index 0000000..b04cbe0
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.sln
@@ -0,0 +1,31 @@
+锘
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.32106.194
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GeekIMU Manager", "GEEKIMU Manager\GeekIMU Manager.csproj", "{58377382-2E93-4106-8AD5-E13A430802E5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|x86.ActiveCfg = Debug|x86
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Debug|x86.Build.0 = Debug|x86
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|x86.ActiveCfg = Release|x86
+ {58377382-2E93-4106-8AD5-E13A430802E5}.Release|x86.Build.0 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {CF11BC9C-A1BC-46AC-BE4B-0ABCE3E903EE}
+ EndGlobalSection
+EndGlobal
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.v11.suo b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.v11.suo
new file mode 100644
index 0000000..91bea1d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.v11.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.v12.suo b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.v12.suo
new file mode 100644
index 0000000..ade58dc
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager.v12.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/3rdparty/skin/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/3rdparty/skin/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/3rdparty/skin/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/App.config b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/App.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/App.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CSGL/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CaliAPI.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CaliAPI.cs
new file mode 100644
index 0000000..c43d0be
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/CaliAPI.cs
@@ -0,0 +1,69 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace DM_CalibrationTools
+{
+ struct Quaternion{
+ public float w, x, y, z;
+ };
+ struct mVector3
+ {
+ public float x, y, z;
+ };
+ struct MagCaliParam
+ {
+ public float xOffset;
+ public float yOffset;
+ public float zOffset;
+ public float xScale;
+ public float yScale;
+ public float zScale;
+ };
+ [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
+ class CaliAPI
+ {
+
+ [DllImport("libDM.dll", EntryPoint = "Init", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int InitCaliAPI([MarshalAs(UnmanagedType.LPStr)]string devpath);
+
+ [DllImport("libDM.dll", EntryPoint = "CheckDevice", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int CheckDevice();
+
+ [DllImport("libDM.dll", EntryPoint = "GyroCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int GyroCali();
+
+ [DllImport("libDM.dll", EntryPoint = "GetGyroCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static mVector3 GetGyroCali();
+
+ [DllImport("libDM.dll", EntryPoint = "GetMagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static MagCaliParam GetMagCali();
+
+ [DllImport("libDM.dll", EntryPoint = "MagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int MagCali();
+
+ [DllImport("libDM.dll", EntryPoint = "FinishMagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int FinishMagCali();
+
+ [DllImport("libDM.dll", EntryPoint = "SetMagCali", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int SetMagCali(float x, float y, float z, float x0, float y0, float z0);
+
+ [DllImport("libDM.dll", EntryPoint = "CalculateMagParam", CallingConvention = CallingConvention.Cdecl)]
+ public extern static MagCaliParam CalculateMagParam();
+
+ [DllImport("libDM.dll", EntryPoint = "GetPoint", CallingConvention = CallingConvention.Cdecl)]
+ public extern static mVector3 GetPoint();
+
+ [DllImport("libDM.dll", EntryPoint = "GetEulerianAngle", CallingConvention = CallingConvention.Cdecl)]
+ public extern static mVector3 GetEulerianAngle();
+
+ [DllImport("libDM.dll", EntryPoint = "Correction", CallingConvention = CallingConvention.Cdecl)]
+ public extern static int Correction();
+
+ [DllImport("libDM.dll", EntryPoint = "GetQuaternion", CallingConvention = CallingConvention.Cdecl)]
+ public extern static Quaternion GetQuaternion();
+
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/GeekIMU Manager.csproj b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/GeekIMU Manager.csproj
new file mode 100644
index 0000000..5b980fb
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/GeekIMU Manager.csproj
@@ -0,0 +1,172 @@
+锘
+
+
+
+ Debug
+ AnyCPU
+ {58377382-2E93-4106-8AD5-E13A430802E5}
+ WinExe
+ Properties
+ DM_CalibrationTools
+ DM_CalibrationTools
+ v4.5
+ 512
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+ DM_CalibrationTools.Program
+
+
+ tools.ico
+
+
+ true
+ bin\x86\Debug\
+ DEBUG;TRACE
+ full
+ x86
+ 7.3
+ prompt
+ true
+
+
+ bin\x86\Release\
+ TRACE
+ true
+ pdbonly
+ x86
+ 7.3
+ prompt
+ true
+
+
+
+ False
+ CSGL\SharpGL.dll
+
+
+ False
+ CSGL\SharpGL.SceneGraph.dll
+
+
+ False
+ CSGL\SharpGL.WinForms.dll
+
+
+ 3rdparty\skin\SkinForm.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ IMUConnect.cs
+
+
+ Form
+
+
+ IMUInformation.cs
+
+
+ Form
+
+
+ MainForms.cs
+
+
+
+
+
+ IMUConnect.cs
+
+
+ IMUInformation.cs
+
+
+ MainForms.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.Designer.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.Designer.cs
new file mode 100644
index 0000000..c1853e1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.Designer.cs
@@ -0,0 +1,112 @@
+锘縩amespace DM_CalibrationTools
+{
+ partial class IMUConnect
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.Btn_not_recognition = new System.Windows.Forms.Button();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("寰蒋闆呴粦", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(68)))), ((int)(((byte)(68)))), ((int)(((byte)(68)))));
+ this.label2.Location = new System.Drawing.Point(227, 437);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(544, 28);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "璇风敤USB杩炴帴IMU璁惧鎴栬呴噰鐢ㄦ棤绾挎帴鏀跺櫒杩炴帴IMU璁惧";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label1.Location = new System.Drawing.Point(379, 523);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(263, 17);
+ this.label1.TabIndex = 4;
+ this.label1.Text = "浣跨敤涓亣鍒伴棶棰樿鍔犲叆鎶鏈敮鎸佺兢锛115438931";
+ //
+ // Btn_not_recognition
+ //
+ this.Btn_not_recognition.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.question_32px;
+ this.Btn_not_recognition.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.Btn_not_recognition.FlatAppearance.BorderSize = 0;
+ this.Btn_not_recognition.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_not_recognition.Font = new System.Drawing.Font("寰蒋闆呴粦", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_not_recognition.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(30)))), ((int)(((byte)(120)))), ((int)(((byte)(213)))));
+ this.Btn_not_recognition.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.Btn_not_recognition.Location = new System.Drawing.Point(785, 436);
+ this.Btn_not_recognition.Name = "Btn_not_recognition";
+ this.Btn_not_recognition.Size = new System.Drawing.Size(198, 32);
+ this.Btn_not_recognition.TabIndex = 3;
+ this.Btn_not_recognition.Text = "宸茬粡杩炴帴锛屼絾鏃犳硶璇嗗埆锛";
+ this.Btn_not_recognition.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.Btn_not_recognition.UseVisualStyleBackColor = true;
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Image = global::DM_CalibrationTools.Properties.Resources.usb_783px;
+ this.pictureBox1.Location = new System.Drawing.Point(332, 44);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(349, 359);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox1.TabIndex = 0;
+ this.pictureBox1.TabStop = false;
+ //
+ // IMUConnect
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(1027, 557);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.Btn_not_recognition);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.pictureBox1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Name = "IMUConnect";
+ this.Text = "IMUConnect";
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button Btn_not_recognition;
+ private System.Windows.Forms.Label label1;
+ }
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.cs
new file mode 100644
index 0000000..c8a03ae
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.cs
@@ -0,0 +1,20 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace DM_CalibrationTools
+{
+ public partial class IMUConnect : Form
+ {
+ public IMUConnect()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.resx b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUConnect.resx
@@ -0,0 +1,120 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.Designer.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.Designer.cs
new file mode 100644
index 0000000..14dd344
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.Designer.cs
@@ -0,0 +1,506 @@
+锘縩amespace DM_CalibrationTools
+{
+ partial class IMUInformation
+ {
+ ///
+ /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 娓呯悊鎵鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆
+ ///
+ /// 濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓 true锛涘惁鍒欎负 false銆
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows 绐椾綋璁捐鍣ㄧ敓鎴愮殑浠g爜
+
+ ///
+ /// 璁捐鍣ㄦ敮鎸佹墍闇鐨勬柟娉 - 涓嶈
+ /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(IMUInformation));
+ this.Gbox_OpenGL = new System.Windows.Forms.GroupBox();
+ this.GLpanel = new System.Windows.Forms.Panel();
+ this.openGLControl1 = new SharpGL.OpenGLControl();
+ this.timer1 = new System.Windows.Forms.Timer(this.components);
+ this.Panel_Bottom = new System.Windows.Forms.Panel();
+ this.button1 = new System.Windows.Forms.Button();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ this.linkLabel1 = new System.Windows.Forms.LinkLabel();
+ this.BtnShowAngle = new System.Windows.Forms.Button();
+ this.btnLoadorCali = new System.Windows.Forms.Button();
+ this.btnResetCalibrationData = new System.Windows.Forms.Button();
+ this.btnCalliGyro = new System.Windows.Forms.Button();
+ this.Panel_Sensor_Information = new System.Windows.Forms.Panel();
+ this.label9 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnMagCalibtation = new System.Windows.Forms.Button();
+ this.label_dev_name = new System.Windows.Forms.Label();
+ this.labelAngle = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.labelMagOffset = new System.Windows.Forms.Label();
+ this.labelGyroOffset = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
+ this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
+ this.Gbox_OpenGL.SuspendLayout();
+ this.GLpanel.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.openGLControl1)).BeginInit();
+ this.Panel_Bottom.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.Panel_Sensor_Information.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // Gbox_OpenGL
+ //
+ this.Gbox_OpenGL.Controls.Add(this.GLpanel);
+ this.Gbox_OpenGL.Location = new System.Drawing.Point(7, 6);
+ this.Gbox_OpenGL.Name = "Gbox_OpenGL";
+ this.Gbox_OpenGL.Size = new System.Drawing.Size(698, 499);
+ this.Gbox_OpenGL.TabIndex = 7;
+ this.Gbox_OpenGL.TabStop = false;
+ this.Gbox_OpenGL.Text = "3D鏄剧ず";
+ //
+ // GLpanel
+ //
+ this.GLpanel.Controls.Add(this.openGLControl1);
+ this.GLpanel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.GLpanel.Location = new System.Drawing.Point(3, 17);
+ this.GLpanel.Name = "GLpanel";
+ this.GLpanel.Size = new System.Drawing.Size(692, 479);
+ this.GLpanel.TabIndex = 10;
+ this.GLpanel.MouseEnter += new System.EventHandler(this.GLpanel_MouseEnter);
+ this.GLpanel.MouseLeave += new System.EventHandler(this.GLpanel_MouseLeave);
+ //
+ // openGLControl1
+ //
+ this.openGLControl1.BitDepth = 24;
+ this.openGLControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.openGLControl1.DrawFPS = true;
+ this.openGLControl1.FrameRate = 20;
+ this.openGLControl1.Location = new System.Drawing.Point(0, 0);
+ this.openGLControl1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.openGLControl1.Name = "openGLControl1";
+ this.openGLControl1.RenderContextType = SharpGL.RenderContextType.NativeWindow;
+ this.openGLControl1.Size = new System.Drawing.Size(692, 479);
+ this.openGLControl1.TabIndex = 0;
+ this.openGLControl1.OpenGLDraw += new System.Windows.Forms.PaintEventHandler(this.sceneControl1_OpenGLDraw);
+ this.openGLControl1.Resized += new System.EventHandler(this.sceneControl1_Resized);
+ this.openGLControl1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseDoubleClick);
+ this.openGLControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseDown);
+ this.openGLControl1.MouseEnter += new System.EventHandler(this.GLpanel_MouseEnter);
+ this.openGLControl1.MouseLeave += new System.EventHandler(this.GLpanel_MouseLeave);
+ this.openGLControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseMove);
+ this.openGLControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.sceneControl1_MouseUp);
+ //
+ // timer1
+ //
+ this.timer1.Enabled = true;
+ this.timer1.Interval = 50;
+ this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
+ //
+ // Panel_Bottom
+ //
+ this.Panel_Bottom.Controls.Add(this.button1);
+ this.Panel_Bottom.Controls.Add(this.pictureBox1);
+ this.Panel_Bottom.Controls.Add(this.linkLabel1);
+ this.Panel_Bottom.Controls.Add(this.BtnShowAngle);
+ this.Panel_Bottom.Controls.Add(this.btnLoadorCali);
+ this.Panel_Bottom.Controls.Add(this.btnResetCalibrationData);
+ this.Panel_Bottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.Panel_Bottom.Location = new System.Drawing.Point(0, 506);
+ this.Panel_Bottom.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.Panel_Bottom.Name = "Panel_Bottom";
+ this.Panel_Bottom.Size = new System.Drawing.Size(1027, 51);
+ this.Panel_Bottom.TabIndex = 12;
+ //
+ // button1
+ //
+ this.button1.BackgroundImage = global::DM_CalibrationTools.Properties.Resources._3d_32px;
+ this.button1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.button1.FlatAppearance.BorderSize = 0;
+ this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.button1.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.button1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.button1.Location = new System.Drawing.Point(13, 7);
+ this.button1.Margin = new System.Windows.Forms.Padding(0, 2, 2, 2);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(119, 32);
+ this.button1.TabIndex = 19;
+ this.button1.Text = "3D鍦烘櫙鏄剧ず";
+ this.button1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.button1.UseVisualStyleBackColor = true;
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Image = global::DM_CalibrationTools.Properties.Resources.link_48px;
+ this.pictureBox1.Location = new System.Drawing.Point(866, 7);
+ this.pictureBox1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(32, 32);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox1.TabIndex = 13;
+ this.pictureBox1.TabStop = false;
+ this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
+ //
+ // linkLabel1
+ //
+ this.linkLabel1.AutoSize = true;
+ this.linkLabel1.Font = new System.Drawing.Font("寰蒋闆呴粦", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.linkLabel1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.linkLabel1.LinkColor = System.Drawing.Color.Black;
+ this.linkLabel1.Location = new System.Drawing.Point(899, 12);
+ this.linkLabel1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.linkLabel1.Name = "linkLabel1";
+ this.linkLabel1.Size = new System.Drawing.Size(122, 21);
+ this.linkLabel1.TabIndex = 12;
+ this.linkLabel1.TabStop = true;
+ this.linkLabel1.Text = "鐢电绁炴妧娣樺疂搴";
+ this.linkLabel1.VisitedLinkColor = System.Drawing.Color.Aqua;
+ this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
+ //
+ // BtnShowAngle
+ //
+ this.BtnShowAngle.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.pose_32px;
+ this.BtnShowAngle.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.BtnShowAngle.FlatAppearance.BorderSize = 0;
+ this.BtnShowAngle.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.BtnShowAngle.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.BtnShowAngle.Location = new System.Drawing.Point(136, 7);
+ this.BtnShowAngle.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.BtnShowAngle.Name = "BtnShowAngle";
+ this.BtnShowAngle.Size = new System.Drawing.Size(102, 32);
+ this.BtnShowAngle.TabIndex = 10;
+ this.BtnShowAngle.Text = "鑸悜瀵瑰噯";
+ this.BtnShowAngle.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.BtnShowAngle.UseVisualStyleBackColor = true;
+ this.BtnShowAngle.Click += new System.EventHandler(this.BtnShowAngle_Click);
+ //
+ // btnLoadorCali
+ //
+ this.btnLoadorCali.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.earth_grid_32px;
+ this.btnLoadorCali.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnLoadorCali.FlatAppearance.BorderSize = 0;
+ this.btnLoadorCali.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnLoadorCali.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnLoadorCali.Location = new System.Drawing.Point(245, 7);
+ this.btnLoadorCali.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.btnLoadorCali.Name = "btnLoadorCali";
+ this.btnLoadorCali.Size = new System.Drawing.Size(128, 32);
+ this.btnLoadorCali.TabIndex = 10;
+ this.btnLoadorCali.Text = "鍔犺浇纾佸姏鏁版嵁";
+ this.btnLoadorCali.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnLoadorCali.UseVisualStyleBackColor = false;
+ this.btnLoadorCali.Click += new System.EventHandler(this.button4_Click);
+ //
+ // btnResetCalibrationData
+ //
+ this.btnResetCalibrationData.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.refresh_32px;
+ this.btnResetCalibrationData.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnResetCalibrationData.FlatAppearance.BorderSize = 0;
+ this.btnResetCalibrationData.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnResetCalibrationData.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnResetCalibrationData.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnResetCalibrationData.Location = new System.Drawing.Point(376, 7);
+ this.btnResetCalibrationData.Margin = new System.Windows.Forms.Padding(0, 2, 2, 2);
+ this.btnResetCalibrationData.Name = "btnResetCalibrationData";
+ this.btnResetCalibrationData.Size = new System.Drawing.Size(127, 32);
+ this.btnResetCalibrationData.TabIndex = 9;
+ this.btnResetCalibrationData.Text = "閲嶇疆鏍″噯鏁版嵁";
+ this.btnResetCalibrationData.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnResetCalibrationData.UseVisualStyleBackColor = true;
+ this.btnResetCalibrationData.Click += new System.EventHandler(this.button2_Click);
+ //
+ // btnCalliGyro
+ //
+ this.btnCalliGyro.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.refresh_32px1;
+ this.btnCalliGyro.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnCalliGyro.FlatAppearance.BorderSize = 0;
+ this.btnCalliGyro.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnCalliGyro.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnCalliGyro.Location = new System.Drawing.Point(19, 430);
+ this.btnCalliGyro.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.btnCalliGyro.Name = "btnCalliGyro";
+ this.btnCalliGyro.Size = new System.Drawing.Size(117, 32);
+ this.btnCalliGyro.TabIndex = 10;
+ this.btnCalliGyro.Text = "鏍″噯闄铻轰华";
+ this.btnCalliGyro.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCalliGyro.UseVisualStyleBackColor = true;
+ this.btnCalliGyro.Click += new System.EventHandler(this.button6_Click);
+ //
+ // Panel_Sensor_Information
+ //
+ this.Panel_Sensor_Information.BackColor = System.Drawing.Color.White;
+ this.Panel_Sensor_Information.Controls.Add(this.label9);
+ this.Panel_Sensor_Information.Controls.Add(this.label8);
+ this.Panel_Sensor_Information.Controls.Add(this.label7);
+ this.Panel_Sensor_Information.Controls.Add(this.label6);
+ this.Panel_Sensor_Information.Controls.Add(this.label5);
+ this.Panel_Sensor_Information.Controls.Add(this.label2);
+ this.Panel_Sensor_Information.Controls.Add(this.btnMagCalibtation);
+ this.Panel_Sensor_Information.Controls.Add(this.label_dev_name);
+ this.Panel_Sensor_Information.Controls.Add(this.btnCalliGyro);
+ this.Panel_Sensor_Information.Controls.Add(this.labelAngle);
+ this.Panel_Sensor_Information.Controls.Add(this.label4);
+ this.Panel_Sensor_Information.Controls.Add(this.label3);
+ this.Panel_Sensor_Information.Controls.Add(this.labelMagOffset);
+ this.Panel_Sensor_Information.Controls.Add(this.labelGyroOffset);
+ this.Panel_Sensor_Information.Controls.Add(this.label1);
+ this.Panel_Sensor_Information.Location = new System.Drawing.Point(710, 13);
+ this.Panel_Sensor_Information.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.Panel_Sensor_Information.Name = "Panel_Sensor_Information";
+ this.Panel_Sensor_Information.Size = new System.Drawing.Size(306, 491);
+ this.Panel_Sensor_Information.TabIndex = 13;
+ this.Panel_Sensor_Information.Paint += new System.Windows.Forms.PaintEventHandler(this.panel2_Paint);
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.BackColor = System.Drawing.Color.Transparent;
+ this.label9.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label9.Location = new System.Drawing.Point(15, 128);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(121, 20);
+ this.label9.TabIndex = 18;
+ this.label9.Text = "鏃犵嚎浼犺緭锛氫笉鏀寔";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.BackColor = System.Drawing.Color.Transparent;
+ this.label8.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label8.ForeColor = System.Drawing.Color.Red;
+ this.label8.Location = new System.Drawing.Point(245, 103);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(44, 17);
+ this.label8.TabIndex = 17;
+ this.label8.Text = "鏈牎鍑";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.BackColor = System.Drawing.Color.Transparent;
+ this.label7.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label7.ForeColor = System.Drawing.Color.Red;
+ this.label7.Location = new System.Drawing.Point(245, 75);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(44, 17);
+ this.label7.TabIndex = 16;
+ this.label7.Text = "鏈牎鍑";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.BackColor = System.Drawing.Color.Transparent;
+ this.label6.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label6.Location = new System.Drawing.Point(16, 101);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(105, 20);
+ this.label6.TabIndex = 15;
+ this.label6.Text = "纾佸姏璁★細 鏀寔";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.BackColor = System.Drawing.Color.Transparent;
+ this.label5.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label5.Location = new System.Drawing.Point(16, 73);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(105, 20);
+ this.label5.TabIndex = 14;
+ this.label5.Text = "闄铻轰华锛 鏀寔";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.Color.Transparent;
+ this.label2.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.label2.Location = new System.Drawing.Point(16, 45);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(107, 20);
+ this.label2.TabIndex = 13;
+ this.label2.Text = "鍔犻熷害璁★細鏀寔";
+ //
+ // btnMagCalibtation
+ //
+ this.btnMagCalibtation.BackgroundImage = global::DM_CalibrationTools.Properties.Resources.refresh_32px1;
+ this.btnMagCalibtation.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
+ this.btnMagCalibtation.FlatAppearance.BorderSize = 0;
+ this.btnMagCalibtation.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnMagCalibtation.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.btnMagCalibtation.Location = new System.Drawing.Point(156, 430);
+ this.btnMagCalibtation.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.btnMagCalibtation.Name = "btnMagCalibtation";
+ this.btnMagCalibtation.Size = new System.Drawing.Size(115, 32);
+ this.btnMagCalibtation.TabIndex = 10;
+ this.btnMagCalibtation.Text = "鏍″噯纾佸姏璁";
+ this.btnMagCalibtation.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnMagCalibtation.UseVisualStyleBackColor = true;
+ this.btnMagCalibtation.Click += new System.EventHandler(this.button3_Click);
+ //
+ // label_dev_name
+ //
+ this.label_dev_name.AutoSize = true;
+ this.label_dev_name.BackColor = System.Drawing.Color.Transparent;
+ this.label_dev_name.Font = new System.Drawing.Font("寰蒋闆呴粦", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label_dev_name.Location = new System.Drawing.Point(16, 11);
+ this.label_dev_name.Name = "label_dev_name";
+ this.label_dev_name.Size = new System.Drawing.Size(234, 19);
+ this.label_dev_name.TabIndex = 12;
+ this.label_dev_name.Text = "璁惧鍚嶇О锛欸eekIMU鏈夌嚎鐗 v1.0";
+ //
+ // labelAngle
+ //
+ this.labelAngle.AutoSize = true;
+ this.labelAngle.BackColor = System.Drawing.Color.Transparent;
+ this.labelAngle.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.labelAngle.Location = new System.Drawing.Point(16, 184);
+ this.labelAngle.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.labelAngle.Name = "labelAngle";
+ this.labelAngle.Size = new System.Drawing.Size(27, 20);
+ this.labelAngle.TabIndex = 11;
+ this.labelAngle.Text = "---";
+ this.labelAngle.Click += new System.EventHandler(this.labelAngle_Click);
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.BackColor = System.Drawing.Color.Transparent;
+ this.label4.Font = new System.Drawing.Font("寰蒋闆呴粦", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label4.Location = new System.Drawing.Point(16, 157);
+ this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(52, 19);
+ this.label4.TabIndex = 1;
+ this.label4.Text = "娆ф媺瑙:";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.BackColor = System.Drawing.Color.Transparent;
+ this.label3.Font = new System.Drawing.Font("寰蒋闆呴粦", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label3.Location = new System.Drawing.Point(16, 267);
+ this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(87, 19);
+ this.label3.TabIndex = 1;
+ this.label3.Text = "纾佸姏璁℃牎鍑嗗";
+ //
+ // labelMagOffset
+ //
+ this.labelMagOffset.AutoSize = true;
+ this.labelMagOffset.BackColor = System.Drawing.Color.Transparent;
+ this.labelMagOffset.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.labelMagOffset.Location = new System.Drawing.Point(16, 295);
+ this.labelMagOffset.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.labelMagOffset.Name = "labelMagOffset";
+ this.labelMagOffset.Size = new System.Drawing.Size(27, 20);
+ this.labelMagOffset.TabIndex = 0;
+ this.labelMagOffset.Text = "---";
+ //
+ // labelGyroOffset
+ //
+ this.labelGyroOffset.AutoSize = true;
+ this.labelGyroOffset.BackColor = System.Drawing.Color.Transparent;
+ this.labelGyroOffset.Font = new System.Drawing.Font("寰蒋闆呴粦", 10F);
+ this.labelGyroOffset.Location = new System.Drawing.Point(16, 239);
+ this.labelGyroOffset.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.labelGyroOffset.Name = "labelGyroOffset";
+ this.labelGyroOffset.Size = new System.Drawing.Size(27, 20);
+ this.labelGyroOffset.TabIndex = 0;
+ this.labelGyroOffset.Text = "---";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.BackColor = System.Drawing.Color.Transparent;
+ this.label1.Font = new System.Drawing.Font("寰蒋闆呴粦", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label1.Location = new System.Drawing.Point(16, 214);
+ this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(91, 19);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "闄铻轰华鏍″噯鍊:";
+ //
+ // IMUInformation
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.Color.White;
+ this.ClientSize = new System.Drawing.Size(1027, 557);
+ this.Controls.Add(this.Panel_Sensor_Information);
+ this.Controls.Add(this.Panel_Bottom);
+ this.Controls.Add(this.Gbox_OpenGL);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
+ this.Name = "IMUInformation";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "Form1";
+ this.Load += new System.EventHandler(this.Form1_Load);
+ this.Resize += new System.EventHandler(this.Form1_Resize);
+ this.Gbox_OpenGL.ResumeLayout(false);
+ this.GLpanel.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.openGLControl1)).EndInit();
+ this.Panel_Bottom.ResumeLayout(false);
+ this.Panel_Bottom.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.Panel_Sensor_Information.ResumeLayout(false);
+ this.Panel_Sensor_Information.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.GroupBox Gbox_OpenGL;
+ private System.Windows.Forms.Panel GLpanel;
+ private System.Windows.Forms.Button btnResetCalibrationData;
+ private System.Windows.Forms.Button btnMagCalibtation;
+ private System.Windows.Forms.Timer timer1;
+ private System.Windows.Forms.Button btnLoadorCali;
+ private System.Windows.Forms.Panel Panel_Bottom;
+ private System.Windows.Forms.Button btnCalliGyro;
+ private System.Windows.Forms.LinkLabel linkLabel1;
+ private System.Windows.Forms.PictureBox pictureBox1;
+ private System.Windows.Forms.Panel Panel_Sensor_Information;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label labelMagOffset;
+ private System.Windows.Forms.Label labelGyroOffset;
+ private System.Windows.Forms.Button BtnShowAngle;
+ private System.Windows.Forms.Label labelAngle;
+ private System.Windows.Forms.Label label4;
+ private SharpGL.OpenGLControl openGLControl1;
+ private System.ComponentModel.BackgroundWorker backgroundWorker1;
+ private System.Windows.Forms.BindingSource bindingSource1;
+ private System.Windows.Forms.Label label_dev_name;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Button button1;
+
+ }
+}
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.cs
new file mode 100644
index 0000000..012c6c7
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.cs
@@ -0,0 +1,433 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using SharpGL;
+using System.Drawing.Imaging;
+using System.Drawing.Drawing2D;
+using System.Diagnostics;
+using System.Threading;
+using CCWin;
+namespace DM_CalibrationTools
+{
+// struct mVector3
+// {
+// public float x, y, z;
+// };
+ public partial class IMUInformation : Form
+ {
+ Boolean global_IsCali=false;
+ HashSet magcalidata = new HashSet();
+
+ private Point mPoint;
+
+ bool isGetCalibrateData = false;
+
+ public IMUInformation()
+ {
+ InitializeComponent();
+ }
+
+ csgl gl;
+ private void Form1_Load(object sender, EventArgs e)
+ {
+ Console.WriteLine("C#:InitCaliAPI");
+ Debug.WriteLine(CaliAPI.InitCaliAPI("VID_2833&PID_0002"));
+
+ this.Text = "GeekIMU绠$悊杞欢";
+ gl = new csgl(openGLControl1);
+ this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.GLpanel_MouseWheel);
+
+ // 榛樿鐘舵佷负闅愯棌
+ //Gbox_OpenGL.Hide();
+ //Panel_Sensor_Information.Hide();
+ //Panel_Bottom.Hide();
+
+ DrawIMUInformationGrid(0, 0);
+ }
+
+ private void GLpanel_MouseWheel(object sender, MouseEventArgs e)
+ {
+ if (gl.Global_MouseInGLPanel)
+ gl.zoomCameraDelta(e.Delta / 60);
+ }
+
+ private void GLpanel_MouseEnter(object sender, EventArgs e)
+ {
+ gl.Global_MouseInGLPanel = true;
+ }
+
+ private void GLpanel_MouseLeave(object sender, EventArgs e)
+ {
+ gl.Global_MouseInGLPanel = false;
+ }
+
+ private void sceneControl1_OpenGLDraw(object sender, PaintEventArgs e)
+ {
+ gl.Draw();
+ }
+
+ private void sceneControl1_MouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Middle)
+ {
+ gl.resetView();
+ }
+
+ }
+
+ private void sceneControl1_MouseDown(object sender, MouseEventArgs e)
+ {
+ gl.Global_MouseDown = true;
+ gl.setMousePos(e.X, e.Y);
+ }
+
+ private void sceneControl1_MouseMove(object sender, MouseEventArgs e)
+ {if(gl!=null)
+ if (gl.Global_MouseDown)
+ {
+ if (e.Button == MouseButtons.Left && Control.ModifierKeys == Keys.Control)
+ {
+ gl.moveCameraXY(e.X, e.Y);
+ }
+ else if (e.Button == MouseButtons.Right && Control.ModifierKeys == Keys.Control)
+ {
+ gl.moveCameraZ(e.X, e.Y);
+ }
+ else if (e.Button == MouseButtons.Left)
+ {
+ gl.rotateCamera(e.X, e.Y);
+ }
+ else if (e.Button == MouseButtons.Right)
+ {
+ gl.zoomCamera(e.Y);
+ }
+
+ }
+ }
+
+ private void sceneControl1_MouseUp(object sender, MouseEventArgs e)
+ {
+ gl.Global_MouseDown = false;
+ gl.setMousePos(e.X, e.Y);
+ }
+
+ private void Form1_Resize(object sender, EventArgs e)
+ {
+ }
+
+ private void sceneControl1_Resized(object sender, EventArgs e)
+ {if(gl!=null)
+ gl.resize();
+ }
+ private void timer1_Tick(object sender, EventArgs e)
+ {
+ this.Invoke(new EventHandler(delegate
+ {
+ if(global_IsCali)
+ {
+ if (magcalidata.Count <= 4000)
+ {
+ mVector3 v3f = CaliAPI.GetPoint();
+ double[] v3d = { v3f.x, v3f.y, v3f.z };
+ if (v3d[0] != -99999.0 || v3d[1] != -99999.0 || v3d[2] != -99999.0)
+ magcalidata.Add(v3d);
+ gl.setPointarr(magcalidata);
+ }
+ else
+ {
+ global_IsCali = false;
+ timer1.Interval = 100;
+ Debug.WriteLine("auto stop:" + CaliAPI.FinishMagCali());
+ }
+ }
+ if (global_IsCali)
+ {
+ btnLoadorCali.Enabled = false;
+ }
+ else
+ {
+ btnLoadorCali.Enabled = true;
+ }
+ if (CaliAPI.CheckDevice() == 1)
+ {
+ btnCalliGyro.Enabled = true;
+ btnResetCalibrationData.Enabled = true;
+ btnMagCalibtation.Enabled = true;
+ mVector3 v = CaliAPI.GetEulerianAngle();
+ if (v.x != -99999.0 || v.y != -99999.0 || v.z != -99999.0)
+ {
+ v.z += v.z > 0 ? -90 : 90;
+ v.y += 180;
+ v.y = v.y > 180 ? v.y - 360 : v.y;
+
+ labelAngle.Text = "Pitch : " + v.z.ToString("+#.#;-#.#;0") + "掳 " +
+ " Roll : " + v.y.ToString("+#.#;-#.#;0") + "掳 " +
+ " Yaw : " + v.x.ToString("+#.#;-#.#;0") + "掳";
+ }
+
+ if (isGetCalibrateData == false) {
+ MagCaliParam p = CaliAPI.GetMagCali();
+ mVector3 g = CaliAPI.GetGyroCali();
+
+ labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset + " " + p.zScale;
+ labelGyroOffset.Text = g.x + " " + g.y + " " + g.z;
+
+ isGetCalibrateData = true;
+ }
+ }
+ else
+ {
+ btnCalliGyro.Enabled = false;
+ btnResetCalibrationData.Enabled = false;
+ btnMagCalibtation.Enabled = false;
+ }
+
+ }));
+ }
+
+ private void button3_Click(object sender, EventArgs e)
+ {
+ gl.DrawFlag = 1;
+ if (btnMagCalibtation.Text.Equals("寮濮嬫牎鍑嗙鍔涜"))
+ {
+ this.Invoke(new EventHandler(delegate
+ {
+ magcalidata.Clear();
+ CaliAPI.MagCali();
+ global_IsCali = true;
+ timer1.Interval = 5;
+ }));
+ btnMagCalibtation.Text = "缁撴潫鏍″噯纾佸姏璁";
+ }
+ else
+ {
+ global_IsCali = false;
+ timer1.Interval = 50;
+ CaliAPI.FinishMagCali();
+ txtreader.saveData(magcalidata);
+ MagCaliParam p = CaliAPI.CalculateMagParam();
+ //Debug.WriteLine(p.xOffset + "," + p.yOffset + "," + p.zOffset + "," + p.xScale + "," + p.yScale + "," + p.zScale);
+ labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset + " " + p.zScale;
+ CaliAPI.SetMagCali(p.xOffset, p.yOffset, p.zOffset, p.xScale, p.yScale, p.zScale);
+ pointstage = 0;
+ button4_Click(sender, e);
+ btnMagCalibtation.Text = "寮濮嬫牎鍑嗙鍔涜";
+ }
+
+
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ if(MessageBox.Show("璇ユ搷浣滀笉鍙嗭紝鏄惁缁х画锛","閲嶇疆鏍″噯鏁版嵁",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2)==DialogResult.OK)
+ {
+ if (CaliAPI.SetMagCali(0, 0, 0, 1, 1, 1) == 1) {
+ isGetCalibrateData = false;
+ }
+
+ }
+
+ }
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ MagCaliParam p = CaliAPI.GetMagCali();
+ mVector3 g = CaliAPI.GetGyroCali();
+
+ labelMagOffset.Text = p.xOffset + " " + p.xScale + "\n" + p.yOffset + " " + p.yScale + "\n" + p.yOffset +" "+ p.zScale ;
+ labelGyroOffset.Text = g.x + " " + g.y + " "+g.z;
+
+ }
+ static int pointstage = 0;
+ txtreader global_tr = null;
+ HashSet hs;
+ private void button4_Click(object sender, EventArgs e)
+ {
+ gl.DrawFlag = 1;
+ //mVector3 v3 = CaliAPI.GetPoint();
+ //Debug.WriteLine(v3.x+" "+v3.y+" "+v3.z+" ");
+
+ if ((global_tr == null) || (pointstage == 0))
+ {
+ btnLoadorCali.Text = "缁樺埗鏍″噯鏁版嵁";
+ global_tr = new txtreader("data");
+ global_tr.GetData();
+ pointstage=1;
+ hs = global_tr.getHashset();
+ }
+ else if(pointstage == 1 )
+ {
+ btnLoadorCali.Text = "鍔犺浇鍘熷鏁版嵁";
+ HashSet hs1 = new HashSet();
+ if(hs.Count >100)
+ {
+ MagCaliParam mcp= CaliAPI.CalculateMagParam();
+
+ foreach (var d in hs)
+ {
+ double[] v = { (d[0] - mcp.xOffset) * mcp.xScale, (d[1] - mcp.yOffset) * mcp.yScale, (d[2] - mcp.zOffset) * mcp.zScale };
+ hs1.Add(v);
+ }
+ hs = hs1;
+ }
+ else
+ {
+ MessageBox.Show("鏁版嵁澶皯锛屾棤娉曡绠楁牎鍑嗗弬鏁帮紒");
+ }
+ pointstage = 0;
+ }
+
+ gl.setPointarr(hs);
+
+ }
+
+ private void DrawIMUInformationGrid(int cols, int rows)
+ {
+
+ Bitmap b = new Bitmap(Panel_Sensor_Information.Width, Panel_Sensor_Information.Height);
+ Graphics g = Graphics.FromImage(b);
+ Rectangle rect = new Rectangle(5,
+ 0,
+ Panel_Sensor_Information.Width - 10, 360);
+ g.DrawRectangle(new Pen(Color.FromArgb(228, 228, 228), 1), rect);
+
+ g.FillRectangle(new SolidBrush(Color.FromArgb(249, 249, 249)),
+ new Rectangle(new Point(6, 1),
+ new Size(Panel_Sensor_Information.Width - 11, 40)));
+
+ int padding = 28;
+ int stLocation = 68;
+ for (int i = 0; i < 4; i++) {
+ g.FillRectangle(new SolidBrush(Color.FromArgb(249, 249, 249)),
+ new Rectangle(new Point(6, 1 + i * padding * 2 + stLocation),
+ new Size(Panel_Sensor_Information.Width - 11, padding)));
+ }
+
+ g.Dispose();
+
+ Panel_Sensor_Information.Show();
+ Panel_Sensor_Information.BackgroundImage = b;
+
+
+ }
+ // 鑾峰彇浼犳劅鍣ㄧ殑鐘舵
+ public bool GetIMUStatus()
+ {
+ if (CaliAPI.CheckDevice() == 1) {
+ return true;
+ }
+ return false;
+ }
+ private void button5_Click(object sender, EventArgs e)
+ {
+ global_IsCali = false;
+ timer1.Interval = 100;
+ Debug.WriteLine(CaliAPI.FinishMagCali());
+ txtreader.saveData(magcalidata);
+ MagCaliParam p = CaliAPI.CalculateMagParam();
+ Debug.WriteLine(p.xOffset + "," + p.yOffset + "," + p.zOffset + "," + p.xScale + "," + p.yScale + "," + p.zScale);
+ Debug.WriteLine(CaliAPI.SetMagCali(p.xOffset, p.yOffset, p.zOffset, p.xScale, p.yScale, p.zScale));
+ pointstage = 0;
+ button4_Click(sender, e);
+ }
+
+ private void button6_Click(object sender, EventArgs e)
+ {
+ DialogResult dr = MessageBox.Show("鏍″噯杩囩▼绾2绉掞紝璇蜂繚鎸佽澶囬潤缃紝鍗曞嚮纭畾寮濮嬨", "闄铻轰华鏍″噯", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
+ if (dr != DialogResult.OK && CaliAPI.CheckDevice() == 1)
+ {
+ return;
+ }
+ else
+ {
+ int result = CaliAPI.GyroCali();
+ Thread.Sleep(1000);
+ if (result == 1)
+ {
+ MessageBox.Show("鏍″噯鎴愬姛!");
+ mVector3 g = CaliAPI.GetGyroCali();
+ labelGyroOffset.Text = g.x + " " + g.y + " " + g.z + "\n";
+ }
+ else
+ MessageBox.Show("鏍″噯澶辫触!");
+ }
+ }
+
+ private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+ {
+ System.Diagnostics.Process.Start("https://shop408976235.taobao.com/");
+ }
+
+ private void pictureBox1_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start("https://shop408976235.taobao.com/");
+ }
+
+ private void BtnShowAngle_Click(object sender, EventArgs e)
+ {
+ gl.DrawFlag = 2;
+ CaliAPI.Correction();
+ }
+
+ private void BtnHelp_Click(object sender, EventArgs e)
+ {
+
+ System.Diagnostics.Process.Start(Application.StartupPath+"/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf");
+ }
+
+ private void sceneControl1_OpenGLDraw(object sender)
+ {
+ }
+
+ private void sceneControl1_OpenGLInitialized(object sender, EventArgs e)
+ {
+ OpenGL gl = openGLControl1.OpenGL;
+ gl.ClearColor(0, 0, 0, 0);
+ }
+
+ private void Btn_Close_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void Control_Panel_MouseDown(object sender, MouseEventArgs e)
+ {
+ mPoint = new Point(e.X, e.Y);
+ }
+
+ private void Control_Panel_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
+ }
+ }
+
+ private void Btn_min_Click(object sender, EventArgs e)
+ {
+ this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void Btn_support_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start(Application.StartupPath + "/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf");
+ }
+
+ private void panel2_Paint(object sender, PaintEventArgs e)
+ {
+
+ }
+
+ private void labelAngle_Click(object sender, EventArgs e)
+ {
+
+ }
+
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.resx b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.resx
new file mode 100644
index 0000000..57c19e1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/IMUInformation.resx
@@ -0,0 +1,1265 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 107, 17
+
+
+ 281, 17
+
+
+ 61
+
+
+
+
+ AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/CdkCvwnaAr8J2j6/Cdr+vwna/r8J276/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/Cdr+vwnaPr8J2gK/C
+ dkCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdkCvwnaAr8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/CdoCvwnZAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwnZwr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2cK/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnavr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dq+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdoCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdoCvwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ doCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnaAr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwna/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ doAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2YK/Cdu+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYwr8J236/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/63Adf+ktnD/na1r/5en
+ aP+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZgr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2YAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//83Z
+ qf/c4sj/6+3i/////////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5enaP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYwr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP//////////////////////////////////////////////
+ /////////////////////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6u+dP+ounL/qLpy/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/Cdt+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ///k6Nn/rbmM/5KhZf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6K0b/+WpWf/kqFl/5Kh
+ Zf+SoWX/kqFl/5SjZv+drWv/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Xp2j/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Uo2b/prhx/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2j6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/prhx/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ////////////////////////////////////////////////////////////////////////+Pn1/6az
+ gv+SoWX/kqFl/6i6cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5KhZf+SoWX/kad3/4+tif+PrYn/kKqA/5KhZf+SoWX/kqFl/5Kh
+ Zf+Uo2b/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+SoWX/jbWk/4jJ
+ 4/+Hz/X/h8/1/4fP9f+Hz/X/iMzs/4u+v/+Rp3f/kqFl/5KhZf+drWv/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4nG2v+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4jM
+ 7P+Pr5L/kqFl/5SjZv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cds8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Pr5L/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+twHX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4jM7P+Rp3f/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwna/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6S2cP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4u+v/+ounL/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ //////////////////////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/iMzs/6u+dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+Xp2j/prOC/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf///////////////////////////////////////////////////////////////////////////93i
+ z/+Xp2j/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/5mn
+ b///////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////////////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+lxZb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/6XF
+ lv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/W3MX/////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+HozP//////////////
+ ///////////////////////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5Kh
+ Zf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qsSG/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+vt4v//////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////////////////////////////////////
+ /////////////+vt4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4zN
+ 5f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2cK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/3OTD////
+ /////////////////////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5Cq
+ gP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/nsiu/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/BzZ3/////////////////////////////////////////
+ ////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4/N
+ 3f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/rcB1/6+7
+ jf////////////////////////////////////////////////////////////////+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM
+ 7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnavr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/rbmM////////////////////////////////////
+ /////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdq8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/pLZw/5Kh
+ Zf+0vpX/////////////////////////////////////////////////////////////////r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZwr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/52ta/+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/rcB1/52ta/+SoWX/kqFl/8/WvP//////////////////////////////
+ //////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/8PTl////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/5SjZv+fr2z/prhx/6i6cv+ounL/prhx/5+vbP+Uo2b/kqFl/5Kh
+ Zf+Zp2//+Pn1////////////////////////////////////////////////////////////8PTl/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/9bcxf//////////////////////////////
+ ///////////////////////////////////Y3sb/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAA
+ AAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+7xJ///////////////////////////////////////////////////////////////////////7vE
+ n/+Uo2b/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAr8J2v6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////
+ ////////////////////////////////////////////////////////////////////////1tzF/5mn
+ b/+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Zp2//1tzF////////////////////////////////////
+ ////////////////////////////////////////oK14/5KhZf+Uo2b/qrxz/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAACvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////
+ ////////////////////////////////////////+Pn1/8/WvP+0vpX/rbmM/625jP+0vpX/z9a8//j5
+ 9f////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+Uo2b/qrxz/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/AAAAAAAAAAAAAAAAr8J2QK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/kqFl/5KhZf+QnmT/kJ5k/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/jpxj/3yJWf98iVn/jpxj/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+Vn3j/e4dY/3uH
+ WP97kG7/hMbk/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2vwAAAAAAAAAAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////f49f+Unnf/eY5u/3OqxP9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvAAAAAK/CdiCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D05f//////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////f4
+ 9f+Nuc7/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnYgr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r7
+ 9v//////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO
+ 7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkCvwnaAr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2gK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPr8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwna/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/5uzU////////////////////////////////////////////////////////////////////
+ ////////+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////
+ //////////////////////////////D05f/h6Mz/zdmp/7nKh/++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/hsjl/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Srxf+OpXn/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+Ou87/jKN4/5KhZf+Uo2b/qrxz/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/kqFl/5KhZf+Uo2b/qrxz/63Adf+ktnD/na1r/5enaP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6S2cP+ms4L/+Pn1////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+ms4L/kqFl/5Kh
+ Zf+Uo2b/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+ms4L/+Pn1////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////j59f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6cv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/n69s/5KhZf+SoWX/kqFl/4aIXf+Ne3D/9vX0////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf+GiF3/c11P/3Nd
+ T/+Ne3D/9vX0////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/oK14/7vEn//W3MX/6+3i////
+ /////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5KhZf+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+drWv/kqFl/5KhZf+SoWX/hohd/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f//////////////////////////////////////////////////////////////
+ /////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5KhZf+SoWX/kqFl/4aIXf9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/rbmM/5Kh
+ Zf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52t
+ a/+SoWX/kqFl/5KhZf+Be1n/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5enaP+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2j6/C
+ doCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5WW
+ Zf++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////+Pn1/6azgv+SoWX/kqFl/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf9/d1f/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dkCvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5Kh
+ Zf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////6+3i/5mn
+ b/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2IAAAAACvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+muHH/lqVn/5KhZf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du8AAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5Kh
+ Zf9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////k6Nn/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAACvwnZAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/393
+ V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkAAAAAAAAAAAAAAAACvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/4iMXv93ZlL/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+suYX/+Pn1////////////////////////////////////////////////////
+ ////////////////////////+vv2/9zkw//I1aH/w9GY/8PRmP/I1aH/3OTD//r79v//////////////
+ /////////////////////////////////////////////////////////////93iz/+Xp2j/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/AAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+rvnT/na1r/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6CteP//////////////
+ /////////////////////////////////////////////////////////////+HozP+0xn//r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ//+HozP//////////////////////////////////////////////
+ /////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr8AAAAAAAAAAAAAAAAAAAAAr8J2cK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/q750/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////////////////////////////////////////////
+ ///////////////////N2an/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////u8Sf/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/W3MX/////////
+ ////////////////////////////////////////////////////////4ejM/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ///////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+SoWX/kqFl/4qQ
+ YP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/q750/+vt4v//////////////////////////////////////////////
+ //////////////r79v+0xn//r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf///////////////////////////////////////////////////////////+vt
+ 4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/46ZYv9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/////////
+ ////////////////////////////////////////////////////////3OTD/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ /////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZwAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+OmWL/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+Kg17/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////
+ ///////////////////BzZ3/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2r6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/6i1cf+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////
+ /////////////////////////////////////////////////////////////6+7jf+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf////////////////////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////////////////////
+ ////////////////////////rbmM/52ta/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv////////////////////////////////////////////////////////////////+0vpX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////////////////////
+ /////////////////////////////8/WvP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ //////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/8PTl////////////////////////////////////////////////////////////+Pn1/5mn
+ b/+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////8PTl/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/prhx/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////////////////////
+ ////////////////////////////////////////1tzF/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf/////////////////h6Mz/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYQr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+WpWf/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf///////////83Zqf+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////tMZ//6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/35yV/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+comr/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/3tqVP9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//fnBW/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQ
+ Y/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PR
+ mP//////////////////////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3Nd
+ T/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/jYlg/4qD
+ Xv+otXH/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D0
+ 5f//////////////////////////////////////////////////////////////////////////////
+ ////////wMqi/6S2cP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdo8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////////////////////
+ ////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J236/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/5uzU////
+ ////////////////////////////////////////////////////////////////////////vs2Q/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////////////////////
+ //////////////D05f/h6Mz/zdmp/7TGf/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ djAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ djCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdt+vwnYwAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2jwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnZgr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J276/CdmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnaAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYQr8J2gK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2r6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavr8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dnCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnZwr8J2IAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZAr8J2gK/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnaAr8J2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYgr8J2QK/CdoCvwnaPr8J2v6/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwna/r8J2v6/Cdo+vwnaAr8J2QK/CdiAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////////8AAAD////////////////wAAAAD///////////////AAAAAA
+ D/////////////+AAAAAAAH////////////+AAAAAAAAf///////////8AAAAAAAAA///////////8AA
+ AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH///////
+ //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////gAAAAAAAAAAAAf///////wAAAAAAAAAAAAD/
+ //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA
+ AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA
+ AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///w
+ AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA
+ A///gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA
+ AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA
+ AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAD/AA
+ AAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA
+ AAfAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA
+ AAAAAAADgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA
+ AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA
+ AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAADwAAAAAAA
+ AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAB+AA
+ AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA
+ AA/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA
+ AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA
+ AAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///g
+ AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///4AAAAAAAAAAAAAAAA
+ H////AAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA
+ AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA
+ AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP///////AAAAAAAAAAAAAP//////
+ /4AAAAAAAAAAAAH////////AAAAAAAAAAAAD////////8AAAAAAAAAAAD/////////gAAAAAAAAAAB//
+ ///////+AAAAAAAAAAB//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA
+ AA////////////4AAAAAAAB/////////////gAAAAAAB//////////////AAAAAAD///////////////
+ AAAAAP////////////////AAAA////////8=
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.Designer.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.Designer.cs
new file mode 100644
index 0000000..1b57795
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.Designer.cs
@@ -0,0 +1,300 @@
+锘縩amespace DM_CalibrationTools
+{
+ partial class MainForms
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForms));
+ this.Control_Panel = new System.Windows.Forms.Panel();
+ this.label_line = new System.Windows.Forms.Label();
+ this.Panel_logo = new System.Windows.Forms.Panel();
+ this.label_dev_status = new System.Windows.Forms.Label();
+ this.label_Form_Name = new System.Windows.Forms.Label();
+ this.MainPanel = new System.Windows.Forms.Panel();
+ this.Btn_my_dev = new System.Windows.Forms.Button();
+ this.Btn_support = new System.Windows.Forms.Button();
+ this.Btn_software_Setting = new System.Windows.Forms.Button();
+ this.Btn_min = new System.Windows.Forms.Button();
+ this.Btn_dev_Setting = new System.Windows.Forms.Button();
+ this.Btn_DFU_DownLoad = new System.Windows.Forms.Button();
+ this.pictureBox2 = new System.Windows.Forms.PictureBox();
+ this.pictureBox3 = new System.Windows.Forms.PictureBox();
+ this.Btn_Close = new System.Windows.Forms.Button();
+ this.Control_Panel.SuspendLayout();
+ this.Panel_logo.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
+ this.SuspendLayout();
+ //
+ // Control_Panel
+ //
+ this.Control_Panel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Control_Panel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(58)))), ((int)(((byte)(151)))), ((int)(((byte)(229)))));
+ this.Control_Panel.Controls.Add(this.Btn_my_dev);
+ this.Control_Panel.Controls.Add(this.Btn_support);
+ this.Control_Panel.Controls.Add(this.Btn_software_Setting);
+ this.Control_Panel.Controls.Add(this.label_line);
+ this.Control_Panel.Controls.Add(this.Btn_min);
+ this.Control_Panel.Controls.Add(this.Btn_dev_Setting);
+ this.Control_Panel.Controls.Add(this.Btn_DFU_DownLoad);
+ this.Control_Panel.Controls.Add(this.Panel_logo);
+ this.Control_Panel.Controls.Add(this.Btn_Close);
+ this.Control_Panel.Location = new System.Drawing.Point(-1, 0);
+ this.Control_Panel.Name = "Control_Panel";
+ this.Control_Panel.Size = new System.Drawing.Size(1028, 88);
+ this.Control_Panel.TabIndex = 16;
+ this.Control_Panel.Paint += new System.Windows.Forms.PaintEventHandler(this.Control_Panel_Paint);
+ this.Control_Panel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Control_Panel_MouseDown);
+ this.Control_Panel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Control_Panel_MouseMove);
+ //
+ // label_line
+ //
+ this.label_line.AutoSize = true;
+ this.label_line.BackColor = System.Drawing.Color.Transparent;
+ this.label_line.ForeColor = System.Drawing.Color.White;
+ this.label_line.Location = new System.Drawing.Point(959, 7);
+ this.label_line.Name = "label_line";
+ this.label_line.Size = new System.Drawing.Size(11, 12);
+ this.label_line.TabIndex = 16;
+ this.label_line.Text = "|";
+ //
+ // Panel_logo
+ //
+ this.Panel_logo.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(42)))), ((int)(((byte)(138)))), ((int)(((byte)(219)))));
+ this.Panel_logo.Controls.Add(this.pictureBox2);
+ this.Panel_logo.Controls.Add(this.pictureBox3);
+ this.Panel_logo.Controls.Add(this.label_dev_status);
+ this.Panel_logo.Controls.Add(this.label_Form_Name);
+ this.Panel_logo.Location = new System.Drawing.Point(3, 0);
+ this.Panel_logo.Name = "Panel_logo";
+ this.Panel_logo.Size = new System.Drawing.Size(207, 88);
+ this.Panel_logo.TabIndex = 16;
+ this.Panel_logo.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Panel_logo_MouseDown);
+ this.Panel_logo.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Panel_logo_MouseMove);
+ //
+ // label_dev_status
+ //
+ this.label_dev_status.AutoSize = true;
+ this.label_dev_status.Font = new System.Drawing.Font("寰蒋闆呴粦", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label_dev_status.ForeColor = System.Drawing.Color.White;
+ this.label_dev_status.Location = new System.Drawing.Point(88, 47);
+ this.label_dev_status.Name = "label_dev_status";
+ this.label_dev_status.Size = new System.Drawing.Size(79, 20);
+ this.label_dev_status.TabIndex = 11;
+ this.label_dev_status.Text = "璁惧鏈繛鎺";
+ //
+ // label_Form_Name
+ //
+ this.label_Form_Name.AutoSize = true;
+ this.label_Form_Name.Font = new System.Drawing.Font("寰蒋闆呴粦", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label_Form_Name.ForeColor = System.Drawing.Color.White;
+ this.label_Form_Name.Location = new System.Drawing.Point(70, 19);
+ this.label_Form_Name.Name = "label_Form_Name";
+ this.label_Form_Name.Size = new System.Drawing.Size(130, 19);
+ this.label_Form_Name.TabIndex = 16;
+ this.label_Form_Name.Text = "GeekIMU绠$悊涓績";
+ //
+ // MainPanel
+ //
+ this.MainPanel.Dock = System.Windows.Forms.DockStyle.Bottom;
+ this.MainPanel.Location = new System.Drawing.Point(0, 91);
+ this.MainPanel.Name = "MainPanel";
+ this.MainPanel.Size = new System.Drawing.Size(1027, 554);
+ this.MainPanel.TabIndex = 17;
+ //
+ // Btn_my_dev
+ //
+ this.Btn_my_dev.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_my_dev.FlatAppearance.BorderSize = 0;
+ this.Btn_my_dev.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_my_dev.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_my_dev.ForeColor = System.Drawing.Color.White;
+ this.Btn_my_dev.Image = global::DM_CalibrationTools.Properties.Resources.home_48px;
+ this.Btn_my_dev.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_my_dev.Location = new System.Drawing.Point(209, 1);
+ this.Btn_my_dev.Name = "Btn_my_dev";
+ this.Btn_my_dev.Size = new System.Drawing.Size(77, 87);
+ this.Btn_my_dev.TabIndex = 22;
+ this.Btn_my_dev.Text = "鎴戠殑浼犳劅鍣";
+ this.Btn_my_dev.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_my_dev.UseVisualStyleBackColor = true;
+ //
+ // Btn_support
+ //
+ this.Btn_support.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_support.FlatAppearance.BorderSize = 0;
+ this.Btn_support.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_support.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_support.ForeColor = System.Drawing.Color.White;
+ this.Btn_support.Image = global::DM_CalibrationTools.Properties.Resources.help_48px;
+ this.Btn_support.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_support.Location = new System.Drawing.Point(441, 1);
+ this.Btn_support.Name = "Btn_support";
+ this.Btn_support.Size = new System.Drawing.Size(77, 87);
+ this.Btn_support.TabIndex = 21;
+ this.Btn_support.Text = "甯姪涓庢敮鎸";
+ this.Btn_support.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_support.UseVisualStyleBackColor = true;
+ this.Btn_support.Click += new System.EventHandler(this.Btn_support_Click);
+ //
+ // Btn_software_Setting
+ //
+ this.Btn_software_Setting.FlatAppearance.BorderSize = 0;
+ this.Btn_software_Setting.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_software_Setting.Image = global::DM_CalibrationTools.Properties.Resources.btn_setting_18px_1;
+ this.Btn_software_Setting.Location = new System.Drawing.Point(933, 3);
+ this.Btn_software_Setting.Name = "Btn_software_Setting";
+ this.Btn_software_Setting.Size = new System.Drawing.Size(18, 18);
+ this.Btn_software_Setting.TabIndex = 20;
+ this.Btn_software_Setting.UseVisualStyleBackColor = true;
+ //
+ // Btn_min
+ //
+ this.Btn_min.FlatAppearance.BorderSize = 0;
+ this.Btn_min.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_min.Image = global::DM_CalibrationTools.Properties.Resources.btn_mini_18px_1;
+ this.Btn_min.Location = new System.Drawing.Point(978, 3);
+ this.Btn_min.Name = "Btn_min";
+ this.Btn_min.Size = new System.Drawing.Size(18, 18);
+ this.Btn_min.TabIndex = 19;
+ this.Btn_min.UseVisualStyleBackColor = true;
+ this.Btn_min.Click += new System.EventHandler(this.Btn_min_Click);
+ //
+ // Btn_dev_Setting
+ //
+ this.Btn_dev_Setting.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_dev_Setting.FlatAppearance.BorderSize = 0;
+ this.Btn_dev_Setting.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_dev_Setting.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_dev_Setting.ForeColor = System.Drawing.Color.White;
+ this.Btn_dev_Setting.Image = global::DM_CalibrationTools.Properties.Resources.settings_48px;
+ this.Btn_dev_Setting.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_dev_Setting.Location = new System.Drawing.Point(285, 1);
+ this.Btn_dev_Setting.Name = "Btn_dev_Setting";
+ this.Btn_dev_Setting.Size = new System.Drawing.Size(77, 87);
+ this.Btn_dev_Setting.TabIndex = 18;
+ this.Btn_dev_Setting.Text = "璁惧璁剧疆";
+ this.Btn_dev_Setting.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_dev_Setting.UseVisualStyleBackColor = true;
+ //
+ // Btn_DFU_DownLoad
+ //
+ this.Btn_DFU_DownLoad.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.Btn_DFU_DownLoad.FlatAppearance.BorderSize = 0;
+ this.Btn_DFU_DownLoad.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_DFU_DownLoad.Font = new System.Drawing.Font("寰蒋闆呴粦", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.Btn_DFU_DownLoad.ForeColor = System.Drawing.Color.White;
+ this.Btn_DFU_DownLoad.Image = global::DM_CalibrationTools.Properties.Resources.download_48px;
+ this.Btn_DFU_DownLoad.ImageAlign = System.Drawing.ContentAlignment.TopCenter;
+ this.Btn_DFU_DownLoad.Location = new System.Drawing.Point(359, 1);
+ this.Btn_DFU_DownLoad.Name = "Btn_DFU_DownLoad";
+ this.Btn_DFU_DownLoad.Size = new System.Drawing.Size(77, 87);
+ this.Btn_DFU_DownLoad.TabIndex = 17;
+ this.Btn_DFU_DownLoad.Text = "鍥轰欢鍗囩骇";
+ this.Btn_DFU_DownLoad.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
+ this.Btn_DFU_DownLoad.UseVisualStyleBackColor = true;
+ //
+ // pictureBox2
+ //
+ this.pictureBox2.Image = global::DM_CalibrationTools.Properties.Resources.tools;
+ this.pictureBox2.Location = new System.Drawing.Point(6, 13);
+ this.pictureBox2.Name = "pictureBox2";
+ this.pictureBox2.Size = new System.Drawing.Size(60, 60);
+ this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox2.TabIndex = 15;
+ this.pictureBox2.TabStop = false;
+ //
+ // pictureBox3
+ //
+ this.pictureBox3.Image = global::DM_CalibrationTools.Properties.Resources.test;
+ this.pictureBox3.Location = new System.Drawing.Point(75, 47);
+ this.pictureBox3.Name = "pictureBox3";
+ this.pictureBox3.Size = new System.Drawing.Size(12, 21);
+ this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pictureBox3.TabIndex = 17;
+ this.pictureBox3.TabStop = false;
+ //
+ // Btn_Close
+ //
+ this.Btn_Close.FlatAppearance.BorderSize = 0;
+ this.Btn_Close.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.Btn_Close.Image = global::DM_CalibrationTools.Properties.Resources.btn_close_18px_1;
+ this.Btn_Close.Location = new System.Drawing.Point(1002, 3);
+ this.Btn_Close.Name = "Btn_Close";
+ this.Btn_Close.Size = new System.Drawing.Size(18, 18);
+ this.Btn_Close.TabIndex = 14;
+ this.Btn_Close.UseVisualStyleBackColor = true;
+ this.Btn_Close.Click += new System.EventHandler(this.Btn_Close_Click);
+ //
+ // MainForms
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(1027, 645);
+ this.Controls.Add(this.MainPanel);
+ this.Controls.Add(this.Control_Panel);
+ this.CornerRadius = 1;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Name = "MainForms";
+ this.ShadowStyle = CCWin.RoundStyle.None;
+ this.Text = "MainForms";
+ this.Control_Panel.ResumeLayout(false);
+ this.Control_Panel.PerformLayout();
+ this.Panel_logo.ResumeLayout(false);
+ this.Panel_logo.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel Control_Panel;
+ private System.Windows.Forms.Button Btn_my_dev;
+ private System.Windows.Forms.Button Btn_support;
+ private System.Windows.Forms.Button Btn_software_Setting;
+ private System.Windows.Forms.Label label_line;
+ private System.Windows.Forms.Button Btn_min;
+ private System.Windows.Forms.Button Btn_dev_Setting;
+ private System.Windows.Forms.Button Btn_DFU_DownLoad;
+ private System.Windows.Forms.Panel Panel_logo;
+ private System.Windows.Forms.PictureBox pictureBox2;
+ private System.Windows.Forms.PictureBox pictureBox3;
+ private System.Windows.Forms.Label label_dev_status;
+ private System.Windows.Forms.Label label_Form_Name;
+ private System.Windows.Forms.Button Btn_Close;
+ private System.Windows.Forms.Panel MainPanel;
+
+
+ }
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.cs
new file mode 100644
index 0000000..2f97802
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.cs
@@ -0,0 +1,120 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using CCWin;
+namespace DM_CalibrationTools
+{
+ public partial class MainForms : SkinMain
+ {
+ private Point mPoint;
+ private Point mPoint_logo;
+
+ IMUInformation frm_IMUInformation;
+ IMUConnect frm_IMUConnect;
+
+ System.Windows.Forms.Timer mTimer_Main;
+ public MainForms()
+ {
+ InitializeComponent();
+ this.Load += new System.EventHandler(this.MainForms_Load);
+
+ }
+
+ private void MainForms_Load(object sender, EventArgs e)
+ {
+ this.Text = "GeekIMU绠$悊涓績";
+
+ // 璁剧疆浼犳劅鍣ㄤ俊鎭负涓婚粯璁ょ獥鍙
+ frm_IMUInformation = new IMUInformation();
+ frm_IMUInformation.TopLevel = false;
+ this.MainPanel.Controls.Add(frm_IMUInformation);
+
+ frm_IMUConnect = new IMUConnect();
+ frm_IMUConnect.TopLevel = false;
+ this.MainPanel.Controls.Add(frm_IMUConnect);
+
+ frm_IMUInformation.Show();
+ frm_IMUConnect.Show();
+ frm_IMUInformation.Hide();
+
+ // 閰嶇疆瀹氭椂鍣紝瀹氭椂鍣ㄧ敤浜庡畾鏈熸煡璇㈣澶囩姸鎬
+ mTimer_Main = new System.Windows.Forms.Timer();
+ mTimer_Main.Interval = 1500;
+ mTimer_Main.Enabled = true;
+ mTimer_Main.Tick += new EventHandler(timer_Tick);
+
+
+ }
+
+ void timer_Tick(object sender, EventArgs e)
+ {
+ label_dev_status.Text = frm_IMUInformation.GetIMUStatus() == true ? "璁惧宸茶繛鎺" : "鏈繛鎺";
+
+ if (frm_IMUInformation.GetIMUStatus() == false)
+ {
+ frm_IMUInformation.Hide();
+ frm_IMUConnect.Show();
+ Console.WriteLine("C#:璁惧鏈繛鎺");
+ }
+ else
+ {
+ frm_IMUInformation.Show();
+ frm_IMUConnect.Hide();
+ Console.WriteLine("C#:璁惧宸茶繛鎺");
+ }
+ }
+
+ private void Btn_Close_Click(object sender, EventArgs e)
+ {
+ this.Close();
+ }
+
+ private void Btn_min_Click(object sender, EventArgs e)
+ {
+ this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void Control_Panel_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
+ }
+ }
+
+ private void Control_Panel_MouseDown(object sender, MouseEventArgs e)
+ {
+ mPoint = new Point(e.X, e.Y);
+ }
+
+
+ private void Panel_logo_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ this.Location = new Point(this.Location.X + e.X - mPoint_logo.X, this.Location.Y + e.Y - mPoint_logo.Y);
+ }
+ }
+
+ private void Panel_logo_MouseDown(object sender, MouseEventArgs e)
+ {
+ mPoint_logo = new Point(e.X, e.Y);
+ }
+
+ private void Control_Panel_Paint(object sender, PaintEventArgs e)
+ {
+
+ }
+
+ private void Btn_support_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start(Application.StartupPath + "/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf");
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.resx b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.resx
new file mode 100644
index 0000000..f635787
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/MainForms.resx
@@ -0,0 +1,1253 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/CdkCvwnaAr8J2j6/Cdr+vwna/r8J276/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/Cdr+vwnaPr8J2gK/C
+ dkCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdkCvwnaAr8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2v6/CdoCvwnZAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwnZwr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2cK/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnavr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dq+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdoCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdoCvwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ doCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnaAr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdiCvwna/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ doAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2YK/Cdu+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYwr8J236/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/63Adf+ktnD/na1r/5en
+ aP+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZgr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2YAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2MK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//83Z
+ qf/c4sj/6+3i/////////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5enaP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYwr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP//////////////////////////////////////////////
+ /////////////////////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6u+dP+ounL/qLpy/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/Cdt+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ///k6Nn/rbmM/5KhZf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6K0b/+WpWf/kqFl/5Kh
+ Zf+SoWX/kqFl/5SjZv+drWv/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Xp2j/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Uo2b/prhx/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2j6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/prhx/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ////////////////////////////////////////////////////////////////////////+Pn1/6az
+ gv+SoWX/kqFl/6i6cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5KhZf+SoWX/kad3/4+tif+PrYn/kKqA/5KhZf+SoWX/kqFl/5Kh
+ Zf+Uo2b/q750/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+SoWX/jbWk/4jJ
+ 4/+Hz/X/h8/1/4fP9f+Hz/X/iMzs/4u+v/+Rp3f/kqFl/5KhZf+drWv/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4nG2v+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4jM
+ 7P+Pr5L/kqFl/5SjZv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cds8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ////////////////////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Pr5L/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+twHX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////////////////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4jM7P+Rp3f/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwna/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6S2cP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4u+v/+ounL/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ //////////////////////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/iMzs/6u+dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+Xp2j/prOC/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf///////////////////////////////////////////////////////////////////////////93i
+ z/+Xp2j/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/5mn
+ b///////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////////////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+lxZb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/6XF
+ lv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdu+vwnYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/W3MX/////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+HozP//////////////
+ ///////////////////////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5Kh
+ Zf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/qsSG/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/+vt4v//////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////////////////////////////////////
+ /////////////+vt4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4zN
+ 5f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2cK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/3OTD////
+ /////////////////////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5Cq
+ gP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/nsiu/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/BzZ3/////////////////////////////////////////
+ ////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4/N
+ 3f+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2UK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/rcB1/6+7
+ jf////////////////////////////////////////////////////////////////+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM
+ 7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnavr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/rbmM////////////////////////////////////
+ /////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdq8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/pLZw/5Kh
+ Zf+0vpX/////////////////////////////////////////////////////////////////r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZwr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/52ta/+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/rcB1/52ta/+SoWX/kqFl/8/WvP//////////////////////////////
+ //////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/Cds+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/8PTl////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/5SjZv+fr2z/prhx/6i6cv+ounL/prhx/5+vbP+Uo2b/kqFl/5Kh
+ Zf+Zp2//+Pn1////////////////////////////////////////////////////////////8PTl/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qrxz/5SjZv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/9bcxf//////////////////////////////
+ ///////////////////////////////////Y3sb/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6q8
+ c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAA
+ AAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+7xJ///////////////////////////////////////////////////////////////////////7vE
+ n/+Uo2b/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+qvHP/lKNm/5KhZf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAr8J2v6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////
+ ////////////////////////////////////////////////////////////////////////1tzF/5mn
+ b/+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+Zp2//1tzF////////////////////////////////////
+ ////////////////////////////////////////oK14/5KhZf+Uo2b/qrxz/6/Cdv+vwnb/qrxz/5Sj
+ Zv+SoWX/kqFl/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAA
+ AAAAAAAAAAAAAAAAAACvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////
+ ////////////////////////////////////////+Pn1/8/WvP+0vpX/rbmM/625jP+0vpX/z9a8//j5
+ 9f////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+Uo2b/qrxz/6q8c/+Uo2b/kqFl/5KhZf+QqoD/iMzs/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/AAAAAAAAAAAAAAAAr8J2QK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/kqFl/5KhZf+QnmT/kJ5k/5Kh
+ Zf+SoWX/kKqA/4jM7P+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnZAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/jpxj/3yJWf98iVn/jpxj/5CqgP+IzOz/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdoAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+Vn3j/e4dY/3uH
+ WP97kG7/hMbk/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2vwAAAAAAAAAAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////f49f+Unnf/eY5u/3OqxP9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvAAAAAK/CdiCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D05f//////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////f4
+ 9f+Nuc7/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnYgr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r7
+ 9v//////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO
+ 7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkCvwnaAr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2gK/Cdo+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jE
+ jv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaPr8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwna/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4fP9f+Hz/X/h8/1/4fP9f+Kzu3/qMSO/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2v6/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv/D0Zj/5uzU////////////////////////////////////////////////////////////////////
+ ////////+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP
+ 9f+Hz/X/h8/1/4fP9f+Hz/X/is7t/6jEjv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////
+ //////////////////////////////D05f/h6Mz/zdmp/7nKh/++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/g8jt/4fP9f+Hz/X/h8/1/4rO7f+oxI7/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////b6/P+MvNX/cqzL/3Ks
+ y/9zrs7/g8jt/4fP9f+Kzu3/qMSO/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////b6/P+MvNX/cqzL/3Ksy/9zrs7/hsjl/6jEjv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////b6
+ /P+MvNX/cqzL/3Srxf+OpXn/qrxz/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////b6/P+Ou87/jKN4/5KhZf+Uo2b/qrxz/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f+ms4L/kqFl/5KhZf+Uo2b/qrxz/63Adf+ktnD/na1r/5enaP+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+Xp2j/na1r/6S2cP+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6S2cP+ms4L/+Pn1////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////j59f+ms4L/kqFl/5Kh
+ Zf+Uo2b/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+bq2r/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ktnD/kqFl/5KhZf+ms4L/+Pn1////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////j59f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/malp/6i6cv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/n69s/5KhZf+SoWX/kqFl/4aIXf+Ne3D/9vX0////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////j5
+ 9f+ms4L/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/5+vbP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf+GiF3/c11P/3Nd
+ T/+Ne3D/9vX0////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////j59f+ms4L/oK14/7vEn//W3MX/6+3i////
+ /////////////////////////////+vt4v/W3MX/u8Sf/6CteP+SoWX/kqFl/5KhZf+SoWX/kqFl/5en
+ aP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+drWv/kqFl/5KhZf+SoWX/hohd/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////j59f//////////////////////////////////////////////////////////////
+ /////////////93iz/+tuYz/kqFl/5KhZf+SoWX/kqFl/5SjZv+qvHP/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5KhZf+SoWX/kqFl/4aIXf9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////k6Nn/rbmM/5Kh
+ Zf+SoWX/kqFl/5SjZv+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2v6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52t
+ a/+SoWX/kqFl/5KhZf+Be1n/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5mnb/+SoWX/kqFl/5enaP+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr+vwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+Ne3D/9vX0////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////6+3i/5mnb/+SoWX/kqFl/5+vbP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2j6/C
+ doCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/na1r/5Kh
+ Zf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5WW
+ Zf++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////+Pn1/6azgv+SoWX/kqFl/6i6
+ cv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAr8J2QK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+SoWX/kqFl/5KhZf9/d1f/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////+Pn1/5mnb/+SoWX/malp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dkCvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+drWv/kqFl/5Kh
+ Zf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/C
+ dv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////6+3i/5mn
+ b/+SoWX/qLpy/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2IAAAAACvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+muHH/lqVn/5KhZf+SoWX/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////z9a8/5KhZf+bq2r/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du8AAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5Kh
+ Zf9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////rbmM/5KhZf+rvnT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2vwAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/f3dX/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv++zZD/+vv2////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////k6Nn/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAACvwnZAr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/393
+ V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv++zZD/+vv2////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////+tuYz/na1r/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/CdkAAAAAAAAAAAAAAAACvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+ounL/malp/5Kh
+ Zf+SoWX/kqFl/5KhZf+SoWX/kqFl/4iMXv93ZlL/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+suYX/+Pn1////////////////////////////////////////////////////
+ ////////////////////////+vv2/9zkw//I1aH/w9GY/8PRmP/I1aH/3OTD//r79v//////////////
+ /////////////////////////////////////////////////////////////93iz/+Xp2j/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/AAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+rvnT/na1r/5KhZf+SoWX/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6CteP//////////////
+ /////////////////////////////////////////////////////////////+HozP+0xn//r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/tMZ//+HozP//////////////////////////////////////////////
+ /////////////////////////////6CteP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdr8AAAAAAAAAAAAAAAAAAAAAr8J2cK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/q750/5KhZf+SoWX/kqFl/5Kh
+ Zf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/u8Sf////////////////////////////////////////////////////
+ ///////////////////N2an/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf//////////////////////////////////////////////////////////////////////u8Sf/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2cAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+drWv/kqFl/5KhZf+SoWX/kqFl/4qQYP97blX/c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/+ZnGf/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/W3MX/////////
+ ////////////////////////////////////////////////////////4ejM/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ ///////////////////////////////////W3MX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+SoWX/kqFl/4qQ
+ YP97blX/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//mZxn/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/q750/+vt4v//////////////////////////////////////////////
+ //////////////r79v+0xn//r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf///////////////////////////////////////////////////////////+vt
+ 4v+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/46ZYv9/d1f/c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/5mcZ/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/////////
+ ////////////////////////////////////////////////////////3OTD/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ /////////////////////////////////////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZwAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2IK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+OmWL/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+Kg17/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv//////////////////////////////////////////////
+ ///////////////////BzZ3/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////////////////////
+ ////////r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2r6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/393V/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/6i1cf+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////
+ /////////////////////////////////////////////////////////////6+7jf+twHX/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf////////////////////////////////////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+5yof/////////////////////////////////////////
+ ////////////////////////rbmM/52ta/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////////////
+ /////////////6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbfr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv////////////////////////////////////////////////////////////////+0vpX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdnCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/qLpy/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2////////////////////////////////////
+ /////////////////////////////8/WvP+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////
+ //////////////////+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+ZqWn/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/8PTl////////////////////////////////////////////////////////////+Pn1/5mn
+ b/+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf//////////////////////8PTl/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/prhx/5KhZf+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/h6Mz/////////////////////////
+ ////////////////////////////////////////1tzF/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Z
+ qf/////////////////h6Mz/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnYQr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+WpWf/kqFl/3tuVf9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/83Zqf///////////83Zqf+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaAr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/52ta/+KkGD/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/83Zqf//////tMZ//6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/35yV/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/6u8dP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/5uzU////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/77NkP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2EAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+comr/c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/+RkGP/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/Cdr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/3tqVP9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//fnBW/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/r8N3/////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/AAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3Nd
+ T/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQ
+ Y/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/8PR
+ mP//////////////////////////////////////////////////////////////////////////////
+ ////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/CdiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3Nd
+ T/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2
+ cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAr8J2z6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/ioNe/3NdT/9zXU//c11P/3NdT/9zXU//c11P/3NdT/9zXU//d2NR/5GQY/+rvHT/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/tMZ///D05f//////////////////////////////////////////////////////////////
+ ////////////////////////u8Sf/5KhZf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J276/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/3Nd
+ T/9zXU//d2NR/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///r79v//////////////
+ ////////////////////////////////////////////////////////////////////////u8Sf/5Kh
+ Zf+SoWX/kqFl/6S2cP+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZgr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/ioNe/3NdT/9zXU//c11P/5GQY/+rvHT/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/vs2Q//r79v//////////////////////////////////////////////
+ ////////////////////////////////////////u8Sf/5KhZf+SoWX/kqFl/6q8c/+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/jYlg/4qD
+ Xv+otXH/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ///D0
+ 5f//////////////////////////////////////////////////////////////////////////////
+ ////////wMqi/6S2cP+twHX/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdo8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/tMZ//9zkw///////////////////////////////
+ ////////////////////////////////////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ dhCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/8PRmP/r8N3/////////////////////////////////////////////////////////
+ ////////////////////////zdmp/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J236/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv/D0Zj/5uzU////
+ ////////////////////////////////////////////////////////////////////////vs2Q/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ du+vwnYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/ucqH/83Zqf/h6Mz/8PTl////////////////////
+ //////////////D05f/h6Mz/zdmp/7TGf/+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ djAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdmCvwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/C
+ djCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2MAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdjCvwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/CdjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdjCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdt+vwnYwAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdhCvwnbPr8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbPr8J2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnaPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2jwAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AACvwnZgr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J276/CdmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2z6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnYgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAr8J2gK/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dr+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwna/r8J2IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK/CdlCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbfr8J2UAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAK/CdhCvwnaAr8J276/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYQr8J2gK/C
+ du+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnbvr8J2gK/CdhAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2EK/CdnCvwnbfr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnbfr8J2cK/CdhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnZQr8J2r6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnavr8J2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr8J2IK/C
+ dnCvwnbPr8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cds+vwnZwr8J2IAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnYgr8J2cK/Cdr+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2v6/CdnCvwnYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACvwnZAr8J2gK/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J276/Cdr+vwnaAr8J2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAACvwnYgr8J2QK/CdoCvwnaPr8J2v6/Cdr+vwnbvr8J2/6/Cdv+vwnb/r8J2/6/C
+ dv+vwnb/r8J2/6/Cdv+vwnb/r8J2/6/Cdu+vwna/r8J2v6/Cdo+vwnaAr8J2QK/CdiAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////////8AAAD////////////////wAAAAD///////////////AAAAAA
+ D/////////////+AAAAAAAH////////////+AAAAAAAAf///////////8AAAAAAAAA///////////8AA
+ AAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////////+AAAAAAAAAAAH///////
+ //AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////gAAAAAAAAAAAAf///////wAAAAAAAAAAAAD/
+ //////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAAAAAAAAAP/////+AAAAAAAAAA
+ AAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAAAAAAAAAAAAAAAP////4AAAAA
+ AAAAAAAAAAB////8AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///w
+ AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//+AAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAA
+ A///gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAP/+AAAAAAAAAAAA
+ AAAAAAB//gAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAA/+AAAAAAA
+ AAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAD/AA
+ AAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAAAAAAAAH4AAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAAAAAAAAA
+ AAfAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAA
+ AAAAAAADgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAA
+ AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAA
+ AAAAAAABgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAADwAAAAAAA
+ AAAAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAB+AA
+ AAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAA
+ AA/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAA
+ AAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH/+AAAAAAAAAAAAAAAAAAB//wAAAAAA
+ AAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAD///g
+ AAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAAAAAAAP///4AAAAAAAAAAAAAAAA
+ H////AAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAAA////+AAAAAAAAAAAAAAAAf////wAAAAAAAAAA
+ AAAAAP////+AAAAAAAAAAAAAAAH/////wAAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAB//////wAAAA
+ AAAAAAAAAA//////+AAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAP///////AAAAAAAAAAAAAP//////
+ /4AAAAAAAAAAAAH////////AAAAAAAAAAAAD////////8AAAAAAAAAAAD/////////gAAAAAAAAAAB//
+ ///////+AAAAAAAAAAB//////////wAAAAAAAAAA///////////AAAAAAAAAA///////////8AAAAAAA
+ AA////////////4AAAAAAAB/////////////gAAAAAAB//////////////AAAAAAD///////////////
+ AAAAAP////////////////AAAA////////8=
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Program.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Program.cs
new file mode 100644
index 0000000..2836caf
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Program.cs
@@ -0,0 +1,22 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace DM_CalibrationTools
+{
+ static class Program
+ {
+ ///
+ /// 搴旂敤绋嬪簭鐨勪富鍏ュ彛鐐广
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new MainForms());
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/AssemblyInfo.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..cc36887
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+锘縰sing System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 鏈夊叧绋嬪簭闆嗙殑甯歌淇℃伅閫氳繃浠ヤ笅
+// 鐗规ч泦鎺у埗銆傛洿鏀硅繖浜涚壒鎬у煎彲淇敼
+// 涓庣▼搴忛泦鍏宠仈鐨勪俊鎭
+[assembly: AssemblyTitle("DM_CalibrationTools")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("DM_CalibrationTools")]
+[assembly: AssemblyCopyright("Copyright 漏 Microsoft 2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 灏 ComVisible 璁剧疆涓 false 浣挎绋嬪簭闆嗕腑鐨勭被鍨
+// 瀵 COM 缁勪欢涓嶅彲瑙併 濡傛灉闇瑕佷粠 COM 璁块棶姝ょ▼搴忛泦涓殑绫诲瀷锛
+// 鍒欏皢璇ョ被鍨嬩笂鐨 ComVisible 鐗规ц缃负 true銆
+[assembly: ComVisible(false)]
+
+// 濡傛灉姝ら」鐩悜 COM 鍏紑锛屽垯涓嬪垪 GUID 鐢ㄤ簬绫诲瀷搴撶殑 ID
+[assembly: Guid("a6d4a950-c32d-4c5e-be41-7d489806fe28")]
+
+// 绋嬪簭闆嗙殑鐗堟湰淇℃伅鐢变笅闈㈠洓涓肩粍鎴:
+//
+// 涓荤増鏈
+// 娆$増鏈
+// 鐢熸垚鍙
+// 淇鍙
+//
+// 鍙互鎸囧畾鎵鏈夎繖浜涘硷紝涔熷彲浠ヤ娇鐢ㄢ滅敓鎴愬彿鈥濆拰鈥滀慨璁㈠彿鈥濈殑榛樿鍊硷紝
+// 鏂规硶鏄寜濡備笅鎵绀轰娇鐢ㄢ*鈥:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Resources.Designer.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..3d05a4e
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Resources.Designer.cs
@@ -0,0 +1,253 @@
+锘//------------------------------------------------------------------------------
+//
+// 姝や唬鐮佺敱宸ュ叿鐢熸垚銆
+// 杩愯鏃剁増鏈:4.0.30319.42000
+//
+// 瀵规鏂囦欢鐨勬洿鏀瑰彲鑳戒細瀵艰嚧涓嶆纭殑琛屼负锛屽苟涓斿鏋
+// 閲嶆柊鐢熸垚浠g爜锛岃繖浜涙洿鏀瑰皢浼氫涪澶便
+//
+//------------------------------------------------------------------------------
+
+namespace DM_CalibrationTools.Properties {
+ using System;
+
+
+ ///
+ /// 涓涓己绫诲瀷鐨勮祫婧愮被锛岀敤浜庢煡鎵炬湰鍦板寲鐨勫瓧绗︿覆绛夈
+ ///
+ // 姝ょ被鏄敱 StronglyTypedResourceBuilder
+ // 绫婚氳繃绫讳技浜 ResGen 鎴 Visual Studio 鐨勫伐鍏疯嚜鍔ㄧ敓鎴愮殑銆
+ // 鑻ヨ娣诲姞鎴栫Щ闄ゆ垚鍛橈紝璇风紪杈 .ResX 鏂囦欢锛岀劧鍚庨噸鏂拌繍琛 ResGen
+ // (浠 /str 浣滀负鍛戒护閫夐」)锛屾垨閲嶆柊鐢熸垚 VS 椤圭洰銆
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 杩斿洖姝ょ被浣跨敤鐨勭紦瀛樼殑 ResourceManager 瀹炰緥銆
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DM_CalibrationTools.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 浣跨敤姝ゅ己绫诲瀷璧勬簮绫伙紝涓烘墍鏈夎祫婧愭煡鎵
+ /// 閲嶅啓褰撳墠绾跨▼鐨 CurrentUICulture 灞炴с
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap _3d_32px {
+ get {
+ object obj = ResourceManager.GetObject("3d_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap btn_close_18px_1 {
+ get {
+ object obj = ResourceManager.GetObject("btn_close_18px_1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap btn_mini_18px_1 {
+ get {
+ object obj = ResourceManager.GetObject("btn_mini_18px_1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap btn_setting_18px_1 {
+ get {
+ object obj = ResourceManager.GetObject("btn_setting_18px_1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap cancel_24px {
+ get {
+ object obj = ResourceManager.GetObject("cancel_24px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap download_48px {
+ get {
+ object obj = ResourceManager.GetObject("download_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap earth_grid_32px {
+ get {
+ object obj = ResourceManager.GetObject("earth_grid_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap help_48px {
+ get {
+ object obj = ResourceManager.GetObject("help_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap home_48px {
+ get {
+ object obj = ResourceManager.GetObject("home_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap link_48px {
+ get {
+ object obj = ResourceManager.GetObject("link_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap pose_32px {
+ get {
+ object obj = ResourceManager.GetObject("pose_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap question_32px {
+ get {
+ object obj = ResourceManager.GetObject("question_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap question_48px {
+ get {
+ object obj = ResourceManager.GetObject("question_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap refresh_32px {
+ get {
+ object obj = ResourceManager.GetObject("refresh_32px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap refresh_32px1 {
+ get {
+ object obj = ResourceManager.GetObject("refresh_32px1", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap settings_48px {
+ get {
+ object obj = ResourceManager.GetObject("settings_48px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap test {
+ get {
+ object obj = ResourceManager.GetObject("test", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap tools {
+ get {
+ object obj = ResourceManager.GetObject("tools", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// 鏌ユ壘 System.Drawing.Bitmap 绫诲瀷鐨勬湰鍦板寲璧勬簮銆
+ ///
+ internal static System.Drawing.Bitmap usb_783px {
+ get {
+ object obj = ResourceManager.GetObject("usb_783px", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Resources.resx b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Resources.resx
new file mode 100644
index 0000000..d96163e
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Resources.resx
@@ -0,0 +1,178 @@
+锘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Resource\btn_setting_18px_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\3d_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\btn_mini_18px_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\tools.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\question_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\usb_783px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\settings_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\question_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\pose_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\help_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\home_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\btn_close_18px_1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\test.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\cancel_24px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\earth_grid_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\refresh_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\link_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\download_48px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resource\refresh_32px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Settings.Designer.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..2b60f3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+锘//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.36415
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace DM_CalibrationTools.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Settings.settings b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Properties/Settings.settings
@@ -0,0 +1,7 @@
+锘
+
+
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/3d_256px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/3d_256px.png
new file mode 100644
index 0000000..b0e3d04
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/3d_256px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/3d_32px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/3d_32px.png
new file mode 100644
index 0000000..b701ace
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/3d_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/add_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/add_48px.png
new file mode 100644
index 0000000..502ff87
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/add_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/adjustment_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/adjustment_48px.png
new file mode 100644
index 0000000..e73fead
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/adjustment_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/adjustment_logo.ico b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/adjustment_logo.ico
new file mode 100644
index 0000000..315fcaa
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/adjustment_logo.ico differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_Add.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_Add.png
new file mode 100644
index 0000000..257c791
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_Add.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_1.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_1.png
new file mode 100644
index 0000000..5724899
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_1.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_2.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_2.png
new file mode 100644
index 0000000..0ca1482
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_2.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_3.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_3.png
new file mode 100644
index 0000000..2f21702
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_close_18px_3.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_1.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_1.png
new file mode 100644
index 0000000..6fe4747
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_1.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_2.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_2.png
new file mode 100644
index 0000000..00dc5f1
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_2.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_3.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_3.png
new file mode 100644
index 0000000..2c4e583
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_mini_18px_3.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_1.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_1.png
new file mode 100644
index 0000000..f0bda5b
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_1.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_2.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_2.png
new file mode 100644
index 0000000..5583789
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_2.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_3.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_3.png
new file mode 100644
index 0000000..3272a2b
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/btn_setting_18px_3.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/cancel_24px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/cancel_24px.png
new file mode 100644
index 0000000..d78a102
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/cancel_24px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/download_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/download_48px.png
new file mode 100644
index 0000000..18c64e6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/download_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/earth_grid_32px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/earth_grid_32px.png
new file mode 100644
index 0000000..f3fa008
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/earth_grid_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/help_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/help_48px.png
new file mode 100644
index 0000000..bd2f8cf
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/help_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/home_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/home_48px.png
new file mode 100644
index 0000000..08b2734
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/home_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/link_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/link_48px.png
new file mode 100644
index 0000000..d4705a6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/link_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/main_light_bkg_top123.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/main_light_bkg_top123.png
new file mode 100644
index 0000000..43b1190
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/main_light_bkg_top123.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_32px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_32px.png
new file mode 100644
index 0000000..a430360
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_48px - 鍓湰.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_48px - 鍓湰.png
new file mode 100644
index 0000000..7bbcdca
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_48px - 鍓湰.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_48px.png
new file mode 100644
index 0000000..7bbcdca
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/ouput_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/photo_32px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/photo_32px.png
new file mode 100644
index 0000000..004efe5
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/photo_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/photo_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/photo_48px.png
new file mode 100644
index 0000000..544c0f0
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/photo_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/pose_256px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/pose_256px.png
new file mode 100644
index 0000000..274cd58
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/pose_256px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/pose_32px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/pose_32px.png
new file mode 100644
index 0000000..642afaf
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/pose_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/question_32px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/question_32px.png
new file mode 100644
index 0000000..a1ca84d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/question_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/question_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/question_48px.png
new file mode 100644
index 0000000..7e88982
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/question_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/refresh_32px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/refresh_32px.png
new file mode 100644
index 0000000..7a660e2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/refresh_32px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/refresh_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/refresh_48px.png
new file mode 100644
index 0000000..e47d826
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/refresh_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/render_set_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/render_set_48px.png
new file mode 100644
index 0000000..766ad04
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/render_set_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/settings_48px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/settings_48px.png
new file mode 100644
index 0000000..a652dc3
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/settings_48px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/test.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/test.png
new file mode 100644
index 0000000..79f3d5d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/test.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/tools.ico b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/tools.ico
new file mode 100644
index 0000000..4bb026f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/tools.ico differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/usb_783px.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/usb_783px.png
new file mode 100644
index 0000000..33e0110
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/Resource/usb_783px.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..9564e24
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..b76277a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe
new file mode 100644
index 0000000..8c84517
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.config b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.manifest b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.manifest
new file mode 100644
index 0000000..061c9ca
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM_CalibrationTools.vshost.exe.manifest
@@ -0,0 +1,11 @@
+锘
+
+
+
+
+
+
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf
new file mode 100644
index 0000000..cbdb8d4
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/DM涓婁綅鏈烘牎鍑嗚蒋浠惰鏄.pdf
@@ -0,0 +1,72 @@
+ 鐢电绁炴妧 DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+ DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+ Version 1.0
+ By JustFeng @2017-10-23 16:40:16
+
+杩炴帴浼犳劅鍣
+
+ 1. 灏 DM9 杞翠紶鎰熷櫒鏉垮瓙閫氳繃 USB 杩炴帴鑷崇數鑴戯紝骞跺皢鏉垮瓙涓婄殑鐢垫簮寮鍏虫嫧鍚 Micro-USB
+ 鍙f柟鍚戙
+
+2. 鍙屽嚮杩愯杞欢 鐣岄潰濡備笅鍥炬墍绀
+
+鏌ョ湅杩炴帴鐘舵
+
+ 宸︿笅瑙掓樉绀鸿繛鎺ョ姸鎬侊細濡傛灉妯″潡姝e父杩炴帴鍒欐樉绀衡濆凡杩炴帴鈥濓紱鍙嶄箣濡傛灉妯″潡鏈繛鍒欎細鏄剧ず鈥
+ 鏈繛鎺モ濓紝涓斿ぇ閮ㄥ垎鍔熻兘灏嗗浜庝笉鍙敤鐘舵併
+
+鑾峰彇鏍″噯鏁版嵁
+
+鍗曞嚮 鎸夐挳鍙鍙栭檧铻轰华鏍″噯鍊煎拰纾佸姏璁℃牎鍑嗗硷紝骞舵樉绀哄湪鍙充晶銆
+
+閲嶇疆鏍″噯鏁版嵁
+
+鍗曞嚮 鎸夐挳灏嗕細涓嶅彲閫嗙殑娓呴櫎纾佸姏璁℃牎鍑嗘暟鎹紝鍙兘閫氳繃纾佸姏璁℃牎鍑嗙殑鏂瑰紡閲嶆柊鍐
+ 鐢电绁炴妧 DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+鍏ユ牎鍑嗘暟鎹
+
+鏍″噯闄铻轰华
+
+鍗曞嚮 鎸夐挳鍙牎鍑嗛檧铻轰华闈欐佸亸绉汇傝杩囩▼闇瑕佷繚鎸佹ā鍧楅潤姝笉鍔紝鍚﹀垯鏍″噯鍚
+
+闈欐佹紓绉诲皢浼氭洿澶с
+
+鏍″噯纾佸姏璁
+
+鍗曞嚮 鎸夐挳鍗冲彲杩涘叆纾佸姏璁℃牎鍑嗙姸鎬侊紝璇ョ姸鎬佷笅锛岄渶瑕佺敤鎴锋寜涓嬪浘 a 鏂瑰紡鐢╃┖
+
+闂 8 瀛楋紝鍚屾椂 3D 鏄剧ず浼氬疄鏃剁粯鍒跺嚭褰撳墠绌洪棿纾佸満鐨勬暎鐐瑰浘锛岃灏介噺璁╂暎鐐瑰浘鐪嬭捣鏉ュ儚
+
+涓涓腑蹇冧笉鍦ㄥ渾鐐圭殑妞悆浣擄紝渚嬪涓嬪浘 b 鎵绀恒傚緟瀹屾垚涓婃鎿嶄綔鍗曞嚮 鎸夐挳璁
+
+绠楀苟鍐欏叆纾佸姏璁℃牎鍑嗗笺
+
+ (a) (b)
+
+缁樺埗纾佸姏璁″師濮嬫暟鎹殑鏁g偣鍥
+
+榛樿鐘舵佷负鏄剧ず瑙g畻濮挎侊紝濡傞渶鏌ョ湅涔嬪墠鐨勭鍔涜鏁g偣鍥撅紝鍙崟鍑 鎸夐挳锛
+3D 鏄剧ず涓細鑷姩鍔犺浇涓婃纾佸姏璁¢噰鏍峰煎苟缁樺埗鍘熷鏁g偣鍥俱傛寜閽細鍙樹负 銆
+
+缁樺埗纾佸姏璁℃牎鍑嗗悗鐨勬暎鐐瑰浘
+
+鍗曞嚮 鎸夐挳,鍙煡鐪嬬粡杩囨き鐞冩嫙鍚堜箣鍚庣殑鐞冨舰纾佸姏璁℃暎鐐瑰浘銆傚涓嬪浘鎵绀
+ 鐢电绁炴妧 DM9 杞翠紶鎰熷櫒鏍″噯杞欢璇存槑
+
+鏄剧ず濮挎 鎸夐挳鍙垏鎹㈣嚦鏄剧ず濮挎佹ā寮忋
+
+鍗曞嚮
+
+鍏朵粬
+
+ 鍙﹀鍏充簬 3D 鏄剧ず鍣ㄥ尯鍩熺殑鎿嶄綔:
+ 鎸変綇榧犳爣宸﹂敭鎷栧姩锛屽彲鏃嬭浆瑙嗗浘锛
+ 鎸変綇榧犳爣鍙抽敭鎷栧姩锛屾垨婊氬姩榧犳爣婊氳疆锛屽彲缂╂斁瑙嗗浘锛
+ 鍙屽嚮榧犳爣婊氳疆锛屽彲杩樺師榛樿瑙嗗浘锛
+ 鎸変綇 Ctrl 閿拰榧犳爣宸﹂敭骞舵嫋鍔紝鍙Щ鍔ㄨ鍥撅紱
+
+娆㈣繋璁块棶鐢电绁炴妧娣樺疂搴:https://shop408976235.taobao.com
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/Magnet Data.txt b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/Magnet Data.txt
new file mode 100644
index 0000000..196b239
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/Magnet Data.txt
@@ -0,0 +1,1237 @@
+-86 -521 46
+-85 -522 46
+-86 -521 50
+-87 -520 50
+-89 -518 50
+-85 -521 44
+-85 -523 45
+-86 -522 46
+-87 -520 48
+-84 -519 46
+-86 -519 48
+-82 -524 46
+-83 -515 52
+-82 -520 54
+-80 -516 52
+-79 -520 52
+-82 -520 51
+-84 -518 52
+-80 -518 56
+-83 -522 51
+-83 -520 48
+-78 -519 47
+-84 -519 50
+-82 -521 50
+-79 -520 51
+-79 -518 54
+-77 -521 53
+-76 -522 50
+-77 -522 55
+-73 -520 55
+-77 -516 53
+-76 -517 54
+-74 -519 55
+-75 -519 57
+-77 -519 58
+-76 -516 63
+-73 -519 56
+-70 -514 60
+-71 -517 59
+-73 -516 60
+-72 -518 59
+-71 -519 53
+-72 -523 53
+-72 -520 56
+-72 -518 57
+-71 -521 59
+-70 -520 56
+-72 -521 60
+-76 -521 58
+-72 -519 60
+-71 -519 65
+-68 -517 66
+-68 -518 60
+-66 -518 59
+-64 -519 59
+-64 -513 62
+-60 -514 63
+-60 -511 69
+-55 -512 66
+-57 -511 66
+-57 -513 67
+-51 -512 69
+-51 -512 69
+-56 -511 71
+-52 -509 75
+-51 -508 73
+-51 -508 73
+-41 -507 78
+-40 -506 77
+-40 -504 77
+-40 -504 77
+-32 -504 78
+-33 -504 77
+-33 -500 84
+-37 -503 85
+-38 -501 81
+-41 -502 88
+-47 -502 88
+-47 -502 88
+-48 -501 93
+-47 -500 92
+-47 -499 88
+-44 -500 92
+-44 -500 96
+-46 -496 101
+-47 -491 118
+-44 -493 116
+-45 -490 119
+-39 -488 119
+-34 -486 124
+-33 -486 121
+-31 -482 127
+-35 -481 128
+-49 -486 133
+-76 -488 139
+-85 -492 142
+-86 -492 142
+-95 -492 144
+-96 -492 144
+-99 -494 142
+-108 -495 140
+-112 -497 140
+-115 -498 138
+-113 -498 139
+-116 -495 138
+-111 -491 141
+-106 -494 137
+-103 -496 138
+-100 -496 132
+-100 -497 131
+-100 -501 129
+-107 -504 118
+-125 -515 103
+-125 -515 103
+-132 -515 92
+-151 -520 78
+-159 -524 60
+-159 -524 60
+-171 -523 54
+-187 -522 49
+-210 -522 26
+-224 -519 4
+-230 -514 -5
+-259 -500 -48
+-264 -500 -58
+-270 -498 -64
+-266 -491 -91
+-264 -489 -102
+-266 -482 -110
+-274 -474 -115
+-282 -464 -131
+-285 -461 -135
+-289 -454 -134
+-288 -452 -134
+-297 -452 -130
+-295 -451 -134
+-291 -450 -138
+-293 -447 -135
+-290 -456 -129
+-291 -461 -115
+-288 -466 -107
+-293 -478 -72
+-292 -489 -52
+-288 -488 -29
+-289 -496 -2
+-269 -500 48
+-251 -502 72
+-235 -500 95
+-216 -499 112
+-181 -488 141
+-165 -486 154
+-147 -483 167
+-113 -475 179
+-86 -464 188
+-70 -461 186
+-70 -461 186
+-28 -449 178
+-23 -448 171
+-16 -447 168
+-10 -450 161
+-5 -454 158
+-3 -454 158
+0 -452 149
+0 -449 155
+0 -449 155
+1 -448 155
+0 -448 160
+-1 -447 159
+0 -445 160
+4 -439 164
+4 -441 170
+9 -426 183
+9 -426 190
+9 -426 190
+5 -417 192
+1 -410 204
+1 -410 204
+-9 -397 220
+-9 -397 220
+-23 -383 240
+-23 -383 240
+-35 -379 252
+-52 -380 253
+-88 -374 260
+-88 -374 263
+-128 -375 263
+-144 -379 259
+-184 -388 252
+-184 -388 252
+-226 -406 226
+-242 -412 212
+-259 -430 191
+-259 -430 191
+-269 -451 163
+-264 -460 146
+-257 -486 115
+-246 -499 92
+-237 -507 76
+-228 -514 62
+-188 -532 29
+-175 -533 16
+-158 -532 5
+-120 -529 -48
+-120 -529 -48
+-120 -529 -64
+-121 -527 -81
+-120 -518 -99
+-127 -516 -116
+-134 -512 -125
+-145 -507 -136
+-176 -499 -144
+-176 -499 -144
+-190 -497 -145
+-204 -499 -142
+-252 -497 -123
+-252 -497 -123
+-264 -496 -113
+-278 -493 -104
+-311 -484 -55
+-311 -484 -55
+-322 -485 -35
+-328 -485 13
+-315 -487 51
+-315 -487 51
+-304 -486 76
+-284 -484 111
+-257 -491 134
+-257 -491 134
+-235 -486 144
+-193 -490 158
+-158 -496 162
+-131 -495 159
+-119 -494 159
+-91 -496 141
+-91 -496 141
+-65 -493 132
+-55 -491 130
+-33 -492 120
+-6 -480 107
+3 -482 103
+32 -459 96
+38 -453 95
+67 -430 96
+68 -431 103
+78 -414 107
+80 -408 115
+85 -398 127
+85 -398 127
+79 -399 130
+78 -397 132
+74 -389 147
+68 -387 155
+47 -389 185
+43 -389 187
+21 -393 203
+12 -398 200
+0 -405 208
+-18 -406 210
+-38 -413 221
+-52 -418 217
+-56 -423 220
+-71 -429 225
+-101 -437 222
+-107 -439 215
+-124 -442 213
+-124 -442 213
+-133 -446 212
+-147 -454 205
+-172 -459 198
+-186 -471 187
+-193 -474 177
+-206 -488 152
+-210 -496 140
+-215 -500 126
+-216 -513 83
+-208 -518 73
+-202 -522 64
+-182 -532 2
+-178 -533 -14
+-165 -526 -59
+-162 -524 -70
+-164 -522 -82
+-172 -506 -122
+-179 -500 -128
+-188 -496 -139
+-228 -486 -139
+-244 -481 -139
+-258 -480 -137
+-296 -471 -111
+-309 -468 -104
+-320 -470 -89
+-344 -459 -40
+-352 -457 -26
+-358 -454 -7
+-347 -455 70
+-337 -454 96
+-328 -455 115
+-264 -454 178
+-235 -450 189
+-217 -452 202
+-145 -453 211
+-128 -454 212
+-111 -457 205
+-71 -461 190
+-61 -464 188
+-51 -462 177
+-23 -467 153
+-11 -468 141
+3 -465 128
+30 -468 96
+35 -470 78
+44 -461 64
+70 -449 25
+68 -449 18
+74 -444 3
+88 -427 -41
+91 -419 -47
+91 -419 -47
+92 -416 -50
+102 -401 -59
+106 -398 -61
+107 -399 -56
+116 -389 -36
+115 -387 -30
+121 -388 -15
+128 -379 31
+123 -374 52
+119 -377 65
+107 -387 104
+99 -387 116
+92 -390 126
+74 -397 143
+67 -399 153
+57 -406 163
+21 -425 166
+21 -425 166
+18 -432 162
+6 -446 158
+4 -448 157
+-3 -453 153
+-4 -462 145
+-11 -474 133
+-11 -475 132
+-16 -482 124
+-10 -481 124
+-16 -482 121
+-22 -489 120
+-26 -490 122
+-26 -489 121
+-38 -498 119
+-44 -501 117
+-51 -499 114
+-56 -505 107
+-56 -504 108
+-61 -506 103
+-69 -513 100
+-71 -516 105
+-69 -514 97
+-74 -513 93
+-67 -517 95
+-69 -514 88
+-61 -515 75
+-56 -517 75
+-47 -515 71
+-35 -514 53
+-38 -516 49
+-36 -518 45
+-37 -521 29
+-37 -521 29
+-41 -523 17
+-55 -525 -3
+-60 -528 -2
+-75 -529 -13
+-82 -529 -12
+-116 -538 -16
+-125 -536 -19
+-141 -540 -3
+-147 -537 -3
+-158 -539 6
+-157 -538 9
+-165 -540 19
+-169 -536 19
+-171 -540 25
+-170 -538 37
+-170 -534 39
+-173 -539 41
+-169 -530 59
+-171 -536 62
+-161 -528 83
+-161 -528 83
+-158 -526 87
+-150 -521 99
+-150 -521 99
+-146 -523 105
+-133 -516 115
+-124 -515 117
+-116 -513 125
+-116 -513 125
+-110 -515 132
+-96 -510 132
+-96 -510 132
+-84 -504 139
+-73 -499 147
+-73 -499 147
+-68 -498 145
+-51 -492 147
+-51 -492 147
+-43 -489 151
+-22 -483 152
+-22 -483 152
+-11 -482 141
+6 -475 135
+6 -475 135
+15 -469 137
+32 -467 127
+38 -464 123
+44 -459 117
+63 -461 101
+67 -458 102
+72 -455 97
+82 -446 78
+91 -444 73
+89 -447 71
+97 -437 58
+104 -439 52
+106 -434 40
+115 -432 29
+115 -432 29
+113 -431 20
+117 -428 3
+117 -428 3
+117 -428 3
+125 -418 -13
+125 -418 -13
+127 -421 -15
+133 -415 -15
+133 -415 -15
+134 -410 -18
+128 -409 -9
+128 -409 -9
+130 -415 -5
+124 -415 22
+124 -415 22
+120 -418 35
+107 -425 74
+107 -425 74
+102 -428 82
+86 -430 113
+86 -430 113
+67 -435 133
+43 -440 156
+43 -440 156
+27 -440 171
+1 -448 188
+1 -448 188
+-14 -447 194
+-43 -452 204
+-54 -456 204
+-54 -456 204
+-80 -457 211
+-93 -459 209
+-97 -463 209
+-119 -468 196
+-120 -469 203
+-130 -470 202
+-149 -472 203
+-154 -472 201
+-162 -479 196
+-176 -485 183
+-181 -483 180
+-192 -488 175
+-216 -489 157
+-216 -489 157
+-223 -495 154
+-240 -504 122
+-240 -504 122
+-242 -508 117
+-250 -514 84
+-248 -516 79
+-258 -522 54
+-258 -522 54
+-258 -522 49
+-250 -527 12
+-250 -527 12
+-248 -529 5
+-244 -533 -29
+-232 -530 -62
+-227 -530 -68
+-201 -534 -90
+-196 -532 -97
+-161 -528 -115
+-128 -529 -121
+-94 -522 -115
+-66 -519 -108
+-47 -519 -94
+-66 -517 -121
+-114 -515 -142
+-125 -515 -147
+-142 -516 -146
+-137 -515 -144
+-140 -517 -146
+-147 -514 -141
+-146 -518 -145
+-146 -515 -139
+-151 -519 -135
+-148 -526 -129
+-143 -523 -122
+-130 -518 -127
+-122 -518 -131
+-112 -515 -140
+-107 -510 -140
+-107 -510 -140
+-97 -513 -132
+-97 -516 -130
+-84 -511 -131
+-75 -508 -131
+-39 -505 -115
+-32 -503 -109
+-3 -504 -90
+-2 -499 -81
+14 -497 -57
+13 -496 -55
+16 -498 -37
+20 -497 -37
+23 -501 -16
+19 -499 -13
+20 -503 -3
+18 -501 3
+13 -504 25
+11 -506 29
+10 -506 47
+10 -507 46
+-9 -505 59
+-11 -504 62
+-25 -509 72
+-27 -513 81
+-38 -518 92
+-41 -518 94
+-67 -516 104
+-80 -516 103
+-86 -522 101
+-95 -521 105
+-95 -521 105
+-112 -520 105
+-112 -520 105
+-117 -524 103
+-120 -522 104
+-140 -524 104
+-140 -524 104
+-144 -523 108
+-163 -527 107
+-169 -524 104
+-186 -525 94
+-189 -527 93
+-208 -522 82
+-215 -524 77
+-222 -522 58
+-228 -524 58
+-235 -522 39
+-238 -527 37
+-235 -527 23
+-237 -534 26
+-240 -529 8
+-243 -528 0
+-240 -528 -22
+-240 -528 -22
+-233 -527 -37
+-235 -527 -45
+-233 -526 -52
+-231 -531 -56
+-229 -526 -58
+-236 -526 -53
+-238 -525 -45
+-242 -527 -33
+-252 -527 -16
+-253 -523 -11
+-258 -524 9
+-254 -524 17
+-259 -522 38
+-245 -518 90
+-234 -511 110
+-223 -508 137
+-220 -506 140
+-214 -505 151
+-215 -506 151
+-202 -503 161
+-202 -503 161
+-181 -498 173
+-181 -498 173
+-154 -492 183
+-146 -490 186
+-118 -483 191
+-118 -483 191
+-67 -469 202
+-15 -455 184
+-15 -455 184
+5 -449 178
+41 -444 154
+48 -443 148
+74 -436 115
+78 -439 108
+98 -431 70
+112 -422 42
+114 -418 30
+114 -418 30
+122 -406 -37
+113 -400 -86
+88 -398 -133
+57 -397 -170
+50 -396 -178
+4 -399 -211
+-46 -399 -232
+-96 -402 -242
+-96 -402 -242
+-165 -408 -241
+-241 -416 -220
+-265 -423 -205
+-281 -420 -193
+-293 -422 -182
+-303 -421 -175
+-303 -421 -175
+-337 -421 -143
+-337 -421 -143
+-352 -421 -110
+-356 -420 -104
+-365 -418 -91
+-364 -416 -85
+-364 -416 -85
+-360 -418 -102
+-354 -423 -108
+-312 -419 -175
+-223 -417 -224
+-223 -417 -224
+-121 -406 -248
+-121 -406 -248
+-24 -386 -237
+-13 -383 -230
+21 -371 -220
+31 -370 -208
+63 -362 -191
+63 -362 -191
+118 -347 -133
+124 -344 -130
+131 -337 -121
+132 -325 -130
+124 -324 -145
+65 -320 -219
+40 -323 -239
+-58 -326 -272
+-58 -326 -272
+-83 -330 -279
+-194 -339 -274
+-194 -339 -274
+-266 -346 -247
+-266 -346 -247
+-311 -350 -213
+-328 -352 -193
+-328 -352 -193
+-342 -354 -177
+-345 -355 -177
+-359 -365 -148
+-359 -365 -148
+-358 -377 -132
+-361 -377 -132
+-357 -389 -129
+-357 -389 -129
+-359 -405 -106
+-359 -409 -109
+-350 -416 -104
+-350 -416 -104
+-350 -418 -99
+-351 -417 -103
+-348 -415 -103
+-352 -412 -104
+-350 -409 -118
+-350 -409 -118
+-346 -405 -132
+-346 -405 -132
+-323 -396 -165
+-323 -396 -165
+-292 -389 -198
+-292 -389 -198
+-264 -381 -219
+-264 -381 -219
+-238 -382 -235
+-238 -382 -235
+-216 -381 -231
+-212 -383 -239
+-159 -377 -252
+-144 -375 -255
+-116 -383 -250
+-112 -386 -250
+-51 -391 -239
+-45 -386 -232
+27 -390 -195
+27 -390 -195
+89 -388 -126
+89 -388 -126
+118 -391 -63
+127 -394 -12
+121 -399 49
+121 -399 49
+111 -401 99
+111 -401 99
+102 -404 121
+91 -399 146
+91 -399 146
+93 -389 146
+127 -384 88
+132 -382 59
+136 -376 -39
+136 -376 -39
+78 -382 -159
+-8 -393 -220
+-8 -393 -220
+-80 -409 -230
+-80 -409 -230
+-128 -426 -223
+-128 -426 -223
+-149 -447 -208
+-166 -476 -168
+-128 -494 -134
+-100 -510 -93
+-73 -510 -80
+-73 -510 -80
+-36 -498 -79
+-7 -489 -78
+31 -474 -49
+48 -469 -19
+62 -461 22
+67 -461 29
+59 -456 82
+47 -458 104
+27 -465 119
+5 -472 139
+-24 -480 153
+-59 -484 155
+-80 -487 162
+-98 -486 170
+-105 -487 176
+-55 -474 176
+-5 -453 165
+65 -434 131
+65 -434 131
+123 -404 1
+117 -398 -64
+53 -395 -169
+-30 -405 -227
+-97 -410 -234
+-146 -415 -237
+-160 -412 -234
+-212 -425 -220
+-237 -418 -214
+-272 -413 -197
+-294 -411 -186
+-306 -398 -186
+-306 -398 -186
+-306 -393 -189
+-278 -378 -220
+-278 -378 -220
+-170 -347 -272
+-170 -347 -272
+-46 -322 -266
+43 -306 -220
+126 -311 -122
+155 -324 -10
+129 -356 99
+32 -425 159
+9 -452 148
+-14 -481 113
+-24 -498 79
+-39 -506 76
+-33 -503 73
+-27 -504 63
+-22 -503 54
+-15 -504 40
+-5 -500 31
+-8 -502 23
+6 -499 6
+12 -494 -19
+8 -491 -45
+4 -495 -51
+-4 -491 -74
+-8 -491 -82
+-34 -493 -116
+-72 -492 -136
+-95 -493 -150
+-127 -487 -160
+-137 -486 -168
+-186 -473 -176
+-216 -447 -206
+-218 -437 -210
+-147 -380 -261
+-147 -380 -261
+-1 -330 -244
+141 -292 -126
+141 -292 -126
+168 -289 26
+154 -302 91
+114 -328 161
+114 -328 161
+84 -371 171
+64 -406 162
+75 -440 92
+72 -461 44
+64 -475 -20
+28 -486 -94
+-19 -489 -145
+-110 -498 -170
+-110 -498 -170
+-187 -516 -127
+-223 -531 -73
+-194 -543 -24
+-146 -550 -5
+-110 -543 -33
+-76 -532 -76
+-55 -502 -133
+-58 -471 -173
+-73 -439 -216
+-67 -396 -245
+0 -335 -249
+102 -299 -175
+169 -282 -15
+130 -308 152
+42 -342 236
+-61 -395 256
+-141 -457 210
+-143 -490 160
+-54 -524 65
+-35 -524 -1
+-58 -520 -93
+-127 -519 -120
+-176 -525 -108
+-223 -531 -57
+-228 -537 0
+-205 -535 54
+-170 -533 82
+-134 -531 87
+-91 -532 68
+-47 -526 35
+-32 -518 0
+11 -496 6
+38 -477 32
+42 -467 86
+31 -465 115
+4 -472 144
+-21 -476 157
+-54 -483 170
+-89 -491 175
+-89 -491 175
+-121 -494 176
+-125 -494 179
+-114 -490 183
+-58 -476 181
+-42 -477 180
+33 -455 138
+84 -440 69
+90 -440 -43
+50 -437 -131
+-11 -444 -176
+-63 -453 -190
+-93 -455 -201
+-133 -450 -208
+-157 -440 -216
+-171 -416 -233
+-66 -339 -267
+57 -274 -212
+161 -215 -68
+171 -200 22
+152 -209 126
+117 -251 189
+86 -324 196
+29 -417 174
+-61 -505 103
+-134 -529 14
+-191 -529 -35
+-246 -511 -61
+-285 -498 -59
+-298 -493 -59
+-312 -490 -51
+-326 -488 -29
+-315 -496 -3
+-292 -509 14
+-257 -521 13
+-187 -542 -7
+-129 -543 -23
+-86 -529 -36
+-53 -515 -64
+-22 -496 -94
+18 -466 -117
+54 -429 -127
+107 -385 -98
+150 -342 -45
+166 -304 28
+155 -286 103
+127 -289 170
+72 -305 223
+16 -336 253
+-31 -357 262
+-74 -391 259
+-121 -414 244
+-148 -432 233
+-158 -431 235
+-149 -413 252
+-64 -360 271
+37 -312 244
+124 -275 166
+170 -254 62
+175 -237 -34
+151 -225 -119
+95 -218 -208
+29 -217 -254
+-5 -218 -270
+-5 -200 -261
+7 -173 -256
+13 -144 -240
+29 -105 -218
+27 -88 -202
+18 -53 -189
+-10 -40 -187
+-37 -23 -184
+-57 -9 -177
+-70 0 -167
+-74 13 -151
+-91 22 -141
+-111 24 -142
+-133 24 -142
+-157 20 -145
+-161 18 -141
+-153 20 -130
+-148 24 -138
+-136 19 -146
+-140 10 -160
+-140 -3 -182
+-95 -26 -202
+-93 -57 -235
+-72 -96 -259
+-60 -137 -271
+-55 -172 -280
+-49 -201 -280
+-46 -225 -284
+-41 -236 -281
+-17 -245 -272
+17 -242 -255
+94 -231 -201
+162 -214 -82
+165 -216 74
+134 -229 151
+112 -234 187
+115 -227 186
+120 -217 180
+140 -205 144
+165 -186 73
+173 -181 -43
+141 -193 -138
+63 -229 -224
+-64 -275 -283
+-138 -311 -289
+-195 -341 -277
+-233 -361 -253
+-274 -393 -216
+-267 -425 -195
+-227 -461 -176
+-180 -471 -180
+-117 -468 -193
+-27 -454 -181
+24 -440 -169
+51 -430 -151
+39 -428 -159
+33 -424 -158
+43 -386 -180
+88 -342 -162
+152 -272 -89
+169 -222 65
+124 -231 180
+44 -274 251
+1 -389 224
+-11 -475 122
+23 -492 7
+23 -481 -64
+9 -466 -130
+-25 -457 -175
+-111 -467 -204
+-186 -490 -170
+-236 -511 -101
+-230 -530 -40
+-171 -542 -19
+-97 -533 -35
+12 -487 -62
+109 -410 -28
+155 -326 74
+115 -242 185
+40 -213 250
+-24 -216 283
+-63 -239 289
+-69 -257 292
+-50 -253 293
+53 -219 240
+114 -199 173
+169 -185 -8
+136 -195 -129
+28 -246 -250
+-77 -295 -282
+-198 -340 -270
+-260 -372 -234
+-288 -379 -213
+-284 -374 -219
+-201 -324 -273
+-3 -221 -257
+133 -164 -117
+149 -167 97
+84 -253 216
+43 -372 190
+5 -464 129
+-33 -513 17
+-5 -501 -38
+10 -483 -88
+-14 -490 -118
+-52 -511 -101
+-56 -523 -62
+-46 -523 -46
+-28 -517 -51
+-46 -496 -114
+-93 -483 -161
+-140 -472 -187
+-185 -441 -211
+-180 -383 -254
+21 -243 -247
+154 -153 -23
+115 -153 165
+-59 -235 290
+-128 -314 286
+-119 -428 220
+-146 -509 112
+-208 -521 29
+-247 -513 0
+-305 -492 19
+-331 -478 34
+-335 -472 47
+-290 -500 63
+-228 -526 69
+-156 -538 45
+-76 -532 28
+34 -482 46
+75 -418 123
+-51 -375 260
+-200 -366 266
+-327 -368 197
+-375 -406 92
+-358 -447 14
+-315 -485 23
+-226 -505 110
+-128 -485 163
+-63 -467 179
+21 -426 167
+88 -396 127
+135 -364 25
+122 -359 -83
+55 -387 -165
+4 -420 -180
+12 -461 -116
+59 -455 37
+85 -413 138
+55 -329 249
+-24 -232 302
+-99 -173 299
+-184 -131 270
+-291 -120 214
+-361 -145 153
+-394 -182 124
+-409 -263 127
+-382 -382 128
+-321 -459 104
+-239 -513 88
+-157 -528 79
+-50 -521 25
+34 -487 -7
+73 -438 -68
+44 -398 -178
+-89 -388 -260
+-239 -389 -245
+-354 -374 -167
+-400 -373 -86
+-411 -389 -1
+-376 -411 78
+-322 -450 112
+-302 -471 96
+-305 -471 99
+-338 -460 54
+-358 -427 -83
+-276 -390 -216
+-129 -345 -274
+38 -311 -227
+162 -313 -6
+104 -379 117
+7 -472 122
+-53 -520 55
+-62 -531 -25
+-89 -517 -113
+-138 -519 -134
+-179 -525 -116
+-207 -543 -16
+-161 -543 33
+-75 -537 15
+-67 -525 -54
+-94 -508 -122
+-116 -477 -180
+-78 -389 -248
+82 -260 -202
+171 -206 -11
+122 -223 180
+-7 -276 279
+-193 -388 258
+-256 -469 157
+-194 -514 110
+-110 -533 40
+-106 -532 -42
+-135 -535 -54
+-152 -537 1
+-110 -528 69
+-25 -503 67
+25 -483 -2
+17 -477 -82
+12 -443 -145
+48 -362 -199
+168 -231 -48
+139 -186 142
+-45 -201 285
+-203 -245 290
+-283 -307 252
+-199 -395 250
+-43 -479 151
+-33 -519 1
+-144 -532 -52
+-253 -521 -63
+-338 -487 -26
+-352 -469 50
+-298 -475 134
+-224 -500 148
+-127 -520 132
+-12 -507 60
+24 -490 -39
+36 -448 -129
+140 -332 -99
+160 -225 115
+11 -231 275
+-230 -333 269
+-335 -432 128
+-334 -473 -22
+-331 -449 -105
+-348 -396 -153
+-415 -333 96
+-180 -252 296
+125 -162 148
+171 -179 -35
+115 -253 -170
+82 -316 -185
+93 -369 -150
+130 -385 -42
+107 -397 108
+-8 -447 181
+-77 -479 175
+-113 -477 182
+-189 -481 173
+-241 -483 143
+-297 -487 82
+-314 -487 2
+-303 -495 -47
+-274 -516 -2
+-190 -529 92
+18 -473 145
+135 -408 31
+119 -386 -122
+66 -403 -161
+43 -439 -132
+44 -478 -5
+-20 -464 158
+-87 -412 244
+-171 -387 261
+-228 -395 246
+-259 -411 217
+-277 -431 186
+-281 -448 164
+-280 -462 151
+-283 -471 132
+-279 -476 123
+-290 -480 109
+-282 -480 107
+-282 -478 110
+-262 -478 135
+-218 -475 166
+-182 -483 166
+-127 -492 166
+-73 -501 130
+-42 -513 79
+-50 -530 35
+-69 -533 0
+-81 -539 -4
+-92 -543 -1
+-112 -542 10
+-123 -545 16
+-136 -544 4
+-141 -549 -5
+-155 -548 -4
+-152 -550 -11
+-153 -551 -1
+-151 -546 -13
+-148 -549 -7
+-145 -548 4
+-135 -551 5
+-127 -549 17
+-125 -546 20
+-127 -547 8
+-120 -550 2
+-114 -551 4
+-116 -547 0
+-120 -550 -20
+-117 -549 -57
+-112 -544 -81
+-109 -544 -77
+-99 -543 -79
+-68 -537 -79
+-58 -532 -82
+-52 -527 -79
+-44 -533 -80
+-44 -530 -71
+-37 -526 -70
+-35 -531 -70
+-40 -531 -71
+-35 -534 -65
+-37 -532 -54
+-38 -532 -56
+-35 -529 -58
+-35 -531 -55
+-34 -534 -62
+-29 -529 -61
+-33 -531 -61
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/data.txt b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/data.txt
new file mode 100644
index 0000000..bb5eed1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/data.txt
@@ -0,0 +1,1123 @@
+-350 -558 398
+-352 -557 401
+-354 -560 407
+-351 -562 405
+-354 -558 405
+-352 -559 401
+-350 -554 404
+-349 -558 400
+-349 -553 399
+-350 -553 399
+-348 -554 399
+-349 -551 400
+-346 -554 401
+-344 -553 404
+-348 -551 401
+-345 -551 404
+-347 -553 400
+-349 -554 406
+-349 -549 406
+-348 -551 412
+-350 -553 413
+-347 -550 418
+-347 -552 419
+-348 -550 421
+-349 -552 427
+-349 -554 430
+-348 -554 436
+-346 -550 439
+-344 -548 443
+-341 -549 447
+-340 -549 458
+-339 -550 466
+-341 -548 475
+-341 -548 475
+-343 -545 488
+-348 -547 496
+-358 -538 520
+-358 -538 520
+-363 -537 533
+-364 -535 544
+-357 -529 545
+-344 -527 546
+-336 -521 541
+-357 -518 571
+-392 -512 590
+-417 -507 601
+-435 -497 613
+-453 -490 624
+-476 -481 630
+-473 -478 627
+-458 -486 629
+-452 -487 630
+-455 -482 634
+-446 -489 624
+-440 -494 623
+-440 -495 618
+-453 -498 611
+-452 -496 609
+-462 -503 601
+-464 -504 599
+-487 -510 583
+-496 -509 568
+-503 -514 565
+-511 -514 554
+-521 -521 540
+-522 -517 534
+-520 -518 533
+-515 -523 521
+-511 -527 508
+-511 -527 508
+-500 -531 501
+-486 -538 500
+-458 -544 497
+-446 -544 493
+-440 -549 483
+-437 -550 475
+-430 -551 464
+-430 -551 464
+-423 -550 444
+-419 -548 438
+-411 -553 439
+-412 -551 441
+-413 -548 451
+-408 -547 456
+-380 -543 475
+-380 -543 475
+-339 -534 475
+-319 -526 464
+-286 -516 425
+-286 -516 425
+-266 -502 393
+-265 -494 368
+-261 -483 341
+-268 -472 314
+-277 -463 288
+-291 -452 267
+-320 -433 226
+-336 -425 215
+-356 -425 209
+-377 -415 200
+-412 -409 192
+-426 -402 191
+-439 -399 191
+-451 -399 193
+-466 -392 190
+-469 -389 185
+-469 -384 181
+-463 -385 183
+-440 -377 176
+-422 -379 174
+-396 -384 177
+-365 -382 186
+-301 -397 215
+-301 -397 215
+-245 -417 272
+-223 -426 315
+-213 -457 418
+-223 -467 469
+-250 -481 525
+-302 -492 574
+-502 -512 548
+-573 -512 455
+-599 -498 407
+-608 -471 335
+-595 -471 316
+-580 -467 292
+-559 -469 273
+-528 -468 257
+-477 -473 247
+-455 -479 247
+-441 -479 246
+-436 -484 243
+-432 -485 254
+-430 -488 262
+-434 -491 267
+-434 -491 267
+-444 -500 288
+-453 -510 301
+-456 -517 317
+-456 -525 330
+-470 -538 363
+-472 -543 386
+-476 -548 403
+-467 -551 426
+-431 -557 455
+-414 -554 465
+-392 -550 472
+-363 -545 480
+-281 -514 431
+-281 -514 431
+-270 -502 398
+-261 -488 366
+-277 -458 289
+-298 -446 261
+-324 -433 236
+-387 -414 209
+-437 -397 191
+-437 -397 191
+-456 -395 197
+-494 -383 196
+-520 -369 198
+-520 -369 198
+-531 -363 199
+-554 -350 204
+-565 -337 207
+-565 -337 207
+-573 -338 213
+-591 -338 221
+-602 -336 232
+-602 -336 232
+-608 -336 237
+-612 -336 240
+-589 -321 215
+-589 -321 215
+-577 -318 204
+-563 -309 190
+-492 -283 160
+-438 -267 148
+-438 -267 148
+-340 -249 155
+-237 -235 199
+-237 -235 199
+-190 -235 239
+-154 -236 283
+-109 -268 465
+-109 -268 465
+-118 -279 526
+-176 -307 625
+-258 -331 689
+-258 -331 689
+-307 -344 706
+-383 -378 703
+-452 -413 678
+-477 -431 656
+-477 -431 656
+-502 -467 616
+-493 -501 566
+-493 -501 566
+-481 -520 540
+-465 -531 512
+-414 -540 483
+-410 -543 463
+-404 -545 442
+-385 -545 395
+-369 -533 352
+-355 -523 329
+-349 -512 307
+-364 -488 262
+-364 -488 262
+-369 -482 245
+-382 -478 239
+-393 -480 239
+-393 -480 239
+-412 -493 252
+-422 -499 259
+-443 -520 273
+-443 -520 273
+-451 -523 288
+-467 -536 317
+-466 -540 329
+-456 -545 345
+-456 -545 345
+-424 -550 382
+-381 -547 383
+-381 -547 383
+-367 -537 373
+-343 -516 323
+-384 -478 248
+-384 -478 248
+-425 -458 227
+-521 -427 232
+-590 -425 271
+-590 -425 271
+-605 -419 289
+-634 -404 305
+-652 -398 338
+-663 -396 359
+-663 -396 359
+-673 -388 368
+-681 -371 374
+-683 -364 374
+-684 -358 382
+-690 -331 360
+-690 -331 360
+-684 -319 333
+-670 -305 288
+-533 -265 169
+-533 -265 169
+-458 -256 144
+-374 -255 147
+-147 -288 321
+-147 -288 321
+-127 -317 412
+-159 -368 547
+-244 -404 627
+-244 -404 627
+-288 -419 647
+-328 -439 648
+-407 -467 631
+-407 -467 631
+-416 -481 618
+-422 -491 601
+-443 -517 560
+-443 -517 560
+-442 -523 546
+-427 -537 517
+-411 -542 483
+-401 -544 474
+-393 -545 463
+-379 -544 451
+-325 -524 385
+-315 -514 346
+-318 -495 300
+-393 -451 224
+-478 -414 206
+-505 -410 216
+-546 -412 240
+-581 -408 257
+-601 -403 273
+-624 -402 295
+-639 -394 316
+-646 -390 330
+-658 -391 348
+-670 -382 362
+-678 -376 376
+-685 -364 414
+-693 -356 421
+-693 -356 421
+-699 -336 451
+-699 -336 451
+-706 -318 445
+-711 -291 416
+-710 -276 399
+-710 -276 399
+-647 -204 253
+-605 -181 215
+-555 -164 187
+-346 -137 173
+-264 -141 197
+-187 -151 259
+-104 -209 473
+-116 -229 539
+-141 -247 591
+-214 -284 675
+-258 -314 697
+-339 -361 708
+-414 -404 692
+-448 -426 669
+-466 -449 648
+-496 -504 560
+-498 -516 539
+-491 -525 517
+-463 -544 465
+-461 -544 453
+-454 -544 453
+-406 -548 451
+-383 -546 434
+-368 -542 422
+-352 -516 332
+-352 -516 332
+-390 -478 247
+-500 -425 223
+-500 -425 223
+-554 -419 242
+-597 -401 269
+-619 -396 280
+-619 -396 280
+-641 -378 303
+-657 -357 306
+-664 -348 304
+-668 -343 310
+-681 -328 334
+-686 -329 341
+-688 -326 342
+-694 -318 359
+-696 -319 364
+-698 -317 370
+-700 -326 399
+-703 -333 400
+-701 -343 400
+-689 -366 407
+-690 -374 403
+-684 -382 402
+-674 -392 379
+-669 -398 369
+-666 -403 356
+-653 -397 338
+-656 -395 330
+-659 -385 326
+-658 -367 311
+-655 -364 309
+-661 -360 307
+-666 -354 300
+-661 -354 292
+-656 -351 283
+-636 -343 241
+-636 -331 231
+-629 -328 221
+-607 -308 194
+-607 -308 194
+-596 -308 192
+-521 -265 153
+-468 -250 140
+-419 -245 140
+-268 -285 188
+-223 -310 224
+-180 -331 286
+-160 -392 437
+-176 -415 485
+-206 -438 521
+-304 -477 586
+-330 -490 585
+-352 -496 586
+-404 -512 579
+-411 -519 572
+-415 -522 568
+-435 -534 544
+-435 -534 544
+-442 -539 540
+-439 -542 528
+-441 -545 525
+-436 -545 510
+-411 -550 498
+-399 -550 489
+-385 -550 476
+-352 -546 447
+-352 -546 447
+-329 -541 431
+-297 -507 339
+-297 -507 339
+-306 -492 303
+-433 -425 204
+-433 -425 204
+-470 -411 201
+-555 -396 223
+-575 -388 233
+-586 -382 247
+-629 -380 280
+-643 -380 296
+-650 -379 311
+-664 -374 339
+-668 -378 349
+-674 -377 357
+-681 -386 404
+-683 -387 416
+-685 -391 428
+-694 -381 448
+-694 -375 451
+-697 -366 454
+-706 -330 450
+-706 -330 450
+-713 -301 419
+-660 -202 270
+-660 -202 270
+-607 -181 216
+-254 -161 205
+-254 -161 205
+-174 -177 279
+-115 -262 525
+-115 -262 525
+-143 -284 596
+-195 -307 659
+-429 -375 715
+-429 -375 715
+-429 -375 715
+-552 -430 635
+-578 -447 600
+-589 -461 574
+-586 -487 520
+-579 -501 500
+-570 -513 473
+-526 -532 421
+-526 -532 421
+-519 -536 416
+-505 -537 450
+-505 -537 450
+-487 -539 473
+-425 -550 496
+-425 -550 496
+-400 -546 493
+-272 -482 322
+-272 -482 322
+-285 -455 269
+-410 -408 191
+-410 -408 191
+-466 -378 187
+-547 -342 202
+-547 -342 202
+-592 -331 229
+-646 -313 275
+-646 -313 275
+-667 -314 305
+-686 -318 335
+-686 -318 335
+-698 -319 377
+-705 -338 439
+-705 -338 439
+-701 -360 446
+-701 -360 446
+-701 -354 419
+-700 -334 378
+-700 -334 378
+-696 -328 360
+-639 -286 242
+-639 -286 242
+-581 -257 195
+-424 -221 143
+-424 -221 143
+-261 -215 183
+-112 -260 388
+-112 -260 388
+-126 -305 543
+-296 -372 691
+-413 -402 695
+-522 -441 633
+-522 -441 633
+-552 -479 576
+-542 -513 519
+-534 -523 505
+-526 -530 492
+-510 -539 477
+-501 -545 468
+-484 -552 447
+-456 -552 427
+-456 -552 427
+-449 -554 412
+-443 -553 400
+-446 -553 398
+-463 -548 416
+-463 -548 416
+-448 -554 432
+-405 -555 457
+-405 -555 457
+-358 -548 444
+-290 -500 330
+-290 -500 330
+-321 -449 239
+-419 -408 192
+-419 -408 192
+-471 -379 182
+-543 -349 204
+-566 -343 207
+-586 -333 221
+-639 -305 267
+-659 -299 291
+-673 -292 310
+-698 -283 349
+-698 -283 349
+-701 -267 355
+-694 -220 331
+-677 -206 307
+-677 -206 307
+-442 -131 164
+-442 -131 164
+-371 -128 166
+-116 -163 378
+-116 -163 378
+-99 -190 463
+-207 -278 673
+-253 -296 699
+-373 -334 723
+-392 -358 712
+-400 -383 704
+-425 -441 663
+-437 -458 648
+-442 -481 626
+-438 -511 581
+-441 -527 548
+-441 -542 498
+-441 -542 498
+-432 -548 474
+-422 -553 454
+-422 -553 454
+-409 -551 451
+-371 -548 428
+-356 -544 412
+-373 -501 284
+-409 -490 261
+-561 -453 284
+-561 -453 284
+-581 -451 293
+-640 -426 338
+-640 -426 338
+-650 -421 352
+-683 -389 415
+-683 -389 415
+-686 -379 429
+-698 -347 470
+-703 -344 487
+-702 -331 502
+-713 -265 479
+-718 -248 454
+-649 -173 263
+-587 -159 211
+-312 -146 177
+-219 -165 226
+-140 -286 585
+-140 -286 585
+-226 -335 669
+-350 -406 685
+-350 -406 685
+-405 -471 636
+-409 -482 625
+-411 -494 610
+-403 -526 554
+-401 -532 545
+-385 -536 518
+-378 -541 510
+-364 -540 502
+-306 -527 417
+-300 -521 377
+-349 -482 257
+-387 -471 243
+-517 -454 239
+-544 -448 251
+-618 -429 302
+-637 -420 317
+-679 -394 391
+-689 -389 407
+-694 -366 497
+-690 -363 522
+-672 -326 591
+-664 -321 610
+-645 -289 643
+-641 -276 637
+-664 -222 615
+-672 -207 593
+-701 -160 483
+-701 -146 430
+-604 -114 245
+-548 -110 198
+-177 -151 270
+-120 -180 362
+-178 -335 614
+-210 -362 636
+-308 -459 621
+-326 -484 603
+-348 -523 545
+-347 -527 535
+-322 -525 499
+-312 -525 491
+-252 -498 402
+-245 -484 360
+-334 -429 211
+-387 -414 190
+-635 -370 276
+-663 -365 321
+-699 -352 441
+-699 -352 441
+-694 -342 525
+-686 -335 547
+-648 -324 622
+-641 -320 633
+-584 -293 687
+-565 -288 702
+-489 -273 737
+-473 -272 742
+-405 -258 748
+-391 -264 751
+-351 -272 741
+-351 -272 741
+-372 -264 753
+-377 -264 751
+-452 -252 747
+-484 -253 740
+-634 -225 653
+-663 -222 617
+-718 -219 436
+-715 -221 397
+-647 -252 247
+-620 -268 217
+-474 -339 166
+-449 -361 167
+-375 -404 194
+-375 -404 194
+-285 -453 267
+-285 -453 267
+-266 -479 322
+-256 -482 338
+-237 -490 403
+-236 -490 420
+-217 -479 454
+-213 -474 466
+-197 -464 460
+-190 -459 455
+-174 -440 414
+-174 -440 414
+-179 -435 384
+-179 -435 384
+-189 -446 372
+-185 -452 371
+-186 -449 367
+-186 -449 367
+-182 -434 340
+-185 -424 323
+-258 -383 209
+-356 -357 163
+-356 -357 163
+-468 -316 156
+-468 -316 156
+-557 -283 185
+-570 -279 194
+-640 -268 243
+-649 -268 261
+-692 -279 327
+-693 -283 340
+-709 -300 388
+-709 -300 388
+-706 -323 409
+-708 -324 408
+-707 -338 409
+-707 -338 409
+-702 -330 385
+-702 -330 385
+-699 -302 360
+-698 -300 354
+-686 -235 309
+-626 -186 229
+-600 -174 214
+-477 -148 162
+-477 -148 162
+-182 -220 245
+-156 -254 280
+-144 -352 366
+-144 -352 366
+-188 -445 451
+-188 -445 451
+-225 -483 443
+-225 -483 443
+-246 -496 433
+-246 -496 433
+-233 -484 398
+-233 -484 398
+-264 -429 256
+-264 -429 256
+-437 -369 177
+-437 -369 177
+-555 -336 199
+-579 -331 211
+-629 -306 254
+-648 -299 268
+-694 -283 351
+-699 -279 362
+-713 -272 418
+-714 -272 427
+-713 -273 445
+-713 -273 445
+-713 -277 434
+-713 -277 434
+-703 -304 372
+-703 -304 372
+-674 -327 306
+-674 -327 306
+-634 -352 260
+-634 -352 260
+-603 -369 241
+-603 -369 241
+-605 -372 245
+-608 -370 248
+-613 -373 246
+-608 -366 239
+-605 -366 233
+-543 -317 177
+-543 -317 177
+-385 -260 146
+-385 -260 146
+-184 -289 252
+-163 -299 286
+-135 -353 444
+-147 -375 486
+-240 -453 560
+-240 -453 560
+-355 -538 480
+-371 -545 449
+-455 -539 367
+-455 -539 367
+-511 -525 372
+-511 -525 372
+-449 -549 433
+-367 -543 403
+-361 -537 387
+-454 -497 276
+-454 -497 276
+-596 -481 370
+-596 -481 370
+-635 -458 478
+-637 -446 501
+-670 -383 540
+-688 -353 524
+-579 -202 186
+-579 -202 186
+-162 -199 272
+-105 -263 461
+-111 -279 486
+-162 -383 532
+-182 -412 539
+-267 -504 468
+-294 -520 445
+-420 -553 445
+-399 -542 521
+-399 -542 521
+-307 -527 494
+-307 -527 494
+-296 -513 346
+-296 -513 346
+-439 -489 268
+-439 -489 268
+-575 -485 338
+-575 -485 338
+-638 -460 432
+-638 -460 432
+-692 -342 374
+-692 -342 374
+-530 -208 163
+-530 -208 163
+-124 -264 362
+-124 -264 362
+-152 -352 553
+-221 -434 573
+-221 -434 573
+-254 -485 508
+-254 -485 508
+-277 -495 347
+-417 -469 240
+-417 -469 240
+-580 -455 301
+-580 -455 301
+-639 -450 400
+-639 -450 400
+-642 -437 525
+-642 -437 525
+-591 -430 613
+-563 -412 650
+-563 -412 650
+-623 -409 595
+-623 -409 595
+-617 -372 251
+-307 -427 237
+-307 -427 237
+-247 -490 447
+-327 -536 478
+-327 -536 478
+-381 -549 436
+-381 -549 436
+-395 -549 394
+-390 -521 315
+-411 -515 296
+-541 -474 295
+-624 -465 413
+-628 -464 443
+-618 -441 559
+-615 -431 584
+-534 -388 686
+-534 -388 686
+-457 -318 737
+-526 -218 716
+-580 -198 678
+-662 -100 351
+-286 -97 204
+-123 -280 550
+-204 -429 533
+-379 -536 520
+-393 -526 556
+-263 -502 428
+-306 -484 297
+-391 -491 269
+-485 -502 286
+-509 -494 292
+-609 -473 371
+-682 -358 359
+-412 -196 147
+-106 -258 477
+-233 -345 672
+-263 -358 677
+-357 -441 655
+-394 -479 619
+-394 -479 619
+-333 -492 587
+-219 -461 500
+-167 -391 346
+-396 -317 151
+-670 -334 316
+-705 -328 497
+-694 -305 553
+-687 -304 565
+-701 -274 521
+-680 -179 321
+-361 -128 168
+-105 -238 460
+-257 -413 623
+-357 -506 571
+-372 -512 579
+-421 -523 564
+-348 -510 563
+-246 -492 419
+-436 -430 210
+-648 -420 370
+-646 -405 561
+-709 -299 436
+-599 -190 211
+-543 -167 182
+-269 -152 191
+-140 -211 313
+-121 -229 348
+-113 -313 459
+-178 -401 543
+-292 -466 606
+-429 -506 589
+-463 -537 522
+-386 -542 487
+-337 -521 352
+-509 -485 290
+-608 -478 432
+-621 -437 564
+-642 -336 617
+-707 -212 380
+-457 -158 158
+-101 -227 460
+-162 -301 610
+-242 -390 638
+-301 -475 595
+-330 -498 586
+-354 -515 561
+-354 -515 561
+-361 -528 544
+-361 -536 503
+-359 -539 411
+-375 -516 311
+-538 -471 284
+-638 -373 294
+-583 -233 198
+-194 -211 249
+-141 -330 534
+-249 -427 599
+-267 -457 579
+-241 -450 568
+-241 -450 568
+-202 -446 478
+-220 -458 378
+-267 -474 314
+-425 -480 259
+-545 -469 294
+-642 -397 321
+-537 -284 177
+-192 -298 268
+-163 -387 493
+-304 -442 637
+-384 -435 670
+-298 -406 667
+-158 -372 535
+-164 -382 341
+-242 -393 240
+-383 -455 232
+-466 -497 276
+-544 -476 295
+-467 -387 186
+-150 -374 454
+-255 -408 636
+-289 -412 646
+-404 -443 662
+-404 -443 662
+-484 -450 642
+-466 -446 656
+-247 -410 610
+-123 -318 403
+-220 -186 203
+-381 -126 158
+-523 -139 184
+-596 -191 212
+-601 -276 207
+-545 -376 197
+-459 -440 210
+-388 -485 261
+-360 -514 328
+-341 -534 442
+-369 -527 522
+-380 -516 556
+-395 -499 591
+-402 -487 608
+-373 -465 634
+-286 -452 602
+-161 -397 443
+-196 -274 229
+-391 -176 151
+-614 -182 242
+-708 -247 392
+-704 -308 491
+-695 -349 494
+-692 -345 362
+-512 -367 188
+-307 -437 257
+-291 -506 485
+-393 -536 514
+-453 -548 463
+-451 -546 460
+-413 -547 469
+-344 -530 474
+-252 -462 335
+-373 -323 164
+-593 -229 221
+-689 -226 342
+-704 -267 515
+-668 -320 587
+-616 -376 629
+-616 -376 629
+-643 -399 563
+-664 -404 367
+-471 -422 209
+-323 -464 267
+-247 -490 447
+-441 -483 630
+-567 -474 562
+-560 -492 543
+-486 -504 570
+-402 -504 580
+-279 -490 494
+-294 -407 238
+-520 -308 187
+-679 -293 334
+-692 -343 484
+-635 -422 540
+-597 -464 531
+-615 -465 467
+-605 -442 315
+-480 -412 206
+-256 -412 264
+-171 -413 502
+-326 -419 674
+-569 -410 635
+-607 -454 534
+-549 -499 534
+-484 -514 550
+-350 -521 512
+-298 -440 252
+-514 -324 182
+-681 -294 334
+-694 -339 482
+-644 -395 563
+-631 -407 571
+-678 -382 469
+-620 -359 253
+-393 -343 166
+-147 -380 398
+-320 -394 700
+-579 -402 641
+-636 -426 528
+-607 -478 469
+-538 -517 463
+-484 -532 489
+-444 -515 552
+-399 -486 611
+-276 -448 592
+-182 -371 295
+-513 -270 170
+-686 -303 350
+-680 -352 355
+-626 -357 265
+-528 -329 177
+-405 -271 140
+-229 -264 192
+-108 -315 467
+-260 -370 685
+-543 -395 663
+-632 -441 511
+-606 -475 484
+-527 -513 515
+-381 -516 545
+-247 -477 421
+-264 -390 239
+-452 -286 161
+-668 -308 313
+-663 -389 384
+-641 -432 392
+-629 -415 317
+-524 -378 193
+-313 -363 189
+-149 -369 392
+-299 -403 676
+-593 -394 630
+-653 -420 495
+-628 -464 456
+-560 -502 503
+-383 -537 469
+-385 -464 238
+-602 -384 264
+-667 -368 361
+-678 -377 481
+-675 -377 505
+-692 -349 480
+-705 -287 393
+-617 -234 223
+-399 -259 146
+-142 -347 368
+-312 -394 687
+-493 -430 655
+-583 -458 567
+-541 -487 560
+-406 -525 536
+-334 -508 329
+-386 -481 267
+-487 -449 244
+-603 -429 317
+-658 -421 460
+-682 -356 509
+-687 -240 319
+-314 -151 176
+-111 -203 531
+-261 -273 707
+-419 -399 691
+-425 -480 620
+-327 -505 551
+-266 -472 315
+-355 -457 245
+-465 -463 244
+-542 -471 286
+-619 -435 338
+-621 -306 232
+-235 -201 214
+-139 -265 587
+-287 -373 679
+-422 -509 563
+-500 -532 440
+-526 -525 477
+-477 -538 483
+-392 -547 432
+-296 -485 307
+-322 -398 205
+-398 -283 151
+-332 -264 153
+-301 -313 171
+-279 -341 190
+-273 -370 213
+-257 -358 211
+-246 -350 213
+-203 -323 238
+-196 -319 245
+-195 -335 243
+-189 -336 257
+-167 -358 307
+-168 -389 342
+-166 -393 358
+-167 -407 374
+-193 -421 340
+-195 -408 296
+-178 -354 253
+-177 -335 207
+-184 -365 180
+-199 -392 160
+-222 -392 106
+-259 -422 84
+-291 -445 72
+-320 -453 71
+-314 -477 88
+-317 -487 89
+-314 -498 99
+-316 -496 95
+-318 -495 93
+-319 -492 97
+-316 -495 94
+-321 -491 95
+-321 -494 96
+-319 -495 97
+-315 -494 95
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/libdm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/libdm.dll
new file mode 100644
index 0000000..ac60b3c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Debug/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..efc3557
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..c01fb73
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/libdm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/libdm.dll
new file mode 100644
index 0000000..e9aac55
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/Release/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..ba5fc5d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..d40f1c9
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/libdm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/libdm.dll
new file mode 100644
index 0000000..dd705f2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Debug/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..6983170
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe.config b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe.config
new file mode 100644
index 0000000..8e15646
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.exe.config
@@ -0,0 +1,6 @@
+锘
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..d0665f2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.dll
new file mode 100644
index 0000000..c208dc2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.xml
new file mode 100644
index 0000000..1144a9d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.SceneGraph.xml
@@ -0,0 +1,6188 @@
+
+
+
+ SharpGL.SceneGraph
+
+
+
+
+ The IHasMaterial interface can be implemented by any scene object
+ to allow a material to be associated with the object.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ IDeepCloneable objects can create a deep clone of themselves.
+
+
+
+
+
+ Creates a deep clones of this instance.
+
+ A deep clone of this instance.
+
+
+
+ This aids the design of the OpenGLCtrl
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Remove Control properties that are not supported by the control.
+
+
+
+
+
+ The VertexConverter class allows you to edit vertices in the propties window.
+
+
+
+
+ This converts the Material Collection into something more functional.
+
+
+
+
+ The texture editor makes Textures in the properties window much better,
+ giving them a little thumbnail.
+
+
+
+
+ This converts the Quadric Collection into something more functional, and
+ allows you to add many types of quadrics.
+
+
+
+
+ This converts the Camera collection into something more usable (design time wise)
+ by allowing all the types of camera to be added.
+
+
+
+
+ This converts the evaluator collection into something more usable (design time wise)
+ by allowing all the types of evaluator to be added.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ The OpenGLAttributeGroup is the base for groups of opengl attributes.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+ True if any attributes are set
+
+
+
+ Pushes the attributes onto the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ Pops the attributes off the specified OpenGL attribute stack.
+
+ The OpenGL instance.
+
+
+
+ The attribute flags for the group.
+
+
+
+
+ Gets the attribute flags.
+ todo use get only, xmlignore and don't store them - return them on the fly.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the alpha test function.
+
+
+ The alpha test function.
+
+
+
+
+ Gets or sets the alpha test reference value.
+
+
+ The alpha test reference value.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the blending source factor.
+
+
+ The blending source factor.
+
+
+
+
+ Gets or sets the blending destination factor.
+
+
+ The blending destination factor.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the draw buffer mode.
+
+
+ The draw buffer mode.
+
+
+
+
+ Gets or sets the enable logic op.
+
+
+ The enable logic op.
+
+
+
+
+ Gets or sets the logic op.
+
+
+ The logic op.
+
+
+
+
+ Gets or sets the color of the color mode clear.
+
+
+ The color of the color mode clear.
+
+
+
+
+ Gets or sets the color of the index mode clear.
+
+
+ The color of the index mode clear.
+
+
+
+
+ Gets or sets the color mode write mask.
+
+
+ The color mode write mask.
+
+
+
+
+ Gets or sets the index mode write mask.
+
+
+ The index mode write mask.
+
+
+
+
+ This class has all the settings you can edit for current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the current.
+
+
+ The color of the current.
+
+
+
+
+ Gets or sets the index of the current color.
+
+
+ The index of the current color.
+
+
+
+
+ Gets or sets the current normal vector.
+
+
+ The current normal vector.
+
+
+
+
+ Gets or sets the current texture coordiate.
+
+
+ The current texture coordiate.
+
+
+
+
+ Gets or sets the current raster position.
+
+
+ The current raster position.
+
+
+
+
+ Gets or sets the color of the current raster.
+
+
+ The color of the current raster.
+
+
+
+
+ Gets or sets the index of the current raster color.
+
+
+ The index of the current raster color.
+
+
+
+
+ Gets or sets the current raster texture coordiate.
+
+
+ The current raster texture coordiate.
+
+
+
+
+ Gets or sets the current edge flag.
+
+
+ The current edge flag.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable depth writemask.
+
+
+ The enable depth writemask.
+
+
+
+
+ Gets or sets the depth clear value.
+
+
+ The depth clear value.
+
+
+
+
+ Gets or sets the depth function.
+
+
+ The depth function.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable alpha test.
+
+
+ The enable alpha test.
+
+
+
+
+ Gets or sets the enable auto normal.
+
+
+ The enable auto normal.
+
+
+
+
+ Gets or sets the enable blend.
+
+
+ The enable blend.
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable depth test.
+
+
+ The enable depth test.
+
+
+
+
+ Gets or sets the enable dither.
+
+
+ The enable dither.
+
+
+
+
+ Gets or sets the enable fog.
+
+
+ The enable fog.
+
+
+
+
+ Gets or sets the enable lighting.
+
+
+ The enable lighting.
+
+
+
+
+ Gets or sets the enable line smooth.
+
+
+ The enable line smooth.
+
+
+
+
+ Gets or sets the enable line stipple.
+
+
+ The enable line stipple.
+
+
+
+
+ Gets or sets the enable color logic op.
+
+
+ The enable color logic op.
+
+
+
+
+ Gets or sets the enable index logic op.
+
+
+ The enable index logic op.
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the enable point smooth.
+
+
+ The enable point smooth.
+
+
+
+
+ Gets or sets the enable polygon offset line.
+
+
+ The enable polygon offset line.
+
+
+
+
+ Gets or sets the enable polygon offset fill.
+
+
+ The enable polygon offset fill.
+
+
+
+
+ Gets or sets the enable polygon offset point.
+
+
+ The enable polygon offset point.
+
+
+
+
+ Gets or sets the enable polygon smooth.
+
+
+ The enable polygon smooth.
+
+
+
+
+ Gets or sets the enable polygon stipple.
+
+
+ The enable polygon stipple.
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the enable texture1 D.
+
+
+ The enable texture1 D.
+
+
+
+
+ Gets or sets the enable texture2 D.
+
+
+ The enable texture2 D.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for hints.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the perspective correction hint.
+
+
+ The perspective correction hint.
+
+
+
+
+ Gets or sets the point smooth hint.
+
+
+ The point smooth hint.
+
+
+
+
+ Gets or sets the line smooth hint.
+
+
+ The line smooth hint.
+
+
+
+
+ Gets or sets the polygon smooth hint.
+
+
+ The polygon smooth hint.
+
+
+
+
+ Gets or sets the fog hint.
+
+
+ The fog hint.
+
+
+
+
+ This class has the light settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The line attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the width.
+
+
+ The width.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ This class has all the settings you can edit for lists.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the color of the map.
+
+
+ The color of the map.
+
+
+
+
+ Gets or sets the map stencil.
+
+
+ The map stencil.
+
+
+
+
+ Gets or sets the index shift.
+
+
+ The index shift.
+
+
+
+
+ Gets or sets the index offset.
+
+
+ The index offset.
+
+
+
+
+ Gets or sets the red scale.
+
+
+ The red scale.
+
+
+
+
+ Gets or sets the green scale.
+
+
+ The green scale.
+
+
+
+
+ Gets or sets the blue scale.
+
+
+ The blue scale.
+
+
+
+
+ Gets or sets the alpha scale.
+
+
+ The alpha scale.
+
+
+
+
+ Gets or sets the depth scale.
+
+
+ The depth scale.
+
+
+
+
+ Gets or sets the red bias.
+
+
+ The red bias.
+
+
+
+
+ Gets or sets the green bias.
+
+
+ The green bias.
+
+
+
+
+ Gets or sets the blue bias.
+
+
+ The blue bias.
+
+
+
+
+ Gets or sets the alpha bias.
+
+
+ The alpha bias.
+
+
+
+
+ Gets or sets the depth bias.
+
+
+ The depth bias.
+
+
+
+
+ The point settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ The size.
+
+
+
+
+ The smooth flag.
+
+
+
+
+ Gets or sets the size.
+
+
+ The size.
+
+
+
+
+ Gets or sets the smooth.
+
+
+ The smooth.
+
+
+
+
+ The polygon settings.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable cull face.
+
+
+ The enable cull face.
+
+
+
+
+ Gets or sets the enable smooth.
+
+
+ The enable smooth.
+
+
+
+
+ Gets or sets the cull faces.
+
+
+ The cull faces.
+
+
+
+
+ Gets or sets the front faces.
+
+
+ The front faces.
+
+
+
+
+ Gets or sets the polygon draw mode.
+
+
+ The polygon draw mode.
+
+
+
+
+ Gets or sets the offset factor.
+
+
+ The offset factor.
+
+
+
+
+ Gets or sets the offset bias.
+
+
+ The offset bias.
+
+
+
+
+ Gets or sets the enable offset point.
+
+
+ The enable offset point.
+
+
+
+
+ Gets or sets the enable offset line.
+
+
+ The enable offset line.
+
+
+
+
+ Gets or sets the enable offset fill.
+
+
+ The enable offset fill.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the polygon stipple.
+
+
+ The polygon stipple.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable scissor test.
+
+
+ The enable scissor test.
+
+
+
+
+ Gets or sets the scissor X.
+
+
+ The scissor X.
+
+
+
+
+ Gets or sets the scissor Y.
+
+
+ The scissor Y.
+
+
+
+
+ Gets or sets the width of the scissor.
+
+
+ The width of the scissor.
+
+
+
+
+ Gets or sets the height of the scissor.
+
+
+ The height of the scissor.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable stencil test.
+
+
+ The enable stencil test.
+
+
+
+
+ Gets or sets the stencil function.
+
+
+ The stencil function.
+
+
+
+
+ Gets or sets the stencil reference.
+
+
+ The stencil reference.
+
+
+
+
+ Gets or sets the stencil mask.
+
+
+ The stencil mask.
+
+
+
+
+ Gets or sets the index of the stencil clear.
+
+
+ The index of the stencil clear.
+
+
+
+
+ Gets or sets the stencil write mask.
+
+
+ The stencil write mask.
+
+
+
+
+ Gets or sets the operation fail.
+
+
+ The operation fail.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ Gets or sets the operation depth pass.
+
+
+ The operation depth pass.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the enable normalize.
+
+
+ The enable normalize.
+
+
+
+
+ Gets or sets the matrix mode.
+
+
+ The matrix mode.
+
+
+
+
+ This class has all the settings you can edit for fog.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Sets the attributes.
+
+ The OpenGL instance.
+
+
+
+ Returns true if any attributes are set.
+
+
+ True if any attributes are set
+
+
+
+
+ Gets or sets the viewport X.
+
+
+ The viewport X.
+
+
+
+
+ Gets or sets the viewport Y.
+
+
+ The viewport Y.
+
+
+
+
+ Gets or sets the width of the viewport.
+
+
+ The width of the viewport.
+
+
+
+
+ Gets or sets the height of the viewport.
+
+
+ The height of the viewport.
+
+
+
+
+ Gets or sets the depth range near.
+
+
+ The depth range near.
+
+
+
+
+ Gets or sets the depth range far.
+
+
+ The depth range far.
+
+
+
+
+ The OpenGLEventArgs class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The gl.
+
+
+
+ The OpenGL instance.
+
+
+
+
+ Gets or sets the open GL.
+
+ The open GL.
+
+
+
+ The OpenGL Event Handler delegate.
+
+
+
+
+ Extensions to the OpenGL class for use with the Scene Graph types (allowing
+ vertices, GLColors etc to be used).
+
+
+
+
+ Set the current color.
+
+ The OpenGL instance.
+ The color.
+
+
+
+ This is a SharpGL helper version, that projects the vertex passed, using the
+ current matrixes.
+
+ The gl.
+ The object coordinates.
+
+ The screen coords.
+
+
+
+
+ Gets the model view matrix.
+
+ The gl.
+
+
+
+
+ Gets the projection matrix.
+
+ The gl.
+
+
+
+
+ Gets the texture matrix.
+
+ The gl.
+
+
+
+
+ Vertexes the pointer.
+
+ The gl.
+ The size.
+ The type.
+ The stride.
+ The pointer.
+
+
+
+ This is the main particle class, if you want specialised particles derive from it.
+
+
+
+
+ This function should initialise the particle so that it's ready to tick.
+
+ The random number generator.
+
+
+
+ This function moves the particle on a stage.
+
+ The random nunber generator.
+
+
+
+ This function draws the particle.
+
+
+
+
+
+ A basic particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function initialises the basic particle.
+
+
+
+
+
+ This function 'ticks' the particle, i.e moves it on a stage.
+
+ A random object.
+
+
+
+ This is the vertex's current position in space.
+
+
+
+
+ This is the velocity, do not modify!
+
+
+
+
+ This is the direction of the particle.
+
+
+
+
+ This shows the potential magnitude of the random effects of the direction.
+
+
+
+
+ This is the gravity affecting the particle.
+
+
+
+
+ Particles colour.
+
+
+
+
+ How much the particles colour can change by each tick.
+
+
+
+
+ The life left of the particle.
+
+
+
+
+ The lifespan of the particle.
+
+
+
+
+ Does the particle only exist once?
+
+
+
+
+ A Sphere particle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Draws the specified gl.
+
+ The gl.
+
+
+
+ A particle system is, you guessed it, just a collection of particles.
+
+
+
+
+ The base class for all elements in a scene. Anything in
+ the scene tree is a Scene Element. Scene elements can
+ have children but are very lacking in functionality -
+ implement
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Adds a child.
+
+ The child scene element.
+
+
+
+ Removes the child scene element.
+
+ The child scene element.
+
+
+
+ Adds an effect.
+
+ The effect.
+
+
+
+ Removes the effect.
+
+ The effect.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The children of the element.
+
+
+
+
+ The effects.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents in the correct order.
+ This traversal allows for a predicate to be used.
+
+ The predicate for traversal.
+
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The full set of T objects in the scene.
+
+
+
+ Traverses this instance. Traversing simply returns
+ the children and all descendents of type T in the correct order.
+
+ The type of object to traverse for.
+ The predicate for traversal.
+
+ The full set of T objects in the scene.
+
+
+
+
+ Traverses to root element.
+
+
+
+
+
+ Gets the children.
+
+
+
+
+ Gets the effects.
+
+
+
+
+ Gets the parent.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ A Scene Element can implement this interface to enable rendering
+ functionality. Note that many scene elements (materials etc) are
+ not actually drawn.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function should create and initialise 'count' particles of the correct
+ type. This is done automatically by default, only override if you want
+ to change the standard behaviour.
+
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function ticks the particle system.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ An Asset is something which is used in the scene, but is not in the scene
+ tree. An example of an asset is a material, which there may be one instance
+ of which is shared between many objects.
+
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ Gets or sets the id.
+
+
+ The id.
+
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ A material object is defined in mathematical terms, i.e it's not exclusivly
+ for OpenGL. This means later on, DirectX or custom library functions could
+ be added.
+
+
+
+
+ An object that is Bindable is able to set itself into
+ the current OpenGL instance. This can be lights, materials,
+ attributes and so on.
+ Bindable objects must be able to be used without interfering
+ with later rendering, so as well as simply being bound directly,
+ they must be able to be pushed and popped.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+ Remember, this will not push or pop the attribute
+ stack so will affect ALL subsequent rendering.
+
+ The OpenGL instance.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Calculates the lighting.
+
+ The light.
+ The angle.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Ambient color.
+
+
+
+
+ Diffuse color.
+
+
+
+
+ Specular color.
+
+
+
+
+ Emission.
+
+
+
+
+ Shininess.
+
+
+
+
+ The texture.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the emission.
+
+
+ The emission.
+
+
+
+
+ Gets or sets the shininess.
+
+
+ The shininess.
+
+
+
+
+ Gets or sets the texture.
+
+
+ The texture.
+
+
+
+
+ A Texture object is simply an array of bytes. It has OpenGL functions, but is
+ not limited to OpenGL, so DirectX or custom library functions could be later added.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ Bind to the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This function creates the underlying OpenGL object.
+
+
+
+
+
+
+ This function creates the texture from an image.
+
+ The OpenGL object.
+ The image.
+ True if the texture was successfully loaded.
+
+
+
+ This function creates the texture from an image file.
+
+ The OpenGL object.
+ The path to the image file.
+ True if the texture was successfully loaded.
+
+
+
+ This function destroys the OpenGL object that is a representation of this texture.
+
+
+
+
+ This function (attempts) to make a bitmap from the raw data. The fact that
+ the byte array is a managed type makes it slightly more complicated.
+
+ The texture object as a Bitmap.
+
+
+
+ This is an array of bytes (r, g, b, a) that represent the pixels in this
+ texture object.
+
+
+
+
+ The width of the texture image.
+
+
+
+
+ The height of the texture image.
+
+
+
+
+ This is for OpenGL textures, it is the unique ID for the OpenGL texture.
+
+
+
+
+ Gets the name of the texture.
+
+
+ The name of the texture.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ This camera contains the data needed to perform a Perspective transformation
+ to the projection matrix.
+
+
+
+
+ The camera class is a base for a set of derived classes for manipulating the
+ projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function projects through the camera, to OpenGL, ie. it
+ creates a projection matrix.
+
+
+
+
+ This function is for when you simply want to call only the functions that
+ would transform the projection matrix. Warning, it won't load the identity
+ first, and it won't set the current matrix to projection, it's really for
+ people who need to use it for their own projection functions (e.g Picking
+ uses it to create a composite 'Pick' projection).
+
+
+
+
+ The camera position.
+
+
+
+
+ Every time a camera is used to project, the projection matrix calculated
+ and stored here.
+
+
+
+
+ The screen aspect ratio.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the aspect.
+
+
+ The aspect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The field of view.
+
+
+
+
+ The near clip.
+
+
+
+
+ The far flip.
+
+
+
+
+ Gets or sets the field of view.
+
+
+ The field of view.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ The arcball used for rotating.
+
+
+
+
+ Gets the arc ball.
+
+
+
+
+ This camera contains the data needed to perform a Frustum transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the camera, perform a Frustrum (in this case)
+ transformation.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The LookAt camera is a camera that does a 'look at' transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ This is the point in the scene that the camera is pointed at.
+
+
+
+
+ This is a vector that describes the 'up' direction (normally 0, 0, 1).
+ Use this to tilt the camera.
+
+
+
+
+ Gets or sets the target.
+
+
+ The target.
+
+
+
+
+ Gets or sets up vector.
+
+
+ Up vector.
+
+
+
+
+ This camera contains the data needed to perform an orthographic transformation
+ to the projection matrix.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the main function of the class, to perform a specialised projection
+ in this case, an orthographic one.
+
+
+
+
+ The left pos.
+
+
+
+
+ The right pos.
+
+
+
+
+ The top pos.
+
+
+
+
+ The bottom pos.
+
+
+
+
+ The near pos.
+
+
+
+
+ The far pos.
+
+
+
+
+ Gets or sets the left.
+
+
+ The left.
+
+
+
+
+ Gets or sets the right.
+
+
+ The right.
+
+
+
+
+ Gets or sets the top.
+
+
+ The top.
+
+
+
+
+ Gets or sets the bottom.
+
+
+ The bottom.
+
+
+
+
+ Gets or sets the near.
+
+
+ The near.
+
+
+
+
+ Gets or sets the far.
+
+
+ The far.
+
+
+
+
+ The ArcBall camera supports arcball projection, making it ideal for use with a mouse.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the class' main function, to override this function and perform a
+ perspective transformation.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the volume from vertices.
+
+ The vertices.
+
+
+
+ Creates the volume from a spherical volume.
+
+ The centre.
+ The radius.
+
+
+
+ Creates the volume from a cylindrical volume.
+
+ The baseline.
+ The height.
+ The base radius.
+ The top radius.
+
+
+
+ Pads the bounding volume.
+
+ The padding.
+
+
+
+ Gets the bound dimensions.
+
+ The x size.
+ The y size.
+ The z size.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ A Face is a set of indices to vertices.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Returns the plane equation (ax + by + cz + d = 0) of the face.
+
+ The parent polygon.
+ An array of four coefficients a,b,c,d.
+
+
+
+ Gets the surface normal.
+
+ The parent.
+
+
+
+
+ This function reverses the order of the indices, i.e changes which direction
+ this face faces in.
+
+ The parent polygon.
+
+
+
+ This function generates normals for every vertex.
+
+ The parent polygon.
+
+
+
+ Returns a that represents this instance.
+
+
+ A that represents this instance.
+
+
+
+
+ The indices.
+
+
+
+
+ The neighbor indices.
+
+
+
+
+ Gets the count.
+
+
+
+
+ Gets or sets the indices.
+
+
+ The indices.
+
+
+
+
+ Gets or sets the neighbour indicies.
+
+
+ The neighbour indicies.
+
+
+
+
+ Gets or sets the material.
+
+
+ The material.
+
+
+
+
+ Scene Elements can be marked as Freezeable. If scene objects
+ are freezable, they can be frozen, meaning that they are locked.
+ Generally this means compiling the object's geometry into
+ a display list.
+
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ A SceneElement can implement IHasObjectSpace to allow it to transform
+ world space into object space.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Any element or asset which has an OpenGL context has some
+ associated OpenGL resource. This means that when it is loaded
+ from file, it may need to be re-created, or if it is moved
+ between OpenGL contexts it may need to be re-created.
+ Any object that has an OpenGL context has a Create method, a
+ Destroy Method and a CurrentContext property.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ An index into a set of arrays.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This is the vertex in the polygon vertex array that the index refers to.
+
+
+
+
+ This is the material coord in the polygon UV array that the index refers to.
+
+
+
+
+ This is the index into the normal array for this vertex. A value of -1 will
+ generate a normal on the fly.
+
+
+
+
+ Gets or sets the vertex.
+
+
+ The vertex.
+
+
+
+
+ Gets or sets the UV.
+
+
+ The UV.
+
+
+
+
+ Gets or sets the normal.
+
+
+ The normal.
+
+
+
+
+ A Scene Element can be volumne bound meaning that it can
+ participate in hit testing and various optimisations.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ This enumeration describes the linear transformation order.
+
+
+
+
+ Translate > Rotate > Scale
+
+
+
+
+ Rotate > Translate > Scale
+
+
+
+
+ The LinearTransformation class represents a linear transformation, such
+ as a transformation that moves us from world space into object space.
+
+
+
+
+ Base class for transformations.
+
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Performs the transformation on the current matrix.
+
+ The OpenGL instance.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ X Component of the Translation.
+
+
+
+
+ Y Component of the Translation.
+
+
+
+
+ Z Component of the Translation.
+
+
+
+
+ X Component of the Rotation.
+
+
+
+
+ Y Component of the Rotation.
+
+
+
+
+ Z Component of the Rotation.
+
+
+
+
+ X Component of the Scale.
+
+
+
+
+ Y Component of the Scale.
+
+
+
+
+ Z Component of the Scale.
+
+
+
+
+ The order of the linear transformation.
+
+
+
+
+ Gets the translation vertex.
+
+
+
+
+ Gets or sets the x component of the translation.
+
+
+ The x component of the translation.
+
+
+
+
+ Gets or sets the y component of the translation.
+
+
+ The y component of the translation.
+
+
+
+
+ Gets or sets the z component of the translation.
+
+
+ The z component of the translation.
+
+
+
+
+ Gets or sets the x component of the rotation.
+
+
+ The x component of the rotation.
+
+
+
+
+ Gets or sets the y component of the rotation.
+
+
+ The y component of the rotation.
+
+
+
+
+ Gets or sets the z component of the rotation.
+
+
+ The z component of the rotation.
+
+
+
+
+ Gets or sets the x component of the scale.
+
+
+ The x component of the scale.
+
+
+
+
+ Gets or sets the y component of the scale.
+
+
+ The y component of the scale.
+
+
+
+
+ Gets or sets the z component of the scale.
+
+
+ The z component of the scale.
+
+
+
+
+ Gets or sets the transformation order.
+
+
+ The transformation order.
+
+
+
+
+ A 4x4 matrix.
+
+
+
+
+ Matrix Library .Net v2.0 By Anas Abidi, 2004.
+
+ The Matrix Library contains Class Matrix which provides many
+ static methods for making various matrix operations on objects
+ derived from the class or on arrays defined as double. The
+ '+','-','*' operators are overloaded to work with the objects
+ derived from the matrix class.
+
+
+
+
+ Returns a hash code for this instance.
+
+
+ A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+
+
+
+
+ The matrix.
+
+
+
+
+ Matrix object constructor, constructs an empty
+ matrix with dimensions: rows = noRows and cols = noCols.
+
+ no. of rows in this matrix
+ no. of columns in this matrix
+
+
+
+ Matrix object constructor, constructs a matrix from an
+ already defined array object.
+
+ the array the matrix will contain
+
+
+
+ Creates a matrix from a column major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a row major array.
+
+ The column major array.
+ The rows.
+ The columns.
+ The matrix.
+
+
+
+ Creates a matrix from a segment of another matrix.
+
+ The RHS.
+ The rows.
+ The cols.
+
+
+
+ Returns the 2D form of a 1D array. i.e. array with
+ dimension[n] is returned as an array with dimension [n,1].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesion [n]
+
+ the same array but with [n,1] dimension
+
+
+
+ Returns the 1D form of a 2D array. i.e. array with
+ dimension[n,1] is returned as an array with dimension [n].
+ In case of an error the error is raised as an exception.
+
+
+ the array to convert, with dimesions [n,1]
+
+ the same array but with [n] dimension
+
+
+
+ Sets the identity matrix as the identity matrix. It must be N x N (i.e.
+ square).
+
+
+
+
+ Returns an Identity matrix with dimensions [n,n] in the from of an array.
+
+ the no. of rows or no. cols in the matrix
+ An identity Matrix with dimensions [n,n] in the form of an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the summation
+ Second array in the summation
+ Sum of Mat1 and Mat2 as an array
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the summation
+ Second matrix in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the summation of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the summation
+ Second Matrix object in the summation
+ Sum of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in the subtraction
+ Second array in the subtraction
+ Difference of Mat1 and Mat2 as an array
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First matrix in the subtraction
+ Second matrix in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the difference of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in the subtraction
+ Second Matrix object in the subtraction
+ Difference of Mat1 and Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions.
+ In case of an error the error is raised as an exception.
+
+ First array in multiplication
+ Second array in multiplication
+ Mat1 multiplied by Mat2 as an array
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the multiplication of two matrices with compatible
+ dimensions OR the cross-product of two vectors.
+ In case of an error the error is raised as an exception.
+
+
+ First matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+
+ Second matrix or vector (i.e: dimension [3,1]) object in
+ multiplication
+
+ Mat1 multiplied by Mat2 as a Matrix object
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose determinant is to be found
+
+ Determinant of the array
+
+
+
+ Returns the determinant of a matrix with [n,n] dimension.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose determinant is to be found
+
+ Determinant of the Matrix object
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Array with [n,n] dimension whose inverse is to be found
+
+ Inverse of the array as an array
+
+
+
+ Returns the inverse of a matrix with [n,n] dimension
+ and whose determinant is not zero.
+ In case of an error the error is raised as an exception.
+
+
+ Matrix object with [n,n] dimension whose inverse is to be found
+
+ Inverse of the matrix as a Matrix object
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Array whose transpose is to be found
+ Transpose of the array as an array
+
+
+
+ Returns the transpose of a matrix.
+ In case of an error the error is raised as an exception.
+
+ Matrix object whose transpose is to be found
+ Transpose of the Matrix object as a Matrix object
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array whose SVD is to be computed
+ An array where the S matrix is returned
+ An array where the U matrix is returned
+ An array where the V matrix is returned
+
+
+
+ Evaluates the Singular Value Decomposition of a matrix,
+ returns the matrices S, U and V. Such that a given
+ Matrix = U x S x V'.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Singular Value Decomposition'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object whose SVD is to be computed
+ A Matrix object where the S matrix is returned
+ A Matrix object where the U matrix is returned
+ A Matrix object where the V matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Array which will be LU Decomposed
+ An array where the lower traingular matrix is returned
+ An array where the upper traingular matrix is returned
+ An array where the permutation matrix is returned
+
+
+
+ Returns the LU Decomposition of a matrix.
+ the output is: lower triangular matrix L, upper
+ triangular matrix U, and permutation matrix P so that
+ P*X = L*U.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object which will be LU Decomposed
+ A Matrix object where the lower traingular matrix is returned
+ A Matrix object where the upper traingular matrix is returned
+ A Matrix object where the permutation matrix is returned
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ The array 'A' on the left side of the equations A.X = B
+ The array 'B' on the right side of the equations A.X = B
+ Array 'X' in the system of equations A.X = B
+
+
+
+ Solves a set of n linear equations A.X = B, and returns
+ X, where A is [n,n] and B is [n,1].
+ In the same manner if you need to compute: inverse(A).B, it is
+ better to use this method instead, as it is much faster.
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'LU Decomposition and Its Applications'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+ Matrix object 'A' on the left side of the equations A.X = B
+ Matrix object 'B' on the right side of the equations A.X = B
+ Matrix object 'X' in the system of equations A.X = B
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ An array whose rank is to be found
+ The rank of the array
+
+
+
+ Returns the rank of a matrix.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose rank is to be found
+ The rank of the Matrix object
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ An array whose pseudoinverse is to be found
+ The pseudoinverse of the array as an array
+
+
+
+ Returns the pseudoinverse of a matrix, such that
+ X = PINV(A) produces a matrix 'X' of the same dimensions
+ as A' so that A*X*A = A, X*A*X = X.
+ In case of an error the error is raised as an exception.
+
+ a Matrix object whose pseudoinverse is to be found
+ The pseudoinverse of the Matrix object as a Matrix Object
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n].
+ In case of an error the error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The array whose Eigenvalues and Eigenvectors are to be found
+
+ An array where the eigenvalues are returned
+ An array where the eigenvectors are returned
+
+
+
+ Returns the Eigenvalues and Eigenvectors of a real symmetric
+ matrix, which is of dimensions [n,n]. In case of an error the
+ error is raised as an exception.
+ Note: This method is based on the 'Eigenvalues and Eigenvectors of a TridiagonalMatrix'
+ section of Numerical Recipes in C by William H. Press,
+ Saul A. Teukolsky, William T. Vetterling and Brian P. Flannery,
+ University of Cambridge Press 1992.
+
+
+ The Matrix object whose Eigenvalues and Eigenvectors are to be found
+
+ A Matrix object where the eigenvalues are returned
+ A Matrix object where the eigenvectors are returned
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Array which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the array
+ Matrix which is to be multiplied by a scalar
+ The multiplication of the scalar and the array as an array
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ Matrix object which is to be multiplied by a scalar
+ The scalar value to multiply the Matrix object
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the multiplication of a matrix or a vector (i.e
+ dimension [3,1]) with a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to multiply the Matrix object
+ Matrix object which is to be multiplied by a scalar
+
+ The multiplication of the scalar and the Matrix object as a
+ Matrix object
+
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Array which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the array with
+ Matrix which is to be divided by a scalar
+ The division of the array and the scalar as an array
+
+
+
+ Returns the division of a matrix or a vector (i.e
+ dimension [3,1]) by a scalar quantity.
+ In case of an error the error is raised as an exception.
+
+ The scalar value to divide the Matrix object with
+ Matrix object which is to be divided by a scalar
+
+ The division of the Matrix object and the scalar as a Matrix object
+
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the cross product
+ Second vector array (dimension [3]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimensions [3,1]) in the cross product
+ Second vector array (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as an array (dimension [3,1])
+
+
+
+ Returns the cross product of two vectors whose
+ dimensions should be [3] or [3x1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix (dimensions [3,1]) in the cross product
+ Second Matrix (dimensions [3,1]) in the cross product
+ Cross product of V1 and V2 as a matrix (dimension [3,1])
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3]) in the dot product
+ Second vector array (dimension [3]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First vector array (dimension [3,1]) in the dot product
+ Second vector array (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the dot product of two vectors whose
+ dimensions should be [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ First Matrix object (dimension [3,1]) in the dot product
+ Second Matrix object (dimension [3,1]) in the dot product
+ Dot product of V1 and V2
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ The vector array (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the vector array
+
+
+
+ Returns the magnitude of a vector whose dimension is [3] or [3,1].
+ In case of an error the error is raised as an exception.
+
+ Matrix object (dimension [3,1]) whose magnitude is to be found
+ The magnitude of the Matrix object
+
+
+
+ Checks if two Arrays of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First array in equality check
+ Second array in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix in equality check
+ Second Matrix in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are equal or not.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are equal or not
+
+
+
+ Checks if two matrices of equal dimensions are not equal.
+ In case of an error the error is raised as an exception.
+
+ First Matrix object in equality check
+ Second Matrix object in equality check
+ If two matrices are not equal
+
+
+
+ Tests whether the specified object is a MatrixLibrary.Matrix
+ object and is identical to this MatrixLibrary.Matrix object.
+
+ The object to compare with the current object
+ This method returns true if obj is the specified Matrix object identical to this Matrix object; otherwise, false.
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The array to be viewed
+ The string view of the array
+
+
+
+ Returns a matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The Matrix object to be viewed
+ The string view of the Matrix object
+
+
+
+ Returns the matrix as a string, so it can be viewed
+ in a multi-text textbox or in a richtextBox (preferred).
+ In case of an error the error is raised as an exception.
+
+ The string view of the Matrix object
+
+
+
+ Set or get an element from the matrix
+
+
+
+
+ Set or get the no. of rows in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ Set or get the no. of columns in the matrix.
+ Warning: Setting this property will delete all of
+ the elements of the matrix and set them to zero.
+
+
+
+
+ This property returns the matrix as an array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a row major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ Gets the matrix as a column major array.
+
+
+
+
+ A plane.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This finds out if a point is in front of, behind, or on this plane.
+
+ The point to classify.
+
+ Less than 0 if behind, 0 if on, Greater than 0 if in front.
+
+
+
+
+ The position.
+
+
+
+
+ The normal.
+
+
+
+
+ The equation.
+
+
+
+
+ The RenderMode enumeration is used to identify what kind
+ of rendering is occuring.
+
+
+
+
+ We are designing.
+
+
+
+
+ We are rendering for a hit test.
+
+
+
+
+ We are rendering.
+
+
+
+
+ The Scene Container is the top-level object in a scene graph.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets or sets the parent scene.
+
+
+ The parent scene.
+
+
+
+
+ A texture coordinate.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The u.
+ The v.
+
+
+
+ The u value.
+
+
+
+
+ The v value.
+
+
+
+
+ Gets or sets the U.
+
+
+ The U.
+
+
+
+
+ Gets or sets the V.
+
+
+ The V.
+
+
+
+
+ The Vertex class represents a 3D point in space.
+
+
+
+
+ Initializes a new instance of the struct.
+
+ The x.
+ The y.
+ The z.
+
+
+
+ Initializes a new instance of the struct.
+
+ The vertex.
+
+
+
+ Sets the specified X.
+
+ The X.
+ The Y.
+ The Z.
+
+
+
+ Implements the operator +.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator -.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator *.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ Implements the operator /.
+
+ The LHS.
+ The RHS.
+
+ The result of the operator.
+
+
+
+
+ This finds the Scalar Product (Dot Product) of two vectors.
+
+ The right hand side of the equation.
+ A Scalar Representing the Dot-Product.
+
+
+
+ Find the Vector product (cross product) of two vectors.
+
+ The right hand side of the equation.
+ The Cross Product.
+
+
+
+ If You use this as a Vector, then call this function to get the vector
+ magnitude.
+
+
+
+
+
+ Make this vector unit length.
+
+
+
+
+ Normalizes this instance.
+
+
+
+
+ The X coordinate.
+
+
+
+
+ The Y coordinate.
+
+
+
+
+ The Z coordinate.
+
+
+
+
+ This class represent's a grid of points, just like you'd get on a NURBS
+ surface, or a patch.
+
+
+
+
+ Use this to draw the vertex grid.
+
+ OpenGL object.
+ Draw each individual vertex (with selection names).
+ Draw the lines connecting the points.
+
+
+
+ This function returns all of the control points as a float array, which
+ is in the format [0] = vertex 1 X, [1] = vertex 1 Y, [2] = vertex 1 Z,
+ [3] = vertex 2 X etc etc... This array is suitable for OpenGL functions
+ for evaluators and NURBS.
+
+ An array of floats.
+
+
+
+ The display list class basicly wraps an OpenGL display list, making them easier
+ to manage. Remember this class is completely OpenGL dependant. In time this class
+ will derive from the IOpenGLDependant interface.
+
+
+
+
+ This function generates the display list. You must call it before you call
+ anything else!
+
+ OpenGL
+
+
+
+ This function makes the display list.
+
+ OpenGL
+ The mode, compile or compile and execute.
+
+
+
+ This function ends the compilation of a list.
+
+
+
+
+
+ An ArcBall is an effect that pushes an arcball transformation
+ onto the stack.
+
+
+
+
+ An effect is something that can be applied to a scene element which
+ then changes everything in the tree below it. It can be pushed, to apply it
+ and popped, to restore OpenGL back to the state without the effect.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the name.
+
+
+ The name.
+
+
+
+
+ Gets or sets a value indicating whether this instance is enabled.
+
+
+ true if this instance is enabled; otherwise, false.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The arcball.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ A Linear Transformation is an effect that pushes a linear transformation (translate, scale, rotate)
+ onto the stack.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ The linear transformation.
+
+
+
+
+ Gets or sets the linear transformation.
+
+
+ The linear transformation.
+
+
+
+
+ The OpenGLAttributes are an effect that can set
+ any OpenGL attributes.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Gets or sets the hint attributes.
+
+
+ The hint attributes.
+
+
+
+
+ Gets or sets the list attributes.
+
+
+ The list attributes.
+
+
+
+
+ Gets or sets the pixel mode attributes.
+
+
+ The pixel mode attributes.
+
+
+
+
+ Gets or sets the polygon stipple attributes.
+
+
+ The polygon stipple attributes.
+
+
+
+
+ Gets or sets the scissor attributes.
+
+
+ The scissor attributes.
+
+
+
+
+ Gets or sets the stencil buffer attributes.
+
+
+ The stencil buffer attributes.
+
+
+
+
+ Gets or sets the texture attributes.
+
+
+ The texture attributes.
+
+
+
+
+ Gets or sets the transform attributes.
+
+
+ The transform attributes.
+
+
+
+
+ Gets or sets the viewport attributes.
+
+
+ The viewport attributes.
+
+
+
+
+ Gets or sets the eval attributes.
+
+
+ The eval attributes.
+
+
+
+
+ Gets or sets the accum buffer attributes.
+
+
+ The accum buffer attributes.
+
+
+
+
+ Gets or sets the color buffer attributes.
+
+
+ The color buffer attributes.
+
+
+
+
+ Gets or sets the current attributes.
+
+
+ The current buffer.
+
+
+
+
+ Gets or sets the depth buffer attributes.
+
+
+ The depth buffer attributes.
+
+
+
+
+ Gets or sets the enable attributes.
+
+
+ The enable attributes.
+
+
+
+
+ Gets the fog attributes.
+
+
+
+
+ Gets the lighting attributes.
+
+
+
+
+ Gets the line attributes.
+
+
+
+
+ Gets the point attributes.
+
+
+
+
+ Gets the polygon attributes.
+
+
+
+
+ This is the base class of all evaluators, 1D, 2D etc. It is also the base class
+ for the NURBS, as they share alot of common code, such as the VertexGrid.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The control points.
+
+
+
+
+ Draw points flag.
+
+
+
+
+ Draw lines flag.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the control points.
+
+
+ The control points.
+
+
+
+
+ Gets or sets a value indicating whether [draw control points].
+
+
+ true if [draw control points]; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [draw control grid].
+
+
+ true if [draw control grid]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ This is a 1D evaluator, i.e a bezier curve.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The points.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ This is a 2D evaluator, i.e a bezier patch.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The u.
+ The v.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The segments.
+
+
+
+
+ Gets or sets the segments.
+
+
+ The segments.
+
+
+
+
+ The NURBS class is the base for NURBS objects, such as curves and surfaces.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the pointer to the underlying NURBS object.
+
+
+
+
+ The display mode.
+
+
+
+
+ Gets or sets the display mode.
+
+
+ The display mode.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ A NURBS Curve is a one dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ A NURBS Surface is a two dimensional non uniform B-Spline.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The s knots.
+
+
+
+
+ The t knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ Gets the knots.
+
+
+
+
+ The feedback class handles feedback easily and well. It is 100% dependant on
+ OpenGL so use it with care!
+
+
+
+
+ This function begins feedback, recording the scene etc. End finishes
+ feedback, and parses the feedback buffer.
+
+
+
+
+ This function stops the collection of feedback data.
+
+ The feedback array.
+
+
+
+ Override this function to do custom functions on the data.
+
+ Number of values.
+
+
+
+ Pass this class any SceneObject and it'll send you back a polygon.
+
+
+
+
+ This takes the feedback data and turns it into triangles.
+
+
+ The number of triangles.
+
+
+
+ This is the main function of the class, it'll create a triangulated polygon
+ from and SceneObject.
+
+ The gl.
+ The object to convert.
+ A camera that can see the whole object.
+
+ A polygon created from 'sourceObject'.
+
+
+
+
+ This class provides a means of working with standard and opengl colours.
+ Use the ColorNet and ColorGL properties to set or access the colour in either
+ mode.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This property allows you to access the color as if it was a .NET
+ color.
+
+
+
+
+ This property accesses the color as an opengl value.
+
+
+
+
+ Gets or sets the R.
+
+
+ The R.
+
+
+
+
+ Gets or sets the G.
+
+
+ The G.
+
+
+
+
+ Gets or sets the B.
+
+
+ The B.
+
+
+
+
+ Gets or sets the A.
+
+
+ The A.
+
+
+
+
+ The bounding helper.
+
+
+
+
+ The bounding volume.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Freezes the specified instance.
+
+ The gl instance.
+ The renderable.
+
+
+
+ Renders the specified gl.
+
+ The gl.
+
+
+
+ Unfreezes the specified gl.
+
+ The gl.
+
+
+
+ The display list internally.
+
+
+
+
+ If true, we're frozen.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Helps with implementing IHasObjectSpace.
+
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Deeps the clone.
+
+
+
+
+
+ The linear transformation
+
+
+
+
+ Gets or sets the transformation.
+
+
+ The transformation.
+
+
+
+
+ The OpenGL Helper is a class that provides some helper functions for working with OpenGL.
+
+
+
+
+ Initialises the supplied OpenGL instance for high quality rendering.
+
+ The OpenGL instance.
+
+
+
+ The scene helper can be used to create scene presets,
+ such as designer, application, etc
+
+
+
+
+ Initialises a modeling scene. A modeling scene has:
+ - A 'Look At' camera targetting the centre of the scene
+ - Three gentle omnidirectional lights
+ - A design time grid and axis.
+
+ The scene.
+
+
+
+ A Light is defined purely mathematically, but works well with OpenGL.
+ A light is a scene element, it can be interacted with using the mouse
+ and it is bindable.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Pushes this object into the provided OpenGL instance.
+ This will generally push elements of the attribute stack
+ and then set current values.
+
+ The OpenGL instance.
+
+
+
+ Pops this object from the provided OpenGL instance.
+ This will generally pop elements of the attribute stack,
+ restoring previous attribute values.
+
+ The OpenGL instance.
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL code for the light.
+
+
+
+
+ The ambient colour of the light.
+
+
+
+
+ The diffuse color of the light.
+
+
+
+
+ The specular colour of the light.
+
+
+
+
+ The colour of the shadow created by this light.
+
+
+
+
+ True when the light is on.
+
+
+
+
+ The position of the light.
+
+
+
+
+ Should the light cast a shadow?
+
+
+
+
+ Used to aid in the implementation of IVolumeBound.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets or sets the GL code.
+
+
+ The GL code.
+
+
+
+
+ Gets or sets the position.
+
+
+ The position.
+
+
+
+
+ Gets or sets the ambient.
+
+
+ The ambient.
+
+
+
+
+ Gets or sets the diffuse.
+
+
+ The diffuse.
+
+
+
+
+ Gets or sets the specular.
+
+
+ The specular.
+
+
+
+
+ Gets or sets the color of the shadow.
+
+
+ The color of the shadow.
+
+
+
+
+ Gets or sets a value indicating whether this is on.
+
+
+ true if on; otherwise, false.
+
+
+
+
+ Gets or sets a value indicating whether [cast shadow].
+
+
+ true if [cast shadow]; otherwise, false.
+
+
+
+
+ A spotlight has a direction and a spot cutoff.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function sets all of the lights parameters into OpenGL.
+
+ The OpenGL instance.
+
+
+
+ The spotlight cutoff value (between 0-90 for spotlights, or 180 for a
+ simple light).
+
+
+
+
+ A Vector describing the direction of the spotlight.
+
+
+
+
+ Gets or sets the direction.
+
+
+ The direction.
+
+
+
+
+ Gets or sets the spot cutoff.
+
+
+ The spot cutoff.
+
+
+
+
+ The axies objects are design time rendered primitives
+ that show an RGB axies at the origin of the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A simple cube polygon.
+
+
+
+
+ A polygon contains a set of 'faces' which are indexes into a single list
+ of vertices. The main thing about polygons is that they are easily editable
+ by the user, depending on the Context they're in.
+
+
+
+
+ A SceneElement can implement IRayTracable to allow it to
+ be raytraced.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+ The intersection with the object, or null.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function is cool, just stick in a set of points, it'll add them to the
+ array, and create a face. It will take account of duplicate vertices too!
+
+ A set of vertices to make into a face.
+
+
+
+ Triangulate this polygon.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This creates a polygon from a height map (any picture). Black is low,
+ and the colors are high (the lighter the color, the higher the surface).
+
+ Path of the image file.
+ Number of points along X.
+ Number of points along Y.
+ True if sucessful, false otherwise.
+
+
+
+ This function performs lossless optimisation on the polygon, it should be
+ called when the geometry changes, and the polygon goes into static mode.
+
+ The amount of optimisation (as a %).
+
+
+
+ Call this function as soon as you change the polygons geometry, it will
+ re-generate normals, etc.
+
+ Regenerate Normals.
+
+
+
+ This function tests to see if a ray interesects the polygon.
+
+ The ray you want to test.
+
+ The distance from the origin of the ray to the intersection, or -1 if there
+ is no intersection.
+
+
+
+
+ Raytraces the specified ray. If an intersection is found, it is returned,
+ otherwise null is returned.
+
+ The ray.
+ The scene.
+
+ The intersection with the object, or null.
+
+
+
+
+ This function subdivides the faces of this polygon.
+
+ If set to true the faces will be smoothed.
+ The number of faces in the new subdivided polygon.
+
+
+
+ Freezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Unfreezes this instance using the provided OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ Creates a new object that is a copy of the current instance.
+
+
+ A new object that is a copy of this instance.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ The freezable helper.
+
+
+
+
+ The faces that make up the polygon.
+
+
+
+
+ The vertices that make up the polygon.
+
+
+
+
+ The UV coordinates (texture coodinates) for the polygon.
+
+
+
+
+ The normals of the polygon object.
+
+
+
+
+ Should the normals be drawn?
+
+
+
+
+ The bounding volume helper - used to ease implementation of IBoundVolume.
+
+
+
+
+ Gets or sets the faces.
+
+
+ The faces.
+
+
+
+
+ Gets or sets the vertices.
+
+
+ The vertices.
+
+
+
+
+ Gets or sets the U vs.
+
+
+ The U vs.
+
+
+
+
+ Gets or sets the normals.
+
+
+ The normals.
+
+
+
+
+ Gets or sets a value indicating whether [draw normals].
+
+
+ true if [draw normals]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ Gets a value indicating whether this instance is frozen.
+
+
+ true if this instance is frozen; otherwise, false.
+
+
+
+
+ Material to be used when rendering the polygon in lighted mode.
+ This material may be overriden on a per-face basis.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ This function makes a simple cube shape.
+
+
+
+
+ A Folder is used to organise scene elements.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ The Grid design time primitive is displays a grid in the scene.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Creates the display list. This function draws the
+ geometry as well as compiling it.
+
+
+
+
+ The internal display list.
+
+
+
+
+ A Shadow object can be added as a child of a polygon.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ This function calculates the neighbours in a face.
+
+
+
+
+ Casts a real time 3D shadow.
+
+ The OpenGL object.
+ The lights.
+
+
+
+ This is part of the shadow casting code, it does a shadowpass for the
+ polygon using the specified light.
+
+ The OpenGL object.
+ The light casting the shadow.
+ An array of bools.
+
+
+
+ Are the face neighbours calculated?
+
+
+
+
+ The size of the shadow in each direction.
+
+
+
+
+ Gets the parent polygon.
+
+
+
+
+ Gets or sets the size of the shadow.
+
+
+ The size of the shadow.
+
+
+
+
+ The standard OpenGL teapot.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Draws the specified gl.
+
+ The gl.
+ The grid.
+ The scale.
+ The type.
+
+
+
+ Gets or sets the grid.
+
+
+ The grid.
+
+
+
+
+ Gets or sets the scale.
+
+
+ The scale.
+
+
+
+
+ Gets or sets the type of the fill.
+
+
+ The type of the fill.
+
+
+
+
+ Material to be used when rendering the teapot in lighted mode.
+
+
+ The material.
+
+
+
+
+ Extensions for Array type.
+
+
+
+
+ Flattens the specified array.
+
+ The array type.
+ The array.
+ The flattened array.
+
+
+
+ The Cylinder class wraps the cylinder quadric.
+
+
+
+
+ Quadric is the base class for all SharpGL quadric objects.
+ It can be interacted with and it can be rendered.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Pushes us into Object Space using the transformation into the specified OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Pops us from Object Space using the transformation into the specified OpenGL instance.
+
+ The gl.
+
+
+
+ This is the pointer to the opengl quadric object.
+
+
+
+
+ The draw style, can be filled, line, silouhette or points.
+
+
+
+
+ The IHasObjectSpace helper.
+
+
+
+
+ Gets or sets the quadric draw style.
+
+
+ The quadric draw style.
+
+
+
+
+ Gets or sets the normal orientation.
+
+
+ The normal orientation.
+
+
+
+
+ Gets or sets the normal generation.
+
+
+ The normal generation.
+
+
+
+
+ Gets or sets a value indicating whether [texture coords].
+
+
+ true if [texture coords]; otherwise, false.
+
+
+
+
+ Gets the transformation that pushes us into object space.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Material to be used when rendering the quadric in lighted mode.
+
+
+ The material.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Sphere data.
+
+
+
+
+ Top radius.
+
+
+
+
+ The height.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ Helps us implement IVolumeBound.
+
+
+
+
+ Gets or sets the base radius.
+
+
+ The base radius.
+
+
+
+
+ Gets or sets the top radius.
+
+
+ The top radius.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ The Disk class wraps both the disk and partial disk quadrics.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ Gets or sets the inner radius.
+
+
+ The inner radius.
+
+
+
+
+ Gets or sets the outer radius.
+
+
+ The outer radius.
+
+
+
+
+ Gets or sets the start angle.
+
+
+ The start angle.
+
+
+
+
+ Gets or sets the sweep angle.
+
+
+ The sweep angle.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the loops.
+
+
+ The loops.
+
+
+
+
+ The Quadric draw style.
+
+
+
+
+ Points.
+
+
+
+
+ Lines.
+
+
+
+
+ Silhouette.
+
+
+
+
+ Fill.
+
+
+
+
+ The Quadric Normals.
+
+
+
+
+ None.
+
+
+
+
+ Flat.
+
+
+
+
+ Smooth.
+
+
+
+
+ The Quadric orientation.
+
+
+
+
+ Outside.
+
+
+
+
+ Inside.
+
+
+
+
+ The Sphere class wraps the sphere quadric.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Render to the provided instance of OpenGL.
+
+ The OpenGL instance.
+ The render mode.
+
+
+
+ The radius.
+
+
+
+
+ The slices.
+
+
+
+
+ The stacks.
+
+
+
+
+ The bounding volume helper, used to aid implementation of IVolumeBound.
+
+
+
+
+ Gets or sets the radius.
+
+
+ The radius.
+
+
+
+
+ Gets or sets the slices.
+
+
+ The slices.
+
+
+
+
+ Gets or sets the stacks.
+
+
+ The stacks.
+
+
+
+
+ Gets the bounding volume.
+
+
+
+
+ An intersection.
+
+
+
+
+ Is it intersected?
+
+
+
+
+ The normal.
+
+
+
+
+ The point.
+
+
+
+
+ The closeness.
+
+
+
+
+ A Ray.
+
+
+
+
+ The light.
+
+
+
+
+ The origin.
+
+
+
+
+ The direction.
+
+
+
+
+ The Ray Tracer is an engine that renders a scene using the raytracing mechanism.
+
+
+
+
+ Renders the specified scene.
+
+ The scene.
+ The camera.
+
+ The scene rendered with raytracing.
+
+
+
+
+ A ScreenPixel, password around when raytracing.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Performs a hit test on the scene. All elements that implement IVolumeBound will
+ be hit tested.
+
+ The x.
+ The y.
+ The elements hit.
+
+
+
+ This function draws all of the objects in the scene (i.e. every quadric
+ in the quadrics arraylist etc).
+
+
+
+
+ Renders the element.
+
+ The gl.
+ The render mode.
+
+
+
+ Renders the element for hit test.
+
+ The scene element.
+ The hit map.
+ Current hit name.
+
+
+
+ Use this function to resize the scene window, and also to look through
+ the current camera.
+
+ Width of the screen.
+ Height of the screen.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ This is the OpenGL class, use it to call OpenGL functions.
+
+
+
+
+ The main scene container - this is the top level element of the Scene Tree.
+
+
+
+
+ The set of scene assets.
+
+
+
+
+ This is the camera that is currently being used to view the scene.
+
+
+
+
+ This is the colour of the background of the scene.
+
+
+
+
+ Gets or sets the open GL.
+
+
+ The open GL.
+
+
+
+
+ Gets or sets the scene container.
+
+
+ The scene container.
+
+
+
+
+ Gets the assets.
+
+
+
+
+ Gets or sets the current camera.
+
+
+ The current camera.
+
+
+
+
+ Gets or sets the color of the clear.
+
+
+ The color of the clear.
+
+
+
+
+ Gets or sets a value indicating whether [render bounding volumes].
+
+
+ true if [render bounding volumes]; otherwise, false.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ The Fragment Shader.
+
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Sets the shader source.
+
+ The source.
+
+
+
+ Loads the shader source.
+
+ The path to the shader file.
+
+
+
+ Compiles this instance.
+
+
+
+
+ The internal shader object.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ Gets the source code.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ The Shader base class.
+
+
+
+
+ Pops the effect off the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Pushes the effect onto the specified parent element.
+
+ The OpenGL instance.
+ The parent element.
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Destroy in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
+ Attaches a shader.
+
+ The shader.
+
+
+
+ Detaches the shader.
+
+ The shader.
+
+
+
+ Links this instance.
+
+
+
+
+ Gets the uniform location.
+
+ The name.
+
+
+
+
+ Sets the full shader source.
+
+ The source.
+
+
+
+
+ Gets or sets the shader object.
+
+
+ The shader object.
+
+
+
+
+ Gets the current OpenGL that the object exists in context.
+
+
+
+
+ Gets the attached shaders.
+
+
+
+
+ Gets the compile status.
+
+
+
+
+ Gets the info log.
+
+
+
+
+ The Vertex Shader object.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Create in the context of the supplied OpenGL instance.
+
+ The OpenGL instance.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.dll
new file mode 100644
index 0000000..627db96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.xml
new file mode 100644
index 0000000..e5aad3d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.WinForms.xml
@@ -0,0 +1,336 @@
+
+
+
+ SharpGL.WinForms
+
+
+
+
+ Summary description for GLColourPicker.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ This allows a list view item to be created from a material, which is really
+ useful, especially for 3D apps. For more advanced functionality, just derive
+ from this class, as there's a lot of good code here. Writing this sort of
+ class from scratch is pointless.
+
+ At the moment this class is not working properly, because of changes to the
+ material class, use with caution!
+
+
+
+
+ This function creates the list view item from a material, with an image
+ of the specified size.
+
+ The material to create it from.
+ Size of the thumbnail.
+ Size of the thumbnail.
+
+
+
+ This is the basic OpenGL control object, it gives all of the basic OpenGL functionality.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Setups the drawing timer, based on the framerate settings.
+
+
+
+
+ Initialises OpenGL.
+
+
+
+
+ Manually perform rendering.
+
+
+
+
+ Renders to the specified graphics.
+
+ The graphics to render to.
+
+
+
+ Raises the event.
+
+ A that contains the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ Calls the OpenGL initialized function.
+
+
+
+
+ Call this function in derived classes to do the OpenGL Draw event.
+
+
+
+
+ Call this function in derived classes to do the GDI Draw event.
+
+
+
+
+ Handles the Tick event of the timerDrawing control.
+
+ The source of the event.
+ The instance containing the event data.
+
+
+
+ Signals the object that initialization is starting.
+
+
+
+
+ Signals the object that initialization is complete.
+
+
+
+
+ The timer used for drawing the control.
+
+
+
+
+ The OpenGL object for the control.
+
+
+
+
+ A stopwatch used for timing rendering.
+
+
+
+
+ The render context type.
+
+
+
+
+ The last frame time in milliseconds.
+
+
+
+
+ The framerate, in hertz.
+
+
+
+
+ The default desired OpenGL version.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+ true if managed resources should be disposed; otherwise, false.
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Occurs when OpenGL has been initialized.
+
+
+
+
+ Occurs when OpenGL drawing should be performed.
+
+
+
+
+ Occurs when GDI drawing should be performed.
+
+
+
+
+ Occurs when the control is resized. Can be used to perform custom viewport projections.
+
+
+
+
+ Gets the OpenGL object.
+
+ The OpenGL.
+
+
+
+ Gets or sets a value indicating whether to draw FPS information.
+
+
+ true if FPS info should be drawn; otherwise, false.
+
+
+
+
+ Gets or sets the frame rate, in Hertz.
+
+
+ The frame rate, in Hertz.
+
+
+
+
+ Gets or sets the type of the render context.
+
+
+ The type of the render context.
+
+
+
+
+ Gets or sets the desired OpenGL version.
+
+
+ The desired OpenGL version.
+
+
+
+
+ Gets or sets the render trigger.
+
+
+ The render trigger.
+
+
+
+
+ Delegate for a Render Event.
+
+ The sender.
+ The instance containing the event data.
+
+
+
+ The RenderEventArgs - arguments used for render envets.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The graphics.
+
+
+
+ Gets the graphics.
+
+
+
+
+ The RenderingMode - specifies how and when rendering
+ will occur in an OpenGL control.
+
+
+
+
+ The Default RenderingMode, TimerBased. This mode means that
+ a timer will be set up based on the FPS property of the control.
+
+
+
+
+ Rendering must be performed manually by using the DoRender function.
+
+
+
+
+ The SceneControl is an OpenGLControl that contains and draws a Scene object.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
+ Raises the event.
+
+ The instance containing the event data.
+
+
+
+ Raises the event.
+
+ An that contains the event data.
+
+
+
+ This is the scene itself.
+
+
+
+
+ Summary description for VertexControl.
+
+
+
+
+ Required designer variable.
+
+
+
+
+ Clean up any resources being used.
+
+
+
+
+ Required method for Designer support - do not modify
+ the contents of this method with the code editor.
+
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.dll
new file mode 100644
index 0000000..5105290
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.xml b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.xml
new file mode 100644
index 0000000..3f92a4d
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SharpGL.xml
@@ -0,0 +1,4813 @@
+
+
+
+ SharpGL
+
+
+
+
+
+
+
+
+
+ Creates the specified width.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+
+ Resizes the section.
+
+ The width.
+ The height.
+ The bit count.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ This function sets the pixel format of the underlying bitmap.
+
+ The bitcount.
+
+
+
+ Destroys this instance.
+
+
+
+
+ The parent dc.
+
+
+
+
+ The bitmap handle.
+
+
+
+
+ The bits.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ Gets the handle to the bitmap.
+
+ The handle to the bitmap.
+
+
+
+ Gets the bits.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ A FontOutline entry contains the details of a font face.
+
+
+
+
+ Gets or sets the HDC.
+
+
+ The HDC.
+
+
+
+
+ Gets or sets the HRC.
+
+
+ The HRC.
+
+
+
+
+ Gets or sets the name of the face.
+
+
+ The name of the face.
+
+
+
+
+ Gets or sets the height.
+
+
+ The height.
+
+
+
+
+ Gets or sets the list base.
+
+
+ The list base.
+
+
+
+
+ Gets or sets the list count.
+
+
+ The list count.
+
+
+
+
+ Gets or sets the deviation.
+
+
+ The deviation.
+
+
+
+
+ Gets or sets the extrusion.
+
+
+ The extrusion.
+
+
+
+
+ Gets or sets the font outline format.
+
+
+ The font outline format.
+
+
+
+
+ Gets or sets the glyph metrics.
+
+
+ The glyph metrics.
+
+
+
+
+ The font outline format.
+
+
+
+
+ Render using lines.
+
+
+
+
+ Render using polygons.
+
+
+
+
+ The GLYPHMETRICSFLOAT structure contains information about the placement and orientation of a glyph in a character cell.
+
+
+
+
+ Specifies the width of the smallest rectangle (the glyph's black box) that completely encloses the glyph..
+
+
+
+
+ Specifies the height of the smallest rectangle (the glyph's black box) that completely encloses the glyph.
+
+
+
+
+ Specifies the x and y coordinates of the upper-left corner of the smallest rectangle that completely encloses the glyph.
+
+
+
+
+ Specifies the horizontal distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Specifies the vertical distance from the origin of the current character cell to the origin of the next character cell.
+
+
+
+
+ Point structure used in Win32 interop.
+
+
+
+
+ The x coord value.
+
+
+
+
+ The y coord value.
+
+
+
+
+ This class wraps the functionality of the wglUseFontOutlines function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ Draws the text.
+
+ The gl.
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+
+ The cache of font outline entries.
+
+
+
+
+ A FontBitmap entry contains the details of a font face.
+
+
+
+
+ This class wraps the functionality of the wglUseFontBitmaps function to
+ allow straightforward rendering of text.
+
+
+
+
+ Draws the text.
+
+ The gl.
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Cache of font bitmap enties.
+
+
+
+
+ The OpenGL class wraps Suns OpenGL 3D library.
+
+
+
+
+ Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
+
+
+
+
+ Treats each pair of vertices as an independent line segment. Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n + 1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
+
+
+
+
+ Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N - 1 lines are drawn.
+
+
+
+
+ Treats each triplet of vertices as an independent triangle. Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n + 1, and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Draws a connected group of triangles. one triangle is defined for each vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define triangle n. N - 2 triangles are drawn.
+
+
+
+
+ Treats each group of four vertices as an independent quadrilateral. Vertices 4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
+
+
+
+
+ Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
+
+
+
+
+ Draws a single, convex polygon. Vertices 1 through N define this polygon.
+
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Set the Accumulation Buffer operation.
+
+ Operation of the buffer.
+ Reference value.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function. Symbolic constants OpenGL.NEVER, OpenGL.LESS, OpenGL.EQUAL, OpenGL.LEQUAL, OpenGL.GREATER, OpenGL.NOTEQUAL, OpenGL.GEQUAL and OpenGL.ALWAYS are accepted. The initial value is OpenGL.ALWAYS.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Specify the Alpha Test function.
+
+ Specifies the alpha comparison function.
+ Specifies the reference value that incoming alpha values are compared to. This value is clamped to the range 0 through 1, where 0 represents the lowest possible alpha value and 1 the highest possible value. The initial reference value is 0.
+
+
+
+ Determine if textures are loaded in texture memory.
+
+ Specifies the number of textures to be queried.
+ Specifies an array containing the names of the textures to be queried.
+ Specifies an array in which the texture residence status is returned. The residence status of a texture named by an element of textures is returned in the corresponding element of residences.
+
+
+
+
+ Render a vertex using the specified vertex array element.
+
+ Specifies an index into the enabled vertex data arrays.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ Begin drawing geometry in the specified mode.
+
+ The mode to draw in, e.g. OpenGL.POLYGONS.
+
+
+
+ This function begins drawing a NURBS curve.
+
+ The NURBS object.
+
+
+
+ This function begins drawing a NURBS surface.
+
+ The NURBS object.
+
+
+
+ Call this function after creating a texture to finalise creation of it,
+ or to make an existing texture current.
+
+ The target type, e.g TEXTURE_2D.
+ The OpenGL texture object.
+
+
+
+ Draw a bitmap.
+
+ Specify the pixel width of the bitmap image.
+ Specify the pixel height of the bitmap image.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the location of the origin in the bitmap image. The origin is measured from the lower left corner of the bitmap, with right and up being the positive axes.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specify the x and y offsets to be added to the current raster position after the bitmap is drawn.
+ Specifies the address of the bitmap image.
+
+
+
+ This function sets the current blending function.
+
+ Source factor.
+ Destination factor.
+
+
+
+ This function sets the current blending function.
+
+ The source factor.
+ The destination factor.
+
+
+
+ This function calls a certain display list.
+
+ The display list to call.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists.
+
+ Specifies the number of display lists to be executed.
+ Specifies the type of values in lists. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT, OpenGL.2_BYTES, OpenGL.3_BYTES and OpenGL.4_BYTES are accepted.
+ Specifies the address of an array of name offsets in the display list. The pointer type is void because the offsets can be bytes, shorts, ints, or floats, depending on the value of type.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_BYTE version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ Execute a list of display lists. Automatically uses the GL_UNSIGNED_INT version of the function.
+
+ The number of lists.
+ The lists.
+
+
+
+ This function clears the buffers specified by mask.
+
+ Which buffers to clear.
+
+
+
+ Specify clear values for the accumulation buffer.
+
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+ Specify the red, green, blue and alpha values used when the accumulation buffer is cleared. The initial values are all 0.
+
+
+
+ This function sets the color that the drawing buffer is 'cleared' to.
+
+ Red component of the color (between 0 and 1).
+ Green component of the color (between 0 and 1).
+ Blue component of the color (between 0 and 1)./
+ Alpha component of the color (between 0 and 1).
+
+
+
+ Specify the clear value for the depth buffer.
+
+ Specifies the depth value used when the depth buffer is cleared. The initial value is 1.
+
+
+
+ Specify the clear value for the color index buffers.
+
+ Specifies the index used when the color index buffers are cleared. The initial value is 0.
+
+
+
+ Specify the clear value for the stencil buffer.
+
+ Specifies the index used when the stencil buffer is cleared. The initial value is 0.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Specify a plane against which all geometry is clipped.
+
+ Specifies which clipping plane is being positioned. Symbolic names of the form OpenGL.CLIP_PLANEi, where i is an integer between 0 and OpenGL.MAX_CLIP_PLANES -1, are accepted.
+ Specifies the address of an array of four double-precision floating-point values. These values are interpreted as a plane equation.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 255).
+ Green color component (between 0 and 255).
+ Blue color component (between 0 and 255).
+ Alpha color component (between 0 and 255).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 float values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 double values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 byte values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned int values.
+
+
+
+ Sets the current color to 'v'.
+
+ An array of either 3 or 4 unsigned short values.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component.
+
+
+
+ Sets the current color.
+
+ Red color component (between 0 and 1).
+ Green color component (between 0 and 1).
+ Blue color component (between 0 and 1).
+ Alpha color component (between 0 and 1).
+
+
+
+ This function sets the current colour mask.
+
+ Red component mask.
+ Green component mask.
+ Blue component mask.
+ Alpha component mask.
+
+
+
+ Cause a material color to track the current color.
+
+ Specifies whether front, back, or both front and back material parameters should track the current color. Accepted values are OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK. The initial value is OpenGL.FRONT_AND_BACK.
+ Specifies which of several material parameters track the current color. Accepted values are OpenGL.EMISSION, OpenGL.AMBIENT, OpenGL.DIFFUSE, OpenGL.SPECULAR and OpenGL.AMBIENT_AND_DIFFUSE. The initial value is OpenGL.AMBIENT_AND_DIFFUSE.
+
+
+
+ Define an array of colors.
+
+ Specifies the number of components per color. Must be 3 or 4.
+ Specifies the data type of each color component in the array. Symbolic constants OpenGL.BYTE, OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.UNSIGNED_SHORT, OpenGL.INT, OpenGL.UNSIGNED_INT, OpenGL.FLOAT and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive colors. If stride is 0, (the initial value), the colors are understood to be tightly packed in the array.
+ Specifies a pointer to the first component of the first color element in the array.
+
+
+
+ Copy pixels in the frame buffer.
+
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the window coordinates of the lower left corner of the rectangular region of pixels to be copied.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specify the dimensions of the rectangular region of pixels to be copied. Both must be nonnegative.
+ Specifies whether color values, depth values, or stencil values are to be copied. Symbolic constants OpenGL.COLOR, OpenGL.DEPTH, and OpenGL.STENCIL are accepted.
+
+
+
+ Copy pixels into a 1D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image. Must be 0 or 2^n = (2 * border) for some integer n. The height of the texture image is 1.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy pixels into a 2D texture image.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the internal format of the texture.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the width of the border. Must be either 0 or 1.
+
+
+
+ Copy a one-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+
+
+
+ Copy a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_2D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the texel offset within the texture array.
+ Specifies the texel offset within the texture array.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specify the window coordinates of the left corner of the row of pixels to be copied.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+
+
+
+ Specify whether front- or back-facing facets can be culled.
+
+ Specifies whether front- or back-facing facets are candidates for culling. Symbolic constants OpenGL.FRONT, OpenGL.BACK, and OpenGL.FRONT_AND_BACK are accepted. The initial value is OpenGL.BACK.
+
+
+
+ This function draws a sphere from the quadric object.
+
+ The quadric object.
+ Radius at the base.
+ Radius at the top.
+ Height of cylinder.
+ Cylinder slices.
+ Cylinder stacks.
+
+
+
+ This function deletes a list, or a range of lists.
+
+ The list to delete.
+ The range of lists (often just 1).
+
+
+
+ This function deletes the underlying glu nurbs renderer.
+
+ The pointer to the nurbs object.
+
+
+
+ This function deletes a set of Texture objects.
+
+ Number of textures to delete.
+ The array containing the names of the textures to delete.
+
+
+
+ Call this function to delete an OpenGL Quadric object.
+
+
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the current depth buffer comparison function, the default it LESS.
+
+ The comparison function to set.
+
+
+
+ This function sets the depth mask.
+
+ The depth mask flag, normally 1.
+
+
+
+ Specify mapping of depth values from normalized device coordinates to window coordinates.
+
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 0.
+ Specifies the mapping of the near clipping plane to window coordinates. The initial value is 1.
+
+
+
+ Call this function to disable an OpenGL capability.
+
+ The capability to disable.
+
+
+
+ This function disables a client state array, such as a vertex array.
+
+ The array to disable.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the starting index in the enabled arrays.
+ Specifies the number of indices to be rendered.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into. Symbolic constants OpenGL.NONE, OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.RIGHT, OpenGL.FRONT_AND_BACK, and OpenGL.AUXi, where i is between 0 and (OpenGL.AUX_BUFFERS - 1), are accepted (OpenGL.AUX_BUFFERS is not the upper limit; use glGet to query the number of available aux buffers.) The initial value is OpenGL.FRONT for single- buffered contexts, and OpenGL.BACK for double-buffered contexts.
+
+
+
+ Specify which color buffers are to be drawn into.
+
+ Specifies up to four color buffers to be drawn into.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Render primitives from array data.
+
+ Specifies what kind of primitives to render. Symbolic constants OpenGL.POINTS, OpenGL.LINE_STRIP, OpenGL.LINE_LOOP, OpenGL.LINES, OpenGL.TRIANGLE_STRIP, OpenGL.TRIANGLE_FAN, OpenGL.TRIANGLES, OpenGL.QUAD_STRIP, OpenGL.QUADS, and OpenGL.POLYGON are accepted.
+ Specifies the number of elements to be rendered.
+ Specifies the type of the values in indices. Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.UNSIGNED_SHORT, or OpenGL.UNSIGNED_INT.
+ Specifies a pointer to the location where the indices are stored.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ Pixel data buffer.
+
+
+
+ Draws a rectangle of pixel data at the current raster position.
+
+ Width of pixel data.
+ Height of pixel data.
+ Format of pixel data.
+ The GL data type.
+ Pixel data buffer.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies the current edge flag value, either OpenGL.TRUE or OpenGL.FALSE. The initial value is OpenGL.TRUE.
+
+
+
+ Define an array of edge flags.
+
+ Specifies the byte offset between consecutive edge flags. If stride is 0 (the initial value), the edge flags are understood to be tightly packed in the array.
+ Specifies a pointer to the first edge flag in the array.
+
+
+
+ Flag edges as either boundary or nonboundary.
+
+ Specifies a pointer to an array that contains a single boolean element, which replaces the current edge flag value.
+
+
+
+ Call this function to enable an OpenGL capability.
+
+ The capability you wish to enable.
+
+
+
+ This function enables one of the client state arrays, such as a vertex array.
+
+ The array to enable.
+
+
+
+ This is not an imported OpenGL function, but very useful. If 'test' is
+ true, cap is enabled, otherwise, it's disable.
+
+ The capability you want to enable.
+ The logical comparison.
+
+
+
+ Signals the End of drawing.
+
+
+
+
+ This function ends the drawing of a NURBS curve.
+
+ The nurbs object.
+
+
+
+ Ends the current display list compilation.
+
+
+
+
+ This function ends the drawing of a NURBS surface.
+
+ The nurbs object.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+ Domain coordinate.
+
+
+
+ Evaluate from the current evaluator.
+
+ Domain coordinate.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, can be POINT or LINE.
+ Beginning of range.
+ End of range.
+
+
+
+ Evaluates a 'mesh' from the current evaluators.
+
+ Drawing mode, fill, point or line.
+ Beginning of range.
+ End of range.
+ Beginning of range.
+ End of range.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+
+
+
+ Generate and evaluate a single point in a mesh.
+
+ The integer value for grid domain variable i.
+ The integer value for grid domain variable j.
+
+
+
+ This function sets the feedback buffer, that will receive feedback data.
+
+ Size of the buffer.
+ Type of data in the buffer.
+ The buffer itself.
+
+
+
+ This function is similar to flush, but in a sense does it more, as it
+ executes all commands aon both the client and the server.
+
+
+
+
+ This forces OpenGL to execute any commands you have given it.
+
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Sets a fog parameter.
+
+ The parameter to set.
+ The values to set it to.
+
+
+
+ This function sets what defines a front face.
+
+ Winding mode, counter clockwise by default.
+
+
+
+ This function creates a frustrum transformation and mulitplies it to the current
+ matrix (which in most cases should be the projection matrix).
+
+ Left clip position.
+ Right clip position.
+ Bottom clip position.
+ Top clip position.
+ Near clip position.
+ Far clip position.
+
+
+
+ This function generates 'range' number of contiguos display list indices.
+
+ The number of lists to generate.
+ The first list.
+
+
+
+ Create a set of unique texture names.
+
+ Number of names to create.
+ Array to store the texture names.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+
+
+
+
+ Return the coefficients of the specified clipping plane.
+
+ Specifies a clipping plane. The number of clipping planes depends on the implementation, but at least six clipping planes are supported. They are identified by symbolic names of the form OpenGL.CLIP_PLANEi where 0 Less Than i Less Than OpenGL.MAX_CLIP_PLANES.
+ Returns four double-precision values that are the coefficients of the plane equation of plane in eye coordinates. The initial value is (0, 0, 0, 0).
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ This function queries OpenGL for data, and puts it in the buffer supplied.
+
+ The parameter to query.
+ The buffer to put that data into.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ Get the current OpenGL error code.
+
+ The current OpenGL error code.
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ This this function to query OpenGL values.
+
+ The parameter to query.
+ The parameters
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Use this function to query OpenGL parameter values.
+
+ The Parameter to query
+ An array to put the values into.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return light source parameter values.
+
+ Specifies a light source. The number of possible lights depends on the implementation, but at least eight lights are supported. They are identified by symbolic names of the form OpenGL.LIGHTi where i ranges from 0 to the value of OpenGL.GL_MAX_LIGHTS - 1.
+ Specifies a light source parameter for light.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return evaluator parameters.
+
+ Specifies the symbolic name of a map.
+ Specifies which parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return material parameters.
+
+ Specifies which of the two materials is being queried. OpenGL.FRONT or OpenGL.BACK are accepted, representing the front and back materials, respectively.
+ Specifies the material parameter to return.
+ Returns the requested data.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the specified pixel map.
+
+ Specifies the name of the pixel map to return.
+ Returns the pixel map contents.
+
+
+
+ Return the address of the specified pointer.
+
+ Specifies the array or buffer pointer to be returned.
+ Returns the pointer value specified by parameters.
+
+
+
+ Return the polygon stipple pattern.
+
+ Returns the stipple pattern. The initial value is all 1's.
+
+
+
+ Return a string describing the current GL connection.
+
+ Specifies a symbolic constant, one of OpenGL.VENDOR, OpenGL.RENDERER, OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ Pointer to the specified string.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Return texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE, and OpenGL.TEXTURE_ENV_COLOR.
+ Returns the requested data.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Return a texture image.
+
+ Specifies which texture is to be obtained. OpenGL.TEXTURE_1D and OpenGL.TEXTURE_2D are accepted.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a pixel format for the returned data.
+ Specifies a pixel type for the returned data.
+ Returns the texture image. Should be a pointer to an array of the type specified by type.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values for a specific level of detail.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the level-of-detail number of the desired image. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies the symbolic name of a texture parameter.
+ Returns the requested data.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Return texture parameter values.
+
+ Specifies the symbolic name of the target texture.
+ Specifies the symbolic name of a texture parameter.
+ Returns the texture parameters.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Specify implementation-specific hints.
+
+ Specifies a symbolic constant indicating the behavior to be controlled.
+ Specifies a symbolic constant indicating the desired behavior.
+
+
+
+ Control the writing of individual bits in the color index buffers.
+
+ Specifies a bit mask to enable and disable the writing of individual bits in the color index buffers. Initially, the mask is all 1's.
+
+
+
+ Define an array of color indexes.
+
+ Specifies the data type of each color index in the array. Symbolic constants OpenGL.UNSIGNED_BYTE, OpenGL.SHORT, OpenGL.INT, OpenGL.FLOAT, and OpenGL.DOUBLE are accepted.
+ Specifies the byte offset between consecutive color indexes. If stride is 0 (the initial value), the color indexes are understood to be tightly packed in the array.
+ Specifies a pointer to the first index in the array.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ Set the current color index.
+
+ Specifies the new value for the current color index.
+
+
+
+ This function initialises the select buffer names.
+
+
+
+
+ Simultaneously specify and enable several interleaved arrays.
+
+ Specifies the type of array to enable.
+ Specifies the offset in bytes between each aggregate array element.
+ The array.
+
+
+
+ Use this function to query if a certain OpenGL function is enabled or not.
+
+ The capability to test.
+ True if the capability is enabled, otherwise, false.
+
+
+
+ This function determines whether a specified value is a display list.
+
+ The value to test.
+ TRUE if it is a list, FALSE otherwise.
+
+
+
+ Determine if a name corresponds to a texture.
+
+ Specifies a value that may be the name of a texture.
+ True if texture is a texture object.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ This function sets a parameter of the lighting model.
+
+ The name of the parameter.
+ The parameter to set it to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The value that you want to set the parameter to.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Set the parameter (pname) of the light 'light'.
+
+ The light you wish to set parameters for.
+ The parameter you want to set.
+ The parameters.
+
+
+
+ Specify the line stipple pattern.
+
+ Specifies a multiplier for each bit in the line stipple pattern. If factor is 3, for example, each bit in the pattern is used three times before the next bit in the pattern is used. factor is clamped to the range [1, 256] and defaults to 1.
+ Specifies a 16-bit integer whose bit pattern determines which fragments of a line will be drawn when the line is rasterized. Bit zero is used first; the default pattern is all 1's.
+
+
+
+ Set's the current width of lines.
+
+ New line width to set.
+
+
+
+ Set the display-list base for glCallLists.
+
+ Specifies an integer offset that will be added to glCallLists offsets to generate display-list names. The initial value is 0.
+
+
+
+ Call this function to load the identity matrix into the current matrix stack.
+
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Replace the current matrix with the specified matrix.
+
+ Specifies a pointer to 16 consecutive values, which are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function replaces the name at the top of the selection names stack
+ with 'name'.
+
+ The name to replace it with.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ Specify a logical pixel operation for color index rendering.
+
+ Specifies a symbolic constant that selects a logical operation.
+
+
+
+ This function transforms the projection matrix so that it looks at a certain
+ point, from a certain point.
+
+ Position of the eye.
+ Position of the eye.
+ Position of the eye.
+ Point to look at.
+ Point to look at.
+ Point to look at.
+ 'Up' Vector X Component.
+ 'Up' Vector Y Component.
+ 'Up' Vector Z Component.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 1D evaluator.
+
+ What the control points represent (e.g. MAP1_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u'.
+ Offset between beginning of one control point, and beginning of next.
+ The degree plus one, should agree with the number of control points.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ Defines a 2D evaluator.
+
+ What the control points represent (e.g. MAP2_VERTEX_3).
+ Range of the variable 'u'.
+ Range of the variable 'u.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ Range of the variable 'v'.
+ Range of the variable 'v'.
+ Offset between beginning of one control point and the next.
+ The degree plus one.
+ The data for the points.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function defines a grid that goes from u1 to u1 in n steps, evenly spaced,
+ and the same for v.
+
+ Number of steps.
+ Range of variable 'u'.
+ Range of variable 'u'.
+ Number of steps.
+ Range of variable 'v'.
+ Range of variable 'v'.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ This function sets a material parameter.
+
+ What faces is this parameter for (i.e front/back etc).
+ What parameter you want to set.
+ The value to set 'pname' to.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Set the current matrix mode (the matrix that matrix operations will be
+ performed on).
+
+ The mode, normally PROJECTION or MODELVIEW.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ Multiply the current matrix with the specified matrix.
+
+ Points to 16 consecutive values that are used as the elements of a 4x4 column-major matrix.
+
+
+
+ This function starts compiling a new display list.
+
+ The list to compile.
+ Either COMPILE or COMPILE_AND_EXECUTE.
+
+
+
+ This function creates a new glu NURBS renderer object.
+
+ A Pointer to the NURBS renderer.
+
+
+
+ This function creates a new OpenGL Quadric Object.
+
+ The pointer to the Quadric Object.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set the current normal.
+
+ Normal Coordinate.
+ Normal Coordinate.
+ Normal Coordinate.
+
+
+
+ This function sets the current normal.
+
+ The normal.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ Set's the pointer to the normal array.
+
+ The type of data.
+ The space in bytes between each normal.
+ The normals.
+
+
+
+ This function defines a NURBS Curve.
+
+ The NURBS object.
+ The number of knots.
+ The knots themselves.
+ The stride, i.e. distance between vertices in the
+ control points array.
+ The array of control points.
+ The order of the polynomial.
+ The type of data to generate.
+
+
+
+ This function sets a NURBS property.
+
+ The object to set the property for.
+ The property to set.
+ The new value of the property.
+
+
+
+ This function defines a NURBS surface.
+
+ The NURBS object.
+ The sknots count.
+ The s-knots.
+ The number of t-knots.
+ The t-knots.
+ The distance between s vertices.
+ The distance between t vertices.
+ The control points.
+ The order of the s polynomial.
+ The order of the t polynomial.
+ The type of data to generate.
+
+
+
+ This function creates an orthographic projection matrix (i.e one with no
+ perspective) and multiplies it to the current matrix stack, which would
+ normally be 'PROJECTION'.
+
+ Left clipping plane.
+ Right clipping plane.
+ Bottom clipping plane.
+ Top clipping plane.
+ Near clipping plane.
+ Far clipping plane.
+
+
+
+ This function creates an orthographic project based on a screen size.
+
+ Left of the screen. (Normally 0).
+ Right of the screen.(Normally width).
+ Bottom of the screen (normally 0).
+ Top of the screen (normally height).
+
+
+
+ This function draws a partial disk from the quadric object.
+
+ The Quadric objec.t
+ Radius of the inside of the disk.
+ Radius of the outside of the disk.
+ The slices.
+ The loops.
+ Starting angle.
+ Sweep angle.
+
+
+
+ Place a marker in the feedback buffer.
+
+ Specifies a marker value to be placed in the feedback buffer following a OpenGL.PASS_THROUGH_TOKEN.
+
+
+
+ This function creates a perspective matrix and multiplies it to the current
+ matrix stack (which in most cases should be 'PROJECTION').
+
+ Field of view angle (human eye = 60 Degrees).
+ Apsect Ratio (width of screen divided by height of screen).
+ Near clipping plane (normally 1).
+ Far clipping plane.
+
+
+
+ This function creates a 'pick matrix' normally used for selecting objects that
+ are at a certain point on the screen.
+
+ X Point.
+ Y Point.
+ Width of point to test (4 is normal).
+ Height of point to test (4 is normal).
+ The current viewport.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set up pixel transfer maps.
+
+ Specifies a symbolic map name.
+ Specifies the size of the map being defined.
+ Specifies an array of mapsize values.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel storage modes.
+
+ Specifies the symbolic name of the parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Set pixel transfer modes.
+
+ Specifies the symbolic name of the pixel transfer parameter to be set.
+ Specifies the value that pname is set to.
+
+
+
+ Specify the pixel zoom factors.
+
+ Specify the x and y zoom factors for pixel write operations.
+ Specify the x and y zoom factors for pixel write operations.
+
+
+
+ The size of points to be rasterised.
+
+ Size in pixels.
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ This sets the current drawing mode of polygons (points, lines, filled).
+
+ The faces this applies to (front, back or both).
+ The mode to set to (points, lines, or filled).
+
+
+
+ Set the scale and units used to calculate depth values.
+
+ Specifies a scale factor that is used to create a variable depth offset for each polygon. The initial value is 0.
+ Is multiplied by an implementation-specific value to create a constant depth offset. The initial value is 0.
+
+
+
+ Set the polygon stippling pattern.
+
+ Specifies a pointer to a 32x32 stipple pattern that will be unpacked from memory in the same way that glDrawPixels unpacks pixels.
+
+
+
+ This function restores the attribute stack to the state it was when
+ PushAttrib was called.
+
+
+
+
+ Pop the client attribute stack.
+
+
+
+
+ Restore the previously saved state of the current matrix stack.
+
+
+
+
+ This takes the top name off the selection names stack.
+
+
+
+
+ Set texture residence priority.
+
+ Specifies the number of textures to be prioritized.
+ Specifies an array containing the names of the textures to be prioritized.
+ Specifies an array containing the texture priorities. A priority given in an element of priorities applies to the texture named by the corresponding element of textures.
+
+
+
+ This function Maps the specified object coordinates into window coordinates.
+
+ The object's x coord.
+ The object's y coord.
+ The object's z coord.
+ The modelview matrix.
+ The projection matrix.
+ The viewport.
+ The window x coord.
+ The Window y coord.
+ The Window z coord.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Save the current state of the attribute groups specified by 'mask'.
+
+ The attibute groups to save.
+
+
+
+ Push the client attribute stack.
+
+ Specifies a mask that indicates which attributes to save.
+
+
+
+ Save the current state of the current matrix stack.
+
+
+
+
+ This function adds a new name to the selection buffer.
+
+ The name to add.
+
+
+
+ This set's the Generate Normals propery of the specified Quadric object.
+
+ The quadric object.
+ The type of normals to generate.
+
+
+
+ This function sets the type of texture coordinates being generated by
+ the specified quadric object.
+
+ The quadric object.
+ The type of coordinates to generate.
+
+
+
+ This sets the orientation for the quadric object.
+
+ The quadric object.
+ The orientation.
+
+
+
+ This sets the current drawstyle for the Quadric Object.
+
+ The quadric object.
+ The draw style.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+
+
+
+ This function sets the current raster position.
+
+ The coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ This function sets the current raster position.
+
+ X coordinate.
+ Y coordinate.
+ Z coordinate.
+ W coordinate.
+
+
+
+ Select a color buffer source for pixels.
+
+ Specifies a color buffer. Accepted values are OpenGL.FRONT_LEFT, OpenGL.FRONT_RIGHT, OpenGL.BACK_LEFT, OpenGL.BACK_RIGHT, OpenGL.FRONT, OpenGL.BACK, OpenGL.LEFT, OpenGL.GL_RIGHT, and OpenGL.AUXi, where i is between 0 and OpenGL.AUX_BUFFERS - 1.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Reads a block of pixels from the frame buffer.
+
+ Top-Left X value.
+ Top-Left Y value.
+ Width of block to read.
+ Height of block to read.
+ Specifies the format of the pixel data. The following symbolic values are accepted: OpenGL.COLOR_INDEX, OpenGL.STENCIL_INDEX, OpenGL.DEPTH_COMPONENT, OpenGL.RED, OpenGL.GREEN, OpenGL.BLUE, OpenGL.ALPHA, OpenGL.RGB, OpenGL.RGBA, OpenGL.LUMINANCE and OpenGL.LUMINANCE_ALPHA.
+ Specifies the data type of the pixel data.Must be one of OpenGL.UNSIGNED_BYTE, OpenGL.BYTE, OpenGL.BITMAP, OpenGL.UNSIGNED_SHORT, OpenGL.SHORT, OpenGL.UNSIGNED_INT, OpenGL.INT or OpenGL.FLOAT.
+ Storage for the pixel data received.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ Draw a rectangle from two coordinates (top-left and bottom-right).
+
+ Top-Left X value.
+ Top-Left Y value.
+ Bottom-Right X Value.
+ Bottom-Right Y Value.
+
+
+
+ Draw a rectangle from two coordinates, expressed as arrays, e.g
+ Rect(new float[] {0, 0}, new float[] {10, 10});
+
+ Top-Left point.
+ Bottom-Right point.
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function sets the current render mode (render, feedback or select).
+
+ The Render mode (RENDER, SELECT or FEEDBACK).
+ The hits that selection or feedback caused..
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function applies a rotation transformation to the current matrix.
+
+ The angle to rotate.
+ Amount along x.
+ Amount along y.
+ Amount along z.
+
+
+
+ This function quickly does three rotations, one about each axis, with the
+ given angles (it's not an OpenGL function, but very useful).
+
+ The angle to rotate about x.
+ The angle to rotate about y.
+ The angle to rotate about z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ This function applies a scale transformation to the current matrix.
+
+ The amount to scale along x.
+ The amount to scale along y.
+ The amount to scale along z.
+
+
+
+ Define the scissor box.
+
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the lower left corner of the scissor box. Initially (0, 0).
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+ Specify the width and height of the scissor box. When a GL context is first attached to a window, width and height are set to the dimensions of that window.
+
+
+
+ This function sets the current select buffer.
+
+ The size of the buffer you are passing.
+ The buffer itself.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ Select flat or smooth shading.
+
+ Specifies a symbolic value representing a shading technique. Accepted values are OpenGL.FLAT and OpenGL.SMOOTH. The default is OpenGL.SMOOTH.
+
+
+
+ This function draws a sphere from a Quadric Object.
+
+ The quadric object.
+ Sphere radius.
+ Slices of the sphere.
+ Stakcs of the sphere.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the current stencil buffer function.
+
+ The function type.
+ The function reference.
+ The function mask.
+
+
+
+ This function sets the stencil buffer mask.
+
+ The mask.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the stencil buffer operation.
+
+ Fail operation.
+ Depth fail component.
+ Depth pass component.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates. WARNING: if you
+ can call something more explicit, like TexCoord2f then call that, it's
+ much faster.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Array of 1,2,3 or 4 Texture Coordinates.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the current texture coordinates.
+
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+ Texture Coordinate.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ This function sets the texture coord array.
+
+ The number of coords per set.
+ The type of data.
+ The number of bytes between coords.
+ The coords.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a single-valued texture environment parameter. Must be OpenGL.TEXTURE_ENV_MODE.
+ Specifies a single symbolic constant, one of OpenGL.MODULATE, OpenGL.DECAL, OpenGL.BLEND, or OpenGL.REPLACE.
+
+
+
+ Set texture environment parameters.
+
+ Specifies a texture environment. Must be OpenGL.TEXTURE_ENV.
+ Specifies the symbolic name of a texture environment parameter. Accepted values are OpenGL.TEXTURE_ENV_MODE and OpenGL.TEXTURE_ENV_COLOR.
+ Specifies a pointer to a parameter array that contains either a single symbolic constant or an RGBA color.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function. Must be OpenGL.TEXTURE_GEN_MODE.
+ Specifies a single-valued texture generation parameter, one of OpenGL.OBJECT_LINEAR, OpenGL.GL_EYE_LINEAR, or OpenGL.SPHERE_MAP.
+
+
+
+ Control the generation of texture coordinates.
+
+ Specifies a texture coordinate. Must be one of OpenGL.S, OpenGL.T, OpenGL.R, or OpenGL.Q.
+ Specifies the symbolic name of the texture-coordinate generation function or function parameters. Must be OpenGL.TEXTURE_GEN_MODE, OpenGL.OBJECT_PLANE, or OpenGL.EYE_PLANE.
+ Specifies a pointer to an array of texture generation parameters. If pname is OpenGL.TEXTURE_GEN_MODE, then the array must contain a single symbolic constant, one of OpenGL.OBJECT_LINEAR, OpenGL.EYE_LINEAR, or OpenGL.SPHERE_MAP. Otherwise, params holds the coefficients for the texture-coordinate generation function specified by pname.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the image for the currently binded texture.
+
+ The type of texture, TEXTURE_2D or PROXY_TEXTURE_2D.
+ For mip-map textures, ordinary textures should be '0'.
+ The format of the data you are want OpenGL to create, e.g RGB16.
+ The width of the texture image (must be a power of 2, e.g 64).
+ The height of the texture image (must be a power of 2, e.g 32).
+ The width of the border (0 or 1).
+ The format of the data you are passing, e.g. RGBA.
+ The type of data you are passing, e.g GL_BYTE.
+ The actual pixel data.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ This function sets the parameters for the currently binded texture object.
+
+ The type of texture you are setting the parameter to, e.g. TEXTURE_2D
+ The parameter to set.
+ The value to set it to.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Specify a two-dimensional texture subimage.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the level-of-detail number. Level 0 is the base image level. Level n is the nth mipmap reduction image.
+ Specifies a texel offset in the x direction within the texture array.
+ Specifies a texel offset in the y direction within the texture array.
+ Specifies the width of the texture subimage.
+ Specifies the height of the texture subimage.
+ Specifies the format of the pixel data.
+ Specifies the data type of the pixel data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function applies a translation transformation to the current matrix.
+
+ The amount to translate along the x axis.
+ The amount to translate along the y axis.
+ The amount to translate along the z axis.
+
+
+
+ This function turns a screen Coordinate into a world coordinate.
+
+ Screen Coordinate.
+ Screen Coordinate.
+ Screen Coordinate.
+ Current ModelView matrix.
+ Current Projection matrix.
+ Current Viewport.
+ The world coordinate.
+ The world coordinate.
+ The world coordinate.
+
+
+
+ This is a convenience function. It calls UnProject with the current
+ viewport, modelview and persective matricies, saving you from getting them.
+ To use you own matricies, all the other version of UnProject.
+
+ X Coordinate (Screen Coordinate).
+ Y Coordinate (Screen Coordinate).
+ Z Coordinate (Screen Coordinate).
+ The world coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ Specifies the coordinate.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Sets the current vertex (must be called between 'Begin' and 'End').
+
+ An array of 2, 3 or 4 floats.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ Set the current vertex (must be called between 'Begin' and 'End').
+
+ X Value.
+ Y Value.
+ Z Value.
+ W Value.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The data type.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This function sets the address of the vertex pointer array.
+
+ The number of coords per vertex.
+ The byte offset between vertices.
+ The array.
+
+
+
+ This sets the viewport of the current Render Context. Normally x and y are 0
+ and the width and height are just those of the control/graphics you are drawing
+ to.
+
+ Top-Left point of the viewport.
+ Top-Left point of the viewport.
+ Width of the viewport.
+ Height of the viewport.
+
+
+
+ Produce an error string from a GL or GLU error code.
+
+ Specifies a GL or GLU error code.
+ The OpenGL/GLU error string.
+
+
+
+ Return a string describing the GLU version or GLU extensions.
+
+ Specifies a symbolic constant, one of OpenGL.VERSION, or OpenGL.EXTENSIONS.
+ The GLU string.
+
+
+
+ Scale an image to an arbitrary size.
+
+ Specifies the format of the pixel data.
+ Specify the width of the source image that is scaled.
+ Specify the height of the source image that is scaled.
+ Specifies the data type for dataIn.
+ Specifies a pointer to the source image.
+ Specify the width of the destination image.
+ Specify the height of the destination image.
+ Specifies the data type for dataOut.
+ Specifies a pointer to the destination image.
+
+
+
+ Create 1-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Create 2-D mipmaps.
+
+ Specifies the target texture. Must be OpenGL.TEXTURE_1D.
+ Specifies the number of color components in the texture. Must be 1, 2, 3, or 4.
+ Specifies the width of the texture image.
+ Specifies the height of the texture image.
+ Specifies the format of the pixel data.
+ Specifies the data type for data.
+ Specifies a pointer to the image data in memory.
+
+
+
+ Draw a disk.
+
+ Specifies the quadrics object (created with gluNewQuadric).
+ Specifies the inner radius of the disk (may be 0).
+ Specifies the outer radius of the disk.
+ Specifies the number of subdivisions around the z axis.
+ Specifies the number of concentric rings about the origin into which the disk is subdivided.
+
+
+
+ Create a tessellation object.
+
+ A new GLUtesselator poiner.
+
+
+
+ Delete a tesselator object.
+
+ The tesselator pointer.
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies a pointer to user polygon data.
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Specify a vertex on a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the location of the vertex.
+ Specifies an opaque pointer passed back to the program with the vertex callback (as specified by gluTessCallback).
+
+
+
+ Delimit a contour description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Delimit a polygon description.
+
+ Specifies the tessellation object (created with gluNewTess).
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Specify a normal for a polygon.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the first component of the normal.
+ Specifies the second component of the normal.
+ Specifies the third component of the normal.
+
+
+
+ Set a tessellation object property.
+
+ Specifies the tessellation object (created with gluNewTess).
+ Specifies the property to be set.
+ Specifies the value of the indicated property.
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Delimit a NURBS trimming loop definition.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+
+
+
+ Describe a piecewise linear NURBS trimming curve.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the number of points on the curve.
+ Specifies an array containing the curve points.
+ Specifies the offset (a number of single-precision floating-point values) between points on the curve.
+ Specifies the type of curve. Must be either OpenGL.MAP1_TRIM_2 or OpenGL.MAP1_TRIM_3.
+
+
+
+ Load NURBS sampling and culling matrice.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies a modelview matrix (as from a glGetFloatv call).
+ Specifies a projection matrix (as from a glGetFloatv call).
+ Specifies a viewport (as from a glGetIntegerv call).
+
+
+
+ Get a NURBS property.
+
+ Specifies the NURBS object (created with gluNewNurbsRenderer).
+ Specifies the property whose value is to be fetched.
+ Specifies a pointer to the location into which the value of the named property is written.
+
+
+
+ Gets the error description for a given error code.
+
+ The error code.
+ The error description for the given error code.
+
+
+
+ Called before an OpenGL call to enable error checking and ensure the
+ correct OpenGL context is correct.
+
+
+
+
+ Called after an OpenGL call to enable error checking.
+
+
+
+
+ This function transforms a windows point into an OpenGL point,
+ which is measured from the bottom left of the screen.
+
+ The x coord.
+ The y coord.
+
+
+
+ Creates the OpenGL instance.
+
+ The OpenGL version requested.
+ Type of the render context.
+ The drawing context width.
+ The drawing context height.
+ The bit depth.
+ The parameter.
+
+
+
+
+ Creates the OpenGL instance using an external, existing render context.
+
+ The OpenGL version requested.
+ The width.
+ The height.
+ The bit depth.
+ The window handle.
+ The render context handle.
+ The device context handle.
+
+ True on success
+
+
+
+
+ Makes the OpenGL instance current.
+
+
+
+
+ Makes no render context current.
+
+
+
+
+ Blits to the specified device context handle.
+
+ The device context handle.
+
+
+
+ Set the render context dimensions.
+
+ The width (in pixels).
+ The height (in pixels).
+
+
+
+ GDIs the coordinateto open GL coordinate.
+
+ The x coordinate.
+ The y coordinate.
+
+
+
+ Draws the text.
+
+ The x.
+ The y.
+ The r.
+ The g.
+ The b.
+ Name of the face.
+ Size of the font.
+ The text.
+
+
+
+ Draws 3D text.
+
+ Name of the face.
+ Size of the font.
+ The deviation.
+ The extrusion.
+ The text.
+
+
+
+ The current OpenGL instance.
+
+
+
+
+ The render context provider.
+
+
+
+
+ Set to true if we're inside glBegin.
+
+
+
+
+ The fontbitmaps object is used to allow easy rendering of text.
+
+
+
+
+ The FontOutlines object is used to allow rendering of text.
+
+
+
+
+ Determines whether a named extension function is supported.
+
+ Name of the extension function.
+
+ true if the extension function is supported; otherwise, false.
+
+
+
+
+ Invokes an extension function.
+
+ The extension delegate type.
+ The arguments to the pass to the function.
+ The return value of the extension function.
+
+
+
+ The set of extension functions.
+
+
+
+
+ Compile a shader object
+
+ Specifies the shader object to be compiled.
+
+
+
+ Create a shader object
+
+ Specifies the type of shader to be created. Must be either GL_VERTEX_SHADER or GL_FRAGMENT_SHADER.
+ This function returns 0 if an error occurs creating the shader object. Otherwise the shader id is returned.
+
+
+
+ Returns an integer that represents the location of a specific uniform variable within a program object. name must be a null terminated string that contains no white space. name must be an active uniform variable name in program that is not a structure, an array of structures, or a subcomponent of a vector or a matrix. This function returns -1 if name does not correspond to an active uniform variable in program, if name starts with the reserved prefix "gl_", or if name is associated with an atomic counter or a named uniform block.
+
+ Specifies the program object to be queried.
+ Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
+
+
+
+
+ Replace the source code in a shader object
+
+ Specifies the handle of the shader object whose source code is to be replaced.
+ The source.
+
+
+
+ Specify a three-dimensional texture subimage.
+
+ The target.
+ The level.
+ The internalformat.
+ The width.
+ The height.
+ The depth.
+ The border.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Texes the sub image3 DEXT.
+
+ The target.
+ The level.
+ The xoffset.
+ The yoffset.
+ The zoffset.
+ The width.
+ The height.
+ The depth.
+ The format.
+ The type.
+ The pixels.
+
+
+
+ Render primitives from array data.
+
+ The mode.
+ The start.
+ The end.
+ The count.
+ The type.
+ The indices.
+
+
+
+ Gets the ARB extensions string.
+
+
+
+
+
+ Gets the render context provider.
+
+ The render context provider.
+
+
+
+ Gets the vendor.
+
+ The vendor.
+
+
+
+ Gets the renderer.
+
+ The renderer.
+
+
+
+ Gets the version.
+
+ The version.
+
+
+
+ Gets the extensions.
+
+ The extensions.
+
+
+
+ AccumOp
+
+
+
+
+ The alpha function
+
+
+
+
+ The OpenGL Attribute flags.
+
+
+
+
+ The begin mode.
+
+
+
+
+ BlendingDestinationFactor
+
+
+
+
+ The blending source factor.
+
+
+
+
+
+
+
+
+
+ The Clip Plane Name
+
+
+
+
+ The Cull Face mode.
+
+
+
+
+
+
+
+
+
+ The Data Type.
+
+
+
+
+
+
+
+
+
+ The depth function
+
+
+
+
+ The Draw Buffer Mode
+
+
+
+
+ Error Code
+
+
+
+
+ FeedBackMode
+
+
+
+
+ The Feedback Token
+
+
+
+
+ The Fog Mode.
+
+
+
+
+
+
+
+
+
+ GetMapTarget
+
+
+
+
+ The Front Face Mode.
+
+
+
+
+ The hint mode.
+
+
+
+
+ The
+
+
+
+
+ The hint target.
+
+
+
+
+ LightName
+
+
+
+
+ LightParameter
+
+
+
+
+ The Light Model Parameter.
+
+
+
+
+ The Logic Op
+
+
+
+
+ The matrix mode.
+
+
+
+
+ The pixel transfer parameter name
+
+
+
+
+ The Polygon mode.
+
+
+
+
+ Render as points.
+
+
+
+
+ Render as lines.
+
+
+
+
+ Render as filled.
+
+
+
+
+ Rendering Mode
+
+
+
+
+ ShadingModel
+
+
+
+
+ The stencil function
+
+
+
+
+ The stencil operation.
+
+
+
+
+ GetTextureParameter
+
+
+
+
+ Texture target.
+
+
+
+
+ Defines the contract for a type that can provide an OpenGL render context.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+
+
+
+
+ Only valid to be called after the render context is created, this function attempts to
+ move the render context to the OpenGL version originally requested. If this is > 2.1, this
+ means building a new context. If this fails, we'll have to make do with 2.1.
+
+ The OpenGL instance.
+
+
+
+ The render context handle.
+
+
+
+
+ The device context handle.
+
+
+
+
+ The width.
+
+
+
+
+ The height.
+
+
+
+
+ The bit depth.
+
+
+
+
+ Is gdi drawing enabled?
+
+
+
+
+ The version of OpenGL that was requested when creating the render context.
+
+
+
+
+ The actual version of OpenGL that is supported by the render context.
+
+
+
+
+ Gets the render context handle.
+
+
+
+
+ Gets the device context handle.
+
+
+
+
+ Gets or sets the width.
+
+ The width.
+
+
+
+ Gets or sets the height.
+
+ The height.
+
+
+
+ Gets or sets the bit depth.
+
+ The bit depth.
+
+
+
+ Gets a value indicating whether GDI drawing is enabled for this type of render context.
+
+ true if GDI drawing is enabled; otherwise, false.
+
+
+
+ Gets the OpenGL version that was requested when creating the render context.
+
+
+
+
+ Gets the OpenGL version that is supported by the render context, compare to .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The extra parameter.
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ The DIB Section object.
+
+
+
+
+ Gets the DIB section.
+
+ The DIB section.
+
+
+
+ Render context provider for working with an external render context
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The existing window handle.
+ The handle to the existing render context.
+ The handle to the existing device context.
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter
+
+
+
+
+ Gets the internal DIB section.
+
+ The internal DIB section.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Creates the render context provider. Must also create the OpenGL extensions.
+
+ The desired OpenGL version.
+ The OpenGL context.
+ The width.
+ The height.
+ The bit depth.
+ The parameter.
+
+ A valid Window Handle must be provided for the NativeWindowRenderContextProvider
+
+
+
+ Destroys the render context provider instance.
+
+
+
+
+ Sets the dimensions of the render context provider.
+
+ Width.
+ Height.
+
+
+
+ Blit the rendered data to the supplied device context.
+
+ The HDC.
+
+
+
+ Makes the render context current.
+
+
+
+
+ The window handle.
+
+
+
+
+ The render context type.
+
+
+
+
+ A DIB section - offscreen but NEVER hardware accelerated.
+
+
+
+
+ A Native Window - directly render to a window, the window handle
+ must be passed as the parameter to Create. Hardware acceleration
+ is supported but one can never do GDI drawing on top of the
+ OpenGL drawing.
+
+
+
+
+ A Hidden Window - more initial overhead but acceleratable.
+
+
+
+
+ A Framebuffer Object - accelerated but may not be supported on some cards.
+
+
+
+
+ This is the base class for all shaders (vertex and fragment). It offers functionality
+ which is core to all shaders, such as file loading and binding.
+
+
+
+
+ The OpenGL shader object.
+
+
+
+
+ Gets the shader object.
+
+
+
+
+ Creates the shader program.
+
+ The gl.
+ The vertex shader source.
+ The fragment shader source.
+ The attribute locations. This is an optional array of
+ uint attribute locations to their names.
+
+
+
+
+ A mapping of uniform names to locations. This allows us to very easily specify
+ uniform data by name, quickly looking up the location first if needed.
+
+
+
+
+ Gets the shader program object.
+
+
+ The shader program object.
+
+
+
+
+ Used to specify explictly a version of OpenGL.
+
+
+
+
+ Version 1.1
+
+
+
+
+ Version 1.2
+
+
+
+
+ Version 1.3
+
+
+
+
+ Version 1.4
+
+
+
+
+ Version 1.5
+
+
+
+
+ OpenGL 2.0
+
+
+
+
+ OpenGL 2.1
+
+
+
+
+ OpenGL 3.0. This is the first version of OpenGL that requires a specially constructed render context.
+
+
+
+
+ OpenGL 3.1
+
+
+
+
+ OpenGL 3.2
+
+
+
+
+ OpenGL 3.3
+
+
+
+
+ OpenGL 4.0
+
+
+
+
+ OpenGL 4.1
+
+
+
+
+ OpenGL 4.2
+
+
+
+
+ OpenGL 4.3
+
+
+
+
+ OpenGL 4.4
+
+
+
+
+ Allows a version to be specified as metadata on a field.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The major version number.
+ The minor version number.
+
+
+
+ Determines whether this version is at least as high as the version specified in the parameters.
+
+ The major version.
+ The minor version.
+ True if this version object is at least as high as the version specified by and .
+
+
+
+ Gets the version attribute of an enumeration value .
+
+ The enumeration.
+ The defined on , or null of none exists.
+
+
+
+ Gets the major version number.
+
+
+
+
+ Gets the minor version number.
+
+
+
+
+ Gets the index buffer object.
+
+
+
+
+ A VertexBufferArray is a logical grouping of VertexBuffers. Vertex Buffer Arrays
+ allow us to use a set of vertex buffers for vertices, indicies, normals and so on,
+ without having to use more complicated interleaved arrays.
+
+
+
+
+ Gets the vertex buffer array object.
+
+
+
+
+
+
+
+ Very useful reference for management of VBOs and VBAs:
+ http://stackoverflow.com/questions/8704801/glvertexattribpointer-clarification
+
+
+
+
+ Gets the vertex buffer object.
+
+
+
+
+ Useful functions imported from the Win32 SDK.
+
+
+
+
+ Initializes the class.
+
+
+
+
+ Gets the current render context.
+
+ The current render context.
+
+
+
+ Make the specified render context current.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+
+ Creates a render context from the device context.
+
+ The handle to the device context.
+ The handle to the render context.
+
+
+
+ Deletes the render context.
+
+ The handle to the render context.
+
+
+
+
+ Gets a proc address.
+
+ The name of the function.
+ The address of the function.
+
+
+
+ The wglUseFontBitmaps function creates a set of bitmap display lists for use in the current OpenGL rendering context. The set of bitmap display lists is based on the glyphs in the currently selected font in the device context. You can then use bitmaps to draw characters in an OpenGL image.
+
+ Specifies the device context whose currently selected font will be used to form the glyph bitmap display lists in the current OpenGL rendering context..
+ Specifies the first glyph in the run of glyphs that will be used to form glyph bitmap display lists.
+ Specifies the number of glyphs in the run of glyphs that will be used to form glyph bitmap display lists. The function creates count display lists, one for each glyph in the run.
+ Specifies a starting display list.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE. To get extended error information, call GetLastError.
+
+
+
+ The wglUseFontOutlines function creates a set of display lists, one for each glyph of the currently selected outline font of a device context, for use with the current rendering context.
+
+ The h DC.
+ The first.
+ The count.
+ The list base.
+ The deviation.
+ The extrusion.
+ The format.
+ The LPGMF.
+
+
+
+
+ Link two render contexts so they share lists (buffer IDs, etc.)
+
+ The first context.
+ The second context.
+ If the function succeeds, the return value is TRUE. If the function fails, the return value is FALSE.
+ To get extended error information, call GetLastError.
+
+
+
+ Specifies that a window created with this style accepts drag-drop files.
+
+
+
+
+ Forces a top-level window onto the taskbar when the window is visible.
+
+
+
+
+ Specifies that a window has a border with a sunken edge.
+
+
+
+
+ Windows XP: Paints all descendants of a window in bottom-to-top painting order using double-buffering. For more information, see Remarks. This cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Includes a question mark in the title bar of the window. When the user clicks the question mark, the cursor changes to a question mark with a pointer. If the user then clicks a child window, the child receives a WM_HELP message. The child window should pass the message to the parent window procedure, which should call the WinHelp function using the HELP_WM_HELP command. The Help application displays a pop-up window that typically contains help for the child window.
+ WS_EX_CONTEXTHELP cannot be used with the WS_MAXIMIZEBOX or WS_MINIMIZEBOX styles.
+
+
+
+
+ The window itself contains child windows that should take part in dialog box navigation. If this style is specified, the dialog manager recurses into children of this window when performing navigation operations such as handling the TAB key, an arrow key, or a keyboard mnemonic.
+
+
+
+
+ Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.
+
+
+
+
+ Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
+
+
+
+
+ Arabic and Hebrew versions of Windows 98/Me, Windows 2000/XP: Creates a window whose horizontal origin is on the right edge. Increasing horizontal values advance to the left.
+
+
+
+
+ Creates a window that has generic left-aligned properties. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.
+
+
+
+
+ The window text is displayed using left-to-right reading-order properties. This is the default.
+
+
+
+
+ Creates a multiple-document interface (MDI) child window.
+
+
+
+
+ Windows 2000/XP: A top-level window created with this style does not become the foreground window when the user clicks it. The system does not bring this window to the foreground when the user minimizes or closes the foreground window.
+ To activate the window, use the SetActiveWindow or SetForegroundWindow function.
+ The window does not appear on the taskbar by default. To force the window to appear on the taskbar, use the WS_EX_APPWINDOW style.
+
+
+
+
+ Windows 2000/XP: A window created with this style does not pass its window layout to its child windows.
+
+
+
+
+ Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.
+
+
+
+
+ Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.
+
+
+
+
+ Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.
+
+
+
+
+ The window has generic "right-aligned" properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.
+ Using the WS_EX_RIGHT style for static or edit controls has the same effect as using the SS_RIGHT or ES_RIGHT style, respectively. Using this style with button controls has the same effect as using BS_RIGHT and BS_RIGHTBUTTON styles.
+
+
+
+
+ Vertical scroll bar (if present) is to the right of the client area. This is the default.
+
+
+
+
+ If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.
+
+
+
+
+ Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.
+
+
+
+
+ Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.
+
+
+
+
+ Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
+
+
+
+
+ Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.
+ To achieve transparency without these restrictions, use the SetWindowRgn function.
+
+
+
+
+ Specifies that a window has a border with a raised edge.
+
+
+
+ The window has a thin-line border.
+
+
+ The window has a title bar (includes the WS_BORDER style).
+
+
+ The window is a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.
+
+
+ Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.
+
+
+
+ Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated.
+ If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.
+
+
+
+ The window is initially disabled. A disabled window cannot receive input from the user. To change this after a window has been created, use the EnableWindow function.
+
+
+ The window has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.
+
+
+
+ The window is the first control of a group of controls. The group consists of this first control and all controls defined after it, up to the next control with the WS_GROUP style.
+ The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+
+
+
+ The window has a horizontal scroll bar.
+
+
+ The window is initially maximized.
+
+
+ The window has a maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is initially minimized.
+
+
+ The window has a minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style. The WS_SYSMENU style must also be specified.
+
+
+ The window is an overlapped window. An overlapped window has a title bar and a border.
+
+
+ The window is an overlapped window.
+
+
+ The window is a pop-up window. This style cannot be used with the WS_CHILD style.
+
+
+ The window is a pop-up window. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.
+
+
+ The window has a sizing border.
+
+
+ The window has a window menu on its title bar. The WS_CAPTION style must also be specified.
+
+
+
+ The window is a control that can receive the keyboard focus when the user presses the TAB key.
+ Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.
+ You can turn this style on and off to change dialog box navigation. To change this style after a window has been created, use the SetWindowLong function.
+ For user-created windows and modeless dialogs to work with tab stops, alter the message loop to call the IsDialogMessage function.
+
+
+
+ The window is initially visible. This style can be turned on and off by using the ShowWindow or SetWindowPos function.
+
+
+ The window has a vertical scroll bar.
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SkinForm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SkinForm.dll
new file mode 100644
index 0000000..459eeac
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/SkinForm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/libdm.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/libdm.dll
new file mode 100644
index 0000000..f869c84
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/bin/x86/Release/libdm.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/buy.png b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/buy.png
new file mode 100644
index 0000000..dd7721b
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/buy.png differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/csgl.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/csgl.cs
new file mode 100644
index 0000000..4e4c207
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/csgl.cs
@@ -0,0 +1,535 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using SharpGL;
+using System.Drawing.Imaging;
+using System.Drawing.Drawing2D;
+using System.Collections;
+using System.Diagnostics;
+
+namespace DM_CalibrationTools
+{
+ class csgl
+ {
+ private OpenGL glInstance;
+ private OpenGLControl scInstance;
+ public OpenGL getGlInstance(){ return glInstance;}
+ int mouseX;
+ int mouseY;
+ public bool Global_MouseDown = false;
+ public bool Global_MouseInGLPanel = false;
+ double[] matrixProjection = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ const float DEG2RAD = 3.141593f / 180;
+ const float FOV_Y = 120.0f; // vertical FOV in degree
+ const float NEAR_PLANE = 1.0f;
+ const float FAR_PLANE = 100.0f;
+
+ /* 鍒濆鎽勫儚澶翠綅缃互鍙婂Э鎬佺殑璁剧疆 */
+ const float CAMERA_ANGLE_X = 45.0f; // 鎽勫儚澶寸殑淇话瑙
+ const float CAMERA_ANGLE_Y = 0.0f; // 鎽勫儚澶村亸鑸
+ const float CAMERA_DISTANCE = 30.0f; // 鎽勫儚澶磋窛绂
+ const float CAMERA_HIGHT = -3.0f;
+
+
+
+ float cameraAngleX;
+ float cameraAngleY;
+ float cameraHight;
+ float cameraDistance;
+ double[] modelview = { 0.7071068, 0.5, -0.5, 0, 0, 0.7071068, 0.7071068, 0, 0.7071068, -0.0, 0.5, 0, 0, 0, -25, 1 };
+ bool drawModeChanged;
+ int drawMode;
+
+ float[] cameraPosition = { 0, 0, 0 };
+ float[] cameraAngle = { 0, 0, 0 };
+ float[] modelPosition = { 0, 0, 0 };
+ float[] modelAngle = { 0, 0, 0 };
+
+
+ float[] bgColor = { 0, 0, 0, 0};
+
+
+
+ public csgl(OpenGLControl sc)
+ {
+ scInstance=sc;
+ glInstance = sc.OpenGL;
+ cameraAngleX = CAMERA_ANGLE_X;
+ cameraAngleY = CAMERA_ANGLE_Y;
+ cameraHight = CAMERA_HIGHT;
+ cameraDistance = CAMERA_DISTANCE;
+
+ drawModeChanged = false;
+ drawMode = 0;
+ DrawFlag = 2;
+ Initialized();
+
+ }
+ ArrayList list = new ArrayList();
+ public void addPoint(double x, double y, double z)
+ {
+ list.Add(new double[] { x, y, z });
+ }
+ public void resetPoint()
+ {
+ list.Clear();
+ }
+ HashSet poinths;
+ public void setPoinths(HashSet hs)
+ {
+ poinths = hs;
+ }
+ double[][] pointarr;
+ public void setPointarr(HashSet hs)
+ {
+ pointarr = new double[hs.Count][];
+ hs.CopyTo(pointarr);
+ }
+ public void DrawPoints(OpenGL gl,float r = 0.1f)
+ {
+
+ if (pointarr == null)
+ {
+ // Debug.WriteLine("pointarr == null");
+ return;
+ }
+ foreach (double[] v in pointarr)
+ {
+ DrawPoint(gl, v[0] * 0.04, v[1] * 0.04, v[2] * 0.04);
+ }
+ }
+ public void DrawPoint(OpenGL gl,double x, double y, double z, float r = 0.05f)
+ {
+ gl.PushMatrix();
+// gl.Translate(modelPosition[0], modelPosition[1], modelPosition[2]);
+ gl.Translate(x, y, z);
+ gl.Color(1.0,1.0,1.0);
+ auxSolidSphere(r);
+ gl.PopMatrix();
+ }
+ public void drawAxis(float size)
+ {
+ OpenGL gl = glInstance;
+ //gl.Disable(OpenGL.GL_TEXTURE_2D);
+ //gl.DepthFunc(OpenGL.GL_ALWAYS); // to avoid visual artifacts with grid lines
+ gl.Disable(OpenGL.GL_LIGHTING);
+ // gl.PushMatrix(); //NOTE: There is a bug on Mac misbehaviours of
+ // the light position when you draw GL_LINES
+ // and GL_POINTS. remember the matrix.
+ // draw axis
+ gl.LineWidth(5);
+ gl.Begin(OpenGL.GL_LINES);
+ gl.Color(1.0, 0, 0);
+ gl.Vertex(0, 0, 0);
+ gl.Vertex(size, 0, 0);
+ gl.Color(0, 1.0, 0);
+ gl.Vertex(0, 0, 0);
+ gl.Vertex(0, size, 0);
+ gl.Color(0, 0, 1.0);
+ gl.Vertex(0, 0, 0);
+ gl.Vertex(0, 0, size);
+ gl.End();
+ gl.LineWidth(1);
+
+ // draw arrows(actually big square dots)
+// gl.PointSize(12);
+// gl.Begin(OpenGL.GL_POINTS);
+// gl.Color(1.0, 0, 0);
+// gl.Vertex(size, 0, 0);
+// gl.Color(0, 1.0, 0);
+// gl.Vertex(0, size, 0);
+// gl.Color(0, 0, 1.0);
+// gl.Vertex(0, 0, size);
+// gl.End();
+// gl.PointSize(1);
+ gl.PushMatrix();
+ IntPtr gluNewQuadric = gl.NewQuadric();
+ gl.QuadricNormals(gluNewQuadric, OpenGL.GLU_SMOOTH);
+ //鐢诲渾閿
+ //鍒涘缓浜屾鏇查潰瀵硅薄,X杞寸殑绠ご
+ gl.Translate(size, 0f, 0f);
+ gl.Rotate(90, 0.0f, 1.0f, 0.0f);
+ gl.Color(1.0f, 0.0f, 0.0f); // Red
+ gl.Cylinder(gluNewQuadric, 0.5f, 0.0f, 0.5f, 32, 320);
+ gl.Rotate(-90, 0.0f, 1.0f, 0.0f);
+ gl.Translate(-size, 0f, 0f);
+ //鍒涘缓浜屾鏇查潰瀵硅薄,Y杞寸殑绠ご
+ gl.Translate(0f, size, 0f);
+ gl.Rotate(-90, 1.0f, 0.0f, 0.0f);
+ gl.Color(0.0f, 1.0f, 0.0f); // Green
+ gl.Cylinder(gluNewQuadric, 0.5f, 0.0f, 0.5f, 32, 32);
+ gl.Rotate(90, 1.0f, 0.0f, 0.0f);
+ gl.Translate(0f, -size, 0f);
+ //鍒涘缓浜屾鏇查潰瀵硅薄,Z杞寸殑绠ご
+ gl.Translate(0f, 0f, size);
+ gl.Color(0.0f, 0.0f, 1.0f); // Blue
+ gl.Cylinder(gluNewQuadric, 0.5f, 0.0f, 0.5f, 32, 32);
+ gl.Translate(0f, 0f, -size);
+ //鍦ㄨ繖閲岀粯鍒跺潗鏍囩郴缁
+ // restore default settings
+ gl.PopMatrix();
+ gl.Enable(OpenGL.GL_LIGHTING);
+ //gl.DepthFunc(OpenGL.GL_LEQUAL);
+ }
+ public void Draw()
+ {
+ OpenGL gl = glInstance;
+ // set bottom viewport
+ setViewportSub(0, 0, scInstance.Width, scInstance.Height, NEAR_PLANE, FAR_PLANE);
+
+ // clear buffer
+ //gl.ClearColor(bgColor[0], bgColor[1], bgColor[2], bgColor[3]); // background color
+ gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT | OpenGL.GL_STENCIL_BUFFER_BIT);
+ gl.LoadIdentity();
+ //gl.PushMatrix();
+
+ // First, transform the camera (viewing matrix) from world space to eye space
+ gl.Translate(0, cameraHight, -cameraDistance);
+ //move camera
+
+ gl.Translate(cameraPosition[0], cameraPosition[1], cameraPosition[2]);
+
+ gl.Rotate(cameraAngleX, 1, 0, 0); // pitch
+ gl.Rotate(cameraAngleY, 0, 1, 0); // heading
+
+ // draw grid
+ drawGrid(300, 1);
+
+ // draw a teapot
+ gl.PushMatrix();
+ gl.Translate(modelPosition[0], modelPosition[1], modelPosition[2]);
+ gl.PopMatrix();
+
+ if (DrawFlag == 1)
+ {
+ DrawPoints(gl);
+ }
+ else if(DrawFlag==2)
+ {
+
+ // mVector3 v = CaliAPI.GetEulerianAngle();
+ gl.PushMatrix();
+// gl.Rotate(v.y, 1, 0, 0); // pitch
+// gl.Rotate(v.x, 0, 0, -1); // pitch
+// gl.Rotate(90, 0, 1, 0); // heading
+
+ Quaternion q =CaliAPI.GetQuaternion();
+
+ double halfsita = Math.Acos(q.w);
+ double nx = q.y / Math.Sin(halfsita);
+ double ny = q.z / Math.Sin(halfsita);
+ double nz = q.x/ Math.Sin(halfsita);
+ double SitaAngle = halfsita * 2 * (180.0f / 3.141592f);
+ //gl.Rotate(45, 0, 0);
+ gl.Rotate( 0, 90, 90f);
+ gl.Rotate(0, 0, 0);
+
+ gl.Rotate(SitaAngle, nx, ny, nz);
+ //gl.Rotate(SitaAngle, ny,nz,nx);
+ drawAxis(20);
+ DrawCube();
+ gl.PopMatrix();
+
+ }
+// else
+// {
+// drawAxis(20);
+// }
+
+
+
+ //gl.PopMatrix();
+
+
+
+ }
+ public void resize()
+ {
+ OpenGL gl = getGlInstance();
+
+ // 璁剧疆褰撳墠鐭╅樀妯″紡,瀵规姇褰辩煩闃靛簲鐢ㄩ殢鍚庣殑鐭╅樀鎿嶄綔
+ gl.MatrixMode(OpenGL.GL_PROJECTION);
+
+ // 閲嶇疆褰撳墠鎸囧畾鐨勭煩闃典负鍗曚綅鐭╅樀,灏嗗綋鍓嶇殑鐢ㄦ埛鍧愭爣绯荤殑鍘熺偣绉诲埌浜嗗睆骞曚腑蹇
+ gl.LoadIdentity();
+ // 鍒涘缓閫忚鎶曞奖鍙樻崲
+ gl.Perspective(FOV_Y, scInstance.Width/ scInstance.Height, 5, 100.0);
+
+ // 瑙嗙偣鍙樻崲
+ gl.LookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0);
+
+ // 璁剧疆褰撳墠鐭╅樀涓烘ā鍨嬭鍥剧煩闃
+ gl.MatrixMode(OpenGL.GL_MODELVIEW);
+ }
+ void auxSolidSphere(float p)
+ {
+ drawSphere(p);
+ return;
+// OpenGL gl = getGlInstance();
+//
+// gl.Color(0.5f, 0.5f, 0.5f); /**< 鐏拌壊 */
+// gl.Scale(p, p, p);
+// DrawCube(gl);
+
+
+ }
+ public void drawSphere(double radius, int segx = 40, int segy = 40, bool isLines = false)
+ {
+ float x = 0, y = 0, z = 0;
+ OpenGL gl = getGlInstance();
+ gl.PushMatrix();
+ gl.Translate(x, y, z);
+ var sphere = gl.NewQuadric();
+ if (isLines)
+ gl.QuadricDrawStyle(sphere, OpenGL.GL_LINES);
+ else
+ gl.QuadricDrawStyle(sphere, OpenGL.GL_QUADS);
+ gl.QuadricNormals(sphere, OpenGL.GLU_SMOOTH); //GLU_NONE,GLU_FLAT,GLU_SMOOTH
+ gl.QuadricOrientation(sphere, (int)OpenGL.GLU_OUTSIDE); //GLU_OUTSIDE,GLU_INSIDE
+ gl.QuadricTexture(sphere, (int)OpenGL.GLU_FALSE); //GL_TRUE,GLU_FALSE
+ gl.Sphere(sphere, radius, segx, segy);
+ gl.DeleteQuadric(sphere);
+ gl.PopMatrix();
+ }
+ public void DrawCube()
+ {
+ OpenGL gl = glInstance;
+ gl.PushMatrix();
+
+ // OpenGL gl = getGlInstance();
+ gl.Begin(OpenGL.GL_QUADS);
+
+ gl.Color(1.0, 0, 0);
+ gl.Vertex(-10.0f, -10.0f, -10.0f);
+ gl.Vertex(-10.0f, 10.0f, -10.0f);
+ gl.Vertex(10.0f, 10.0f, -10.0f);
+ gl.Vertex(10.0f, -10.0f, -10.0f);
+
+ gl.Color(1.0, 1, 0);
+ gl.Vertex(-10.0f, -10.0f, -10.0f);
+ gl.Vertex(10.0f, -10.0f, -10.0f);
+ gl.Vertex(10.0f, -10.0f, 10.0f);
+ gl.Vertex(-10.0f, -10.0f, 10.0f);
+
+ gl.Color(1.0, 0, 1);
+ gl.Vertex(-10.0f, -10.0f, -10.0f);
+ gl.Vertex(-10.0f, -10.0f, 10.0f);
+ gl.Vertex(-10.0f, 10.0f, 10.0f);
+ gl.Vertex(-10.0f, 10.0f, -10.0f);
+
+ gl.Color(0, 1.0, 0);
+ gl.Vertex(-10.0f, -10.0f, 10.0f);
+ gl.Vertex(10.0f, -10.0f, 10.0f);
+ gl.Vertex(10.0f, 10.0f, 10.0f);
+ gl.Vertex(-10.0f, 10.0f, 10.0f);
+
+ gl.Color(0, 0, 1.0);
+ gl.Vertex(-10.0f, 10.0f, -10.0f);
+ gl.Vertex(-10.0f, 10.0f, 10.0f);
+ gl.Vertex(10.0f, 10.0f, 10.0f);
+ gl.Vertex(10.0f, 10.0f, -10.0f);
+
+ gl.Color(0, 1, 1.0);
+ gl.Vertex(10.0f, -10.0f, -10.0f);
+ gl.Vertex(10.0f, 10.0f, -10.0f);
+ gl.Vertex(10.0f, 10.0f, 10.0f);
+ gl.Vertex(10.0f, -10.0f, 10.0f);
+ gl.End();
+ gl.PopMatrix();
+ }
+ public void Initialized()
+ {
+ OpenGL gl = getGlInstance();
+ gl.ClearColor(0, 0, 0, 0);
+ gl.ShadeModel(OpenGL.GL_SMOOTH); // shading mathod: GL_SMOOTH or GL_FLAT
+ gl.PixelStore(OpenGL.GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment
+
+ // enable/disable features
+ gl.Hint(OpenGL.GL_PERSPECTIVE_CORRECTION_HINT, OpenGL.GL_NICEST);
+ //glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+ //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
+ gl.Enable(OpenGL.GL_DEPTH_TEST);
+ gl.Enable(OpenGL.GL_LIGHTING);
+ gl.Enable(OpenGL.GL_TEXTURE_2D);
+ gl.Enable(OpenGL.GL_CULL_FACE);
+ gl.Enable(OpenGL.GL_BLEND);
+ gl.Enable(OpenGL.GL_SCISSOR_TEST);
+
+ // track material ambient and diffuse from surface color, call it before glEnable(GL_COLOR_MATERIAL)
+ gl.ColorMaterial(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_AMBIENT_AND_DIFFUSE);
+ gl.Enable(OpenGL.GL_COLOR_MATERIAL);
+
+ gl.ClearColor(bgColor[0], bgColor[1], bgColor[2], bgColor[3]); // background color
+ gl.ClearStencil(0); // clear stencil buffer
+ gl.ClearDepth(1.0); // 0 is near, 1 is far
+ gl.DepthFunc(OpenGL.GL_LEQUAL);
+
+
+
+
+ //initLights(); /* 鍒濆鍖朞penGL鐏厜 */
+ float[] lightKa = { 1.0f, 1.0f, 1.0f, 0.0f }; // 鐜鍏夛紝鍩烘湰浜害锛屽彲浠ヨ涓烘槸澶槼鍏
+ float[] lightKd = { 1.0f, 1.0f, 1.0f, 0.0f }; // diffuse light
+ float[] lightKs = { 1f,1f,1f,1f}; // specular light
+ gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_AMBIENT, lightKa);
+ gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_DIFFUSE, lightKd);
+ // gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_SPECULAR, lightKs);
+
+ // position the light in eye space
+ float[] lightPos = { 16f, 9f, -18f, 0f }; // directional light
+ gl.Light(OpenGL.GL_LIGHT0, OpenGL.GL_POSITION, lightPos);
+ gl.LightModel(OpenGL.GL_FRONT, OpenGL.GL_AMBIENT_AND_DIFFUSE);
+ gl.Enable(OpenGL.GL_LIGHT0); // MUST enable each light source after configuration
+
+ // gl.PolygonMode(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_FILL);
+ // gl.Enable(OpenGL.GL_DEPTH_TEST);
+ // gl.Enable(OpenGL.GL_CULL_FACE);
+ gl.Enable(OpenGL.GL_NORMALIZE);
+
+
+ }
+
+ private double[] identity()
+ {
+ double[] m = new double[16];
+ m[0] = m[5] = m[10] = m[15] = 1.0;
+ m[1] = m[2] = m[3] = m[4] = m[6] = m[7] = m[8] = m[9] = m[11] = m[12] = m[13] = m[14] = 0.0;
+ return m;
+ }
+ private double[] getTranspose(double[] m)
+ {
+ double[] tm = new double[16];
+ tm[0] = m[0]; tm[1] = m[4]; tm[2] = m[8]; tm[3] = m[12];
+ tm[4] = m[1]; tm[5] = m[5]; tm[6] = m[9]; tm[7] = m[13];
+ tm[8] = m[2]; tm[9] = m[6]; tm[10] = m[10]; tm[11] = m[14];
+ tm[12] = m[3]; tm[13] = m[7]; tm[14] = m[11]; tm[15] = m[15];
+ return tm;
+ }
+ public void drawGrid(float size, float step)
+ {
+ OpenGL gl = glInstance;
+ // disable lighting
+ gl.Disable(OpenGL.GL_LIGHTING);
+
+ gl.Begin(OpenGL.GL_LINES);
+
+ gl.Color(0.3f, 0.3f, 0.3f);
+ for (float i = step; i <= size; i += step)
+ {
+ gl.Vertex(-size, 0, i); // lines parallel to X-axis
+ gl.Vertex(size, 0, i);
+ gl.Vertex(-size, 0, -i); // lines parallel to X-axis
+ gl.Vertex(size, 0, -i);
+
+ gl.Vertex(i, 0, -size); // lines parallel to Z-axis
+ gl.Vertex(i, 0, size);
+ gl.Vertex(-i, 0, -size); // lines parallel to Z-axis
+ gl.Vertex(-i, 0, size);
+ }
+
+ // x-axis
+ gl.Color(0.5f, 0, 0);
+ gl.Vertex(-size, 0, 0);
+ gl.Vertex(size, 0, 0);
+
+ // z-axis
+ gl.Color(0, 0, 0.5f);
+ gl.Vertex(0, 0, -size);
+ gl.Vertex(0, 0, size);
+
+ gl.End();
+
+ // enable lighting back
+ gl.Enable(OpenGL.GL_LIGHTING);
+ }
+ public void setViewportSub(int x, int y, int width, int height, float nearPlane, float farPlane)
+ {
+ OpenGL gl = glInstance;
+ // set viewport
+ gl.Viewport(x, y, width, height);
+ gl.Scissor(x, y, width, height);
+
+ // set perspective viewing frustum
+ setFrustum(FOV_Y, (float)(width) / height, nearPlane, farPlane); // FOV, AspectRatio, NearClip, FarClip
+ // copy projection matrix to OpenGL
+ gl.MatrixMode(OpenGL.GL_PROJECTION);
+ gl.LoadMatrix(getTranspose(matrixProjection));
+ gl.MatrixMode(OpenGL.GL_MODELVIEW);
+ gl.LoadIdentity();
+
+ }
+
+ public void setFrustum(float l, float r, float b, float t, float n, float f)
+ {
+ matrixProjection = identity();
+ matrixProjection[0] = 2 * n / (r - l);
+ matrixProjection[2] = (r + l) / (r - l);
+ matrixProjection[5] = 2 * n / (t - b);
+ matrixProjection[6] = (t + b) / (t - b);
+ matrixProjection[10] = -(f + n) / (f - n);
+ matrixProjection[11] = -(2 * f * n) / (f - n);
+ matrixProjection[14] = -1;
+ matrixProjection[15] = 0;
+ }
+ public void setFrustum(float fovY, float aspectRatio, float front, float back)
+ {
+ OpenGL gl = glInstance;
+ float tangent = (float)Math.Tan(fovY / 2 * DEG2RAD); // tangent of half fovY
+ float height = front * tangent; // half height of near plane
+ float width = height * aspectRatio; // half width of near plane
+
+ // params: left, right, bottom, top, near, far
+ setFrustum(-width, width, -height, height, front, back);
+ }
+
+ public void rotateCamera(int x, int y)
+ {
+ cameraAngleY += (x - mouseX);
+ cameraAngleX += (y - mouseY);
+ setMousePos(x, y);
+
+ }
+
+ public void moveCameraXY(int x, int y)
+ {
+ cameraPosition[0] += (x - mouseX) * 0.1f;
+ cameraPosition[1] += (y - mouseY) * -0.1f;
+ setMousePos(x, y);
+ Debug.WriteLine(cameraPosition[0] + " " + cameraPosition[1] + " " + cameraPosition[2] + " ");
+ }
+ public void moveCameraZ(int x, int y)
+ {
+ //cameraPosition[1] += (x - mouseX);
+ cameraPosition[2] += (y - mouseY) * 0.1f;
+ setMousePos(x, y);
+ }
+
+ public void setMousePos(int x, int y)
+ {
+ mouseX = x;
+ mouseY = y;
+ }
+ public void zoomCamera(int y)
+ {
+ cameraDistance -= (y - mouseY) * 0.1f;
+ mouseY = y;
+ }
+ public void zoomCameraDelta(int delta)
+ {
+ cameraDistance -= delta;
+ }
+ public void resetView()
+ {
+ cameraAngleX = CAMERA_ANGLE_X;
+ cameraAngleY = CAMERA_ANGLE_Y;
+ cameraHight = CAMERA_HIGHT;
+ cameraDistance = CAMERA_DISTANCE;
+ cameraPosition[0] = cameraPosition[1] = cameraPosition[2] = 0;
+ }
+
+ public int DrawFlag { get; set; }
+ }
+}
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..24f21b5
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.FileListAbsolute.txt
@@ -0,0 +1,21 @@
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.exe.config
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.exe
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.pdb
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.SceneGraph.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.WinForms.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.xml
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.SceneGraph.xml
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SharpGL.WinForms.xml
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.csprojResolveAssemblyReference.cache
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.csproj.GenerateResource.Cache
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.exe
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.pdb
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\SkinForm.dll
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.MainForms.resources
+F:\GeekIMU\杞欢璁捐\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI1\GeekIMU Manager GUI\DM_CalibrationTools\bin\Debug\DM_CalibrationTools.exe.config
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI1\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.exe
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI1\GeekIMU Manager GUI\DM_CalibrationTools\obj\Debug\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.GenerateResource.Cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.GenerateResource.Cache
new file mode 100644
index 0000000..4a9e961
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csproj.GenerateResource.Cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csprojResolveAssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..f6823d8
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.csprojResolveAssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..9564e24
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..b76277a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferences.cache
new file mode 100644
index 0000000..456694c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..924e1ae
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..1462c4c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..d5ceac7
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+cf42a9ccf104def591803676cdbb5ee89d6bfc85
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..884f680
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,76 @@
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csprojResolveAssemblyReference.cache
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+F:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.Cache
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csprojResolveAssemblyReference.cache
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+W:\GEEK Project\Geek IMU\GeekIMU v2\4.Software\GeekIMU Manager GUI v2.0.0\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.Cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.AssemblyReference.cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\Hardware Project\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Debug\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.AssemblyReference.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Debug\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csprojResolveAssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..ded4ffb
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/GEEKIMU Manager.csprojResolveAssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..d3c3159
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..efc3557
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..c01fb73
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..d030ec5
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+edeb97e82e7439bc67c3a2d57a072f3aafa0f954
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..09ef3b7
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,19 @@
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\Release\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\Release\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..d3c5996
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/Release/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.exe
new file mode 100644
index 0000000..ba5fc5d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..d40f1c9
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..d04a2b2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..e290b6a
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.AssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..9e765c3
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+c4482a19a4e4049d85ad2746a3b0263af6c4f129
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..12f6cd4
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,39 @@
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Debug\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\bin\x86\Debug\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.AssemblyReference.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI 1.2\GEEKIMU Manager\obj\x86\Debug\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..9c8c49c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Debug/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
new file mode 100644
index 0000000..e5dc9b8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/.NETFramework,Version=v4.5.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUConnect.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUConnect.resources
new file mode 100644
index 0000000..6c05a97
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUConnect.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUInformation.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUInformation.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.IMUInformation.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.MainForms.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.MainForms.resources
new file mode 100644
index 0000000..273550f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.MainForms.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.Properties.Resources.resources b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.Properties.Resources.resources
new file mode 100644
index 0000000..cc33983
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.Properties.Resources.resources differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.exe b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.exe
new file mode 100644
index 0000000..6983170
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.pdb b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.pdb
new file mode 100644
index 0000000..d0665f2
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DM_CalibrationTools.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferences.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferences.cache
new file mode 100644
index 0000000..1e3a564
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferences.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..a4b3f5e
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.AssemblyReference.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..6bd8e8e
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.AssemblyReference.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CopyComplete b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..15fb653
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+3c213483541b93c88ba4dfc25281aebfc902924f
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..af3367c
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.FileListAbsolute.txt
@@ -0,0 +1,20 @@
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\DM_CalibrationTools.exe.config
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\DM_CalibrationTools.pdb
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.SceneGraph.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.WinForms.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SkinForm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.SceneGraph.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\bin\x86\Release\SharpGL.WinForms.xml
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.AssemblyReference.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.IMUConnect.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.IMUInformation.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.MainForms.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.Properties.Resources.resources
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.GenerateResource.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.CoreCompileInputs.cache
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\GEEKIMU Manager.csproj.CopyComplete
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.exe
+E:\HardwareProject\GeekIMU\4.Software\GeekIMU Manager GUI\GEEKIMU Manager\obj\x86\Release\DM_CalibrationTools.pdb
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.GenerateResource.cache b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.GenerateResource.cache
new file mode 100644
index 0000000..cd12a02
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/GEEKIMU Manager.csproj.GenerateResource.cache differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/TempPE/Properties.Resources.Designer.cs.dll b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..f99f523
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/obj/x86/Release/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/tools.ico b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/tools.ico
new file mode 100644
index 0000000..4bb026f
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/tools.ico differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/txtreader.cs b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/txtreader.cs
new file mode 100644
index 0000000..7e78aab
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GEEKIMU Manager/txtreader.cs
@@ -0,0 +1,88 @@
+锘縰sing System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DM_CalibrationTools
+{
+ class txtreader
+ {
+ HashSet hs;
+ string filepath;
+ public txtreader(string s)
+ {
+ if(File.Exists(s))
+ {
+ filepath = s;
+ }
+ hs = new HashSet();
+ }
+ public void GetData()
+ {
+
+ // StreamReader sr = File.OpenText("task.txt",System.Text.Encoding.Default);
+ if (!File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + "data.txt"))
+ {
+ //StreamWriter sw = File.CreateText("task.txt");//鍦ㄧ▼搴忔墍鍦ㄦ枃浠跺す鍒涘缓txt鏂囦欢
+ //sw.Close();
+ }
+ FileStream fs = new FileStream("data.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
+ StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8);
+ //string[] parameters = sr.ReadLine().ToString().Split('|');
+ int i = 0;
+
+
+ ArrayList arr = new ArrayList();
+ while (true)
+ {
+ string cmdtempstr = sr.ReadLine();
+ if (cmdtempstr == null)
+ {
+ break;
+ }
+ i++;
+ string[] strarr = cmdtempstr.Split(' ');
+ ////add into arr to be finished
+ double[] v = { double.Parse(strarr[0]), double.Parse(strarr[1]), double.Parse(strarr[2]) };
+ arr.Add(v);
+ hs.Add(v);
+ }
+ sr.Close();
+ fs.Close();
+
+ }
+ public double[][] getArr()
+ {
+ double[][] result=new double [hs.Count][];
+ hs.CopyTo(result);
+ return result;
+ }
+ public HashSet getHashset()
+ {
+ return hs;
+ }
+ public void show()
+ {
+ for(int i = 0;i hs)
+ {
+ StreamWriter sw = File.CreateText("data.txt");//鍦ㄧ▼搴忔墍鍦ㄦ枃浠跺す鍒涘缓txt鏂囦欢
+
+ foreach (var d in hs)
+ {
+ sw.WriteLine(((float)d[0]).ToString() + " " + ((float)d[1]).ToString() + " " + ((float)d[2]).ToString());
+ }
+ sw.Close();
+ Debug.WriteLine("淇濆瓨鎴愬姛锛");
+ }
+ }
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/IMU_CAPI.obj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/IMU_CAPI.obj
new file mode 100644
index 0000000..b445328
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/IMU_CAPI.obj differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/LibHID.log b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/LibHID.log
new file mode 100644
index 0000000..d6214d4
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/LibHID.log
@@ -0,0 +1,14 @@
+锘 SensorImpl.cpp
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(128,48): warning C4305: 鈥滃垵濮嬪寲鈥: 浠庘渄ouble鈥濆埌鈥渇loat鈥濇埅鏂
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(67,44): warning C4101: 鈥渕x1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(71,14): warning C4101: 鈥渜2鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(71,11): warning C4101: 鈥渜1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(71,17): warning C4101: 鈥渜3鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(67,49): warning C4101: 鈥渕y1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(67,54): warning C4101: 鈥渕z1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(71,8): warning C4101: 鈥渜0鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(261,15): warning C4305: 鈥=鈥: 浠庘渄ouble鈥濆埌鈥渇loat鈥濇埅鏂
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(362,37): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(363,50): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(364,51): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+ LibHID.vcxproj -> E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.exe
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt
new file mode 100644
index 0000000..59ed8e2
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt
@@ -0,0 +1,2 @@
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Bin_Win32\Debug\libdm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.exe
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/MagCalibrate.obj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/MagCalibrate.obj
new file mode 100644
index 0000000..b6590b6
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/MagCalibrate.obj differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/PipeHMD.obj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/PipeHMD.obj
new file mode 100644
index 0000000..c0808c1
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/PipeHMD.obj differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/SensorImpl.obj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/SensorImpl.obj
new file mode 100644
index 0000000..a084b52
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/SensorImpl.obj differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/USB_Win32_HIDDevice.obj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/USB_Win32_HIDDevice.obj
new file mode 100644
index 0000000..10b0212
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/USB_Win32_HIDDevice.obj differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.Build.CppClean.log b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.Build.CppClean.log
new file mode 100644
index 0000000..38f481c
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.Build.CppClean.log
@@ -0,0 +1,20 @@
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\vc142.pdb
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\vc142.idb
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\sensorimpl.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\quaternion.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\pipehmd.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\main.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\magcalibrate.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\usb_win32_hiddevice.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.lib
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.exp
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.dll
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.ilk
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.pdb
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\cl.command.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\cl.read.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\cl.write.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\libdm.write.1u.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\link.command.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\link.read.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\link.write.1.tlog
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.dll.recipe b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.dll.recipe
new file mode 100644
index 0000000..0b62182
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.dll.recipe
@@ -0,0 +1,11 @@
+锘
+
+
+
+ E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exe b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exe
new file mode 100644
index 0000000..89a2664
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exe differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exe.recipe b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exe.recipe
new file mode 100644
index 0000000..94b37f4
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exe.recipe
@@ -0,0 +1,11 @@
+锘
+
+
+
+ E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.exe
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exp b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exp
new file mode 100644
index 0000000..ed8630d
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.exp differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.ilk b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.ilk
new file mode 100644
index 0000000..95e1c37
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.ilk differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.lib b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.lib
new file mode 100644
index 0000000..e6e7b59
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.lib differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.pdb b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.pdb
new file mode 100644
index 0000000..8c88495
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog
new file mode 100644
index 0000000..f0df902
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog
new file mode 100644
index 0000000..b8dc100
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog
new file mode 100644
index 0000000..9caa4d8
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate
new file mode 100644
index 0000000..c83b5a4
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:VCServicingVersionMFC=14.29.30136:VCServicingVersionCrtHeaders=14.29.30136:TargetPlatformVersion=10.0.20348.0:
+Debug|Win32|E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Projects\|
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog
new file mode 100644
index 0000000..e886c4c
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.18056.delete.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.18056.delete.1.tlog
new file mode 100644
index 0000000..a05416e
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.18056.delete.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.20816.delete.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.20816.delete.1.tlog
new file mode 100644
index 0000000..6478208
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.20816.delete.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog
new file mode 100644
index 0000000..5339a98
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.delete.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.delete.1.tlog
new file mode 100644
index 0000000..6bc9783
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.delete.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog
new file mode 100644
index 0000000..6bafa96
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog
new file mode 100644
index 0000000..dcdab8e
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/main.obj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/main.obj
new file mode 100644
index 0000000..1b6bf07
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/main.obj differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/quaternion.obj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/quaternion.obj
new file mode 100644
index 0000000..4cbf178
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/quaternion.obj differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/vc142.idb b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/vc142.idb
new file mode 100644
index 0000000..d583d89
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/vc142.idb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/vc142.pdb b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/vc142.pdb
new file mode 100644
index 0000000..fca42fd
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Bin_Win32/Debug/vc142.pdb differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/LibDM.sln.lnk b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/LibDM.sln.lnk
new file mode 100644
index 0000000..077d49e
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/LibDM.sln.lnk differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.sln b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.sln
new file mode 100644
index 0000000..bb30ef4
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.sln
@@ -0,0 +1,26 @@
+锘
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibHID", "LibHID.vcxproj", "{37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|Win32.Build.0 = Debug|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|x64.ActiveCfg = Debug|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|x64.Build.0 = Debug|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|Win32.ActiveCfg = Release|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|Win32.Build.0 = Release|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|x64.ActiveCfg = Release|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.suo b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.suo
new file mode 100644
index 0000000..0defe56
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.v12.suo b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.v12.suo
new file mode 100644
index 0000000..4d992ee
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/DMMTCalibrationTools.v12.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj
new file mode 100644
index 0000000..b67f54e
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj
@@ -0,0 +1,145 @@
+锘
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}
+ LibHID
+ libdm
+ 10.0
+
+
+
+ Application
+ true
+ v142
+ MultiByte
+
+
+ Application
+ true
+ v142
+ MultiByte
+
+
+ DynamicLibrary
+ false
+ v142
+ true
+ MultiByte
+
+
+ Application
+ false
+ v142
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\Bin_Win32\Debug\
+ ..\Bin_Win32\Debug\
+
+
+ ..\Bin\x64\Debug\
+ ..\Bin\x64\Debug\
+
+
+
+ Level3
+ Disabled
+ $(SolutionDir)..\Src;%(AdditionalIncludeDirectories)
+
+
+ true
+ AsInvoker
+
+
+
+
+ Level3
+ Disabled
+
+
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+
+
+ true
+ true
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+
+
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj.filters b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj.filters
new file mode 100644
index 0000000..177e0f1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj.filters
@@ -0,0 +1,78 @@
+锘
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {548ce9d9-2531-4935-9cf5-5f84f905abc1}
+
+
+ {282a2cbd-c34f-4e1e-a946-987edf6336d1}
+
+
+ {6c132069-0a46-4ff3-be04-048d1613aa75}
+
+
+ {1a76e6bf-779d-4efd-b8f4-7a7ce2707d28}
+
+
+ {ca3301bc-ba86-402b-a605-e4c66594f8a6}
+
+
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠禱math
+
+
+ 婧愭枃浠禱driver
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱app
+
+
+ 婧愭枃浠
+
+
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱math
+
+
+ 婧愭枃浠禱driver
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱app
+
+
+ 婧愭枃浠禱util
+
+
+ 婧愭枃浠
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj.user b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj.user
new file mode 100644
index 0000000..a375ae3
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibHID.vcxproj.user
@@ -0,0 +1,4 @@
+锘
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibUsbHid.v12.suo b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibUsbHid.v12.suo
new file mode 100644
index 0000000..055f3a4
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Projects/LibUsbHid.v12.suo differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/DM_Sensor.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/DM_Sensor.h
new file mode 100644
index 0000000..b0be5d8
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/DM_Sensor.h
@@ -0,0 +1,19 @@
+#ifndef _DM_SENSOR_H_
+#define _DM_SENSOR_H_
+
+/**********************************************************************************
+* 函数名 : UnpackSensor
+* 描述 : Oculus按照一定的算法压缩陀螺仪数据,这里最数据进行解包,可以参考:
+ http://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend
+ 文档进行处理。
+* 输入 : 要输入数据的指针
+* 输出 : 输出陀螺仪x、y、z三轴的数据
+***********************************************************************************/
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+
+void GetDK2_SensorData(unsigned char usb_input_buffer[]);
+
+void AHRSupdate(double gx, double gy, double gz, double ax, double ay, double az, double mx, double my, double mz,int Dtime);
+
+#endif
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/DM_Sensor_type.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/DM_Sensor_type.h
new file mode 100644
index 0000000..1bc0f00
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/DM_Sensor_type.h
@@ -0,0 +1,21 @@
+#ifndef _DM_SENSOR_TYPE_H_
+#define _DM_SENSOR_TYPE_H_
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct EulaAngle_
+{
+ double Yaw;
+ double Pitch;
+ double Roll;
+}DM_EulaAngle;
+
+
+typedef struct DMVector3f_
+{
+ float x, y, z;
+} DMVector3f;
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/IMU_CAPI.c b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/IMU_CAPI.c
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/IMU_CAPI.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/IMU_CAPI.h
new file mode 100644
index 0000000..1aec8d6
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/IMU_CAPI.h
@@ -0,0 +1,42 @@
+#ifndef _IMU_SENSOR_API_
+#define _IMU_SENSOR_API_
+#include
+
+#ifdef __cplusplus
+extern "C"{
+
+ __declspec(dllexport) int Init(char* );
+
+ __declspec(dllexport) int CheckDevice(void);
+
+ __declspec(dllexport) int GyroCali(void);
+
+ __declspec(dllexport) Vector3 GetGyroCali(void);
+
+ _declspec (dllexport) MagCaliParam GetMagCali();
+
+ __declspec(dllexport) int MagCalibrate(void);
+
+ __declspec(dllexport) int FinishMagCali(void);
+
+ __declspec(dllexport) int SetMagCali(float x, float y, float z, float x0, float y0, float z0);
+
+ __declspec(dllexport) MagCaliParam CalculateMagParam();
+
+ __declspec(dllexport) Vector3 GetPoint(void);
+
+ __declspec(dllexport) Vector3 GetEulerianAngle(void);
+
+ __declspec(dllexport) int Correction(void);
+
+ __declspec(dllexport) Quaternion GetQuaternion(void);
+
+}
+#else
+
+#endif
+
+#endif
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MagCalibrate.cpp b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MagCalibrate.cpp
new file mode 100644
index 0000000..1f0c26e
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MagCalibrate.cpp
@@ -0,0 +1,102 @@
+#include
+#include
+#include
+#include "MagCalibrate.h"
+#include
+
+MagCaliParam CalculateMagCalibrationParams(MagData _mdata[], int dataSize)
+{
+ MagCaliParam param, lastparam;
+
+ srand((unsigned)time(NULL));
+
+ float xmin = _mdata[0].x;
+ float ymin = _mdata[0].y;
+ float zmin = _mdata[0].z;
+ float xmax = _mdata[0].x;
+ float ymax = _mdata[0].y;
+ float zmax = _mdata[0].z;
+ float err, errnew;
+
+ for (int i = 0; i < dataSize; i++)
+ {
+ if (xmax < _mdata[i].x)
+ xmax = _mdata[i].x;
+ if (ymax < _mdata[i].y)
+ ymax = _mdata[i].y;
+ if (zmax < _mdata[i].z)
+ zmax = _mdata[i].z;
+ if (xmin > _mdata[i].x)
+ xmin = _mdata[i].x;
+ if (ymin > _mdata[i].y)
+ ymin = _mdata[i].y;
+ if (zmin > _mdata[i].z)
+ zmin = _mdata[i].z;
+ }
+
+ lastparam.xOffset = 0.5 * (xmax + xmin);
+ lastparam.yOffset = 0.5 * (ymax + ymin);
+ lastparam.zOffset = 0.5 * (zmax + zmin);
+ lastparam.xScale = 0.5 * abs(xmax - xmin);
+ lastparam.yScale = 0.5 * abs(ymax - ymin);
+ lastparam.zScale = 0.5 * abs(zmax - zmin);
+ err = 0;
+ for (int i = 0; i < dataSize; i++)
+ err = err + fabs(pow((_mdata[i].x - lastparam.xOffset), 2) / pow(lastparam.xScale, 2) + pow((_mdata[i].y - lastparam.yOffset), 2) / pow(lastparam.yScale, 2) + pow((_mdata[i].z - lastparam.zOffset), 2) / pow(lastparam.zScale, 2) - 1);
+ //printf("xc = %f yc = %f zc = %f, a = %f b = %f c= %f,初始化InitErr = %f\n", lastparam.xOffset, lastparam.yOffset, lastparam.zOffset, lastparam.xScale, lastparam.yScale, lastparam.zScale, err);
+ int starttime = clock();
+ for (int j = 0; j < 5000; j++)
+ {
+ param.xOffset = lastparam.xOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.yOffset = lastparam.yOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.zOffset = lastparam.zOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.xScale = fabs(lastparam.xScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ param.yScale = fabs(lastparam.yScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ param.zScale = fabs(lastparam.zScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ errnew = 0;
+ for (int i = 0; i < dataSize; i++)
+ errnew = errnew + fabs(pow((_mdata[i].x - param.xOffset), 2) / pow(param.xScale, 2) + pow((_mdata[i].y - param.yOffset), 2) / pow(param.yScale, 2) + pow((_mdata[i].z - param.zOffset), 2) / pow(param.zScale, 2) - 1);
+ if (errnew < err)
+ {
+ lastparam.xOffset = param.xOffset;
+ lastparam.yOffset = param.yOffset;
+ lastparam.zOffset = param.zOffset;
+ lastparam.xScale = param.xScale;
+ lastparam.yScale = param.yScale;
+ lastparam.zScale = param.zScale;
+ err = errnew;
+ }
+ }
+ param.xScale = 200 / param.xScale;
+ param.yScale = 200 / param.yScale;
+ param.zScale = 200 / param.zScale;
+ int durtime = clock() - starttime;
+ printf("%f, %f, %f, %f, %f, %f, %f\n cost:%dms\n", param.xOffset, param.yOffset, param.zOffset, param.xScale, param.yScale, param.zScale, err, durtime);
+
+ return param;
+}
+MagCaliParam GetMagDataFormFile()
+{
+ int maxdatasize = 4000;
+ std::ifstream fin("data.txt");
+ float x, y, z, x1, y1, z1;
+ int i = 0;
+ MagData mdata[4000];
+
+ while (fin) {
+ fin >> x >> y >> z;
+ fin.get(); // 加入这行,避免最后一行输出两次
+ mdata[i].x = x;
+ mdata[i].y = y;
+ mdata[i].z = z;
+
+ i++;
+
+ if (i == maxdatasize)
+ break;
+ }
+
+ MagCaliParam p = CalculateMagCalibrationParams(mdata, i);
+
+ return p;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MagCalibrate.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MagCalibrate.h
new file mode 100644
index 0000000..0ed65c2
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MagCalibrate.h
@@ -0,0 +1,25 @@
+#ifndef _MAG_CALIBRATE_H_
+#define _MAG_CALIBRATE_H_
+
+typedef struct _MagData
+{
+ float x;
+ float y;
+ float z;
+}MagData;
+
+typedef struct _MagCaliParam
+{
+ float xOffset;
+ float yOffset;
+ float zOffset;
+ float xScale;
+ float yScale;
+ float zScale;
+}MagCaliParam;
+
+MagCaliParam CalculateMagCalibrationParams(MagData _mdata[], int dataSize);
+
+MagCaliParam GetMagDataFormFile();
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MyCls.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MyCls.h
new file mode 100644
index 0000000..3319814
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/MyCls.h
@@ -0,0 +1,43 @@
+#include
+void MyCls(HANDLE hConsole)
+{
+ COORD coordScreen = { 0, 0 };//设置清屏后光标返回的屏幕左上角坐标
+ BOOL bSuccess;
+ DWORD cCharsWritten;
+ CONSOLE_SCREEN_BUFFER_INFO csbi;//保存缓冲区信息
+
+ DWORD dwConSize;//当前缓冲区可容纳的字符数
+
+ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);//获得缓冲区信息
+ //PERR(bSuccess, "GetConsoleScreenBufferInfo");
+ dwConSize = csbi.dwSize.X * csbi.dwSize.Y;//缓冲区容纳字符数目
+
+ //用空格填充缓冲区
+ bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR)' ', dwConSize, coordScreen, &cCharsWritten);
+ //PERR(bSuccess, "FillConsoleOutputCharacter");
+
+ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);//获得缓冲区信息
+ //PERR(bSuccess, "ConsoleScreenBufferInfo");
+
+ //填充缓冲区属性
+ bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
+ //PERR(bSuccess, "FillConsoleOutputAttribute");
+
+ //光标返回屏幕左上角坐标
+ bSuccess = SetConsoleCursorPosition(hConsole, coordScreen);
+ //printf("ok");
+ //PERR(bSuccess, "SetConsoleCursorPosition");
+ return;
+}
+inline void back2zero(void)
+{
+ static HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ static COORD coordScreen = { 0, 0 };
+ SetConsoleCursorPosition(hStdOut, coordScreen);
+}
+inline void clrscr(void)
+{
+ HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ MyCls(hStdOut);
+ return;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/OVR_CAPI.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/OVR_CAPI.h
new file mode 100644
index 0000000..431c403
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/OVR_CAPI.h
@@ -0,0 +1,868 @@
+/************************************************************************************
+
+Filename : OVR_CAPI.h
+Content : C Interface to Oculus sensors and rendering.
+Created : November 23, 2013
+Authors : Michael Antonov
+
+Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved.
+
+Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
+you may not use the Oculus VR Rift SDK except in compliance with the License,
+which is provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+http://www.oculusvr.com/licenses/LICENSE-3.1
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+************************************************************************************/
+#ifndef OVR_CAPI_h
+#define OVR_CAPI_h
+
+#include
+
+
+typedef char ovrBool;
+
+//-----------------------------------------------------------------------------------
+// ***** OVR_EXPORT definition
+
+#if !defined(OVR_EXPORT)
+#if defined(WIN32)
+#define OVR_EXPORT __declspec(dllexport)
+#else
+#define OVR_EXPORT
+#endif
+#endif
+
+//-----------------------------------------------------------------------------------
+
+typedef struct SensorPureData_
+{
+ long AccelX, AccelY, AccelZ;
+ long GyroX, GyroY, GyroZ;
+ short MagX, MagY, MagZ;
+}SensorPureData;
+
+// ***** Simple Math Structures
+
+// 2D integer
+typedef struct ovrVector2i_
+{
+ int x, y;
+} ovrVector2i;
+typedef struct ovrSizei_
+{
+ int w, h;
+} ovrSizei;
+typedef struct ovrRecti_
+{
+ ovrVector2i Pos;
+ ovrSizei Size;
+} ovrRecti;
+
+// 3D
+typedef struct ovrQuatf_
+{
+ float x, y, z, w;
+} ovrQuatf;
+typedef struct ovrVector2f_
+{
+ float x, y;
+} ovrVector2f;
+typedef struct ovrVector3f_
+{
+ float x, y, z;
+} ovrVector3f;
+typedef struct ovrMatrix4f_
+{
+ float M[4][4];
+} ovrMatrix4f;
+// Position and orientation together.
+typedef struct ovrPosef_
+{
+ ovrQuatf Orientation;
+ ovrVector3f Position;
+} ovrPosef;
+
+// Full pose (rigid body) configuration with first and second derivatives.
+typedef struct ovrPoseStatef_
+{
+ ovrPosef Pose;
+ ovrVector3f AngularVelocity;
+ ovrVector3f LinearVelocity;
+ ovrVector3f AngularAcceleration;
+ ovrVector3f LinearAcceleration;
+ double TimeInSeconds; // Absolute time of this state sample.
+} ovrPoseStatef;
+
+// Field Of View (FOV) in tangent of the angle units.
+// As an example, for a standard 90 degree vertical FOV, we would
+// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.
+typedef struct ovrFovPort_
+{
+ float UpTan;
+ float DownTan;
+ float LeftTan;
+ float RightTan;
+} ovrFovPort;
+
+
+//-----------------------------------------------------------------------------------
+// ***** HMD Types
+
+// Enumerates all HMD types that we support.
+typedef enum
+{
+ ovrHmd_None = 0,
+ ovrHmd_DK1 = 3,
+ ovrHmd_DKHD = 4,
+ ovrHmd_CrystalCoveProto = 5,
+ ovrHmd_DK2 = 6,
+ ovrHmd_Other // Some HMD other then the one in the enumeration.
+} ovrHmdType;
+
+// HMD capability bits reported by device.
+//
+typedef enum
+{
+ // Read-only flags.
+ ovrHmdCap_Present = 0x0001, // This HMD exists (as opposed to being unplugged).
+ ovrHmdCap_Available = 0x0002, // HMD and is sensor is available for use
+ // (if not owned by another app).
+
+ // These flags are intended for use with the new driver display mode.
+ /*
+ ovrHmdCap_ExtendDesktop = 0x0004, // Read only, means display driver is in compatibility mode.
+
+ ovrHmdCap_DisplayOff = 0x0040, // Turns off Oculus HMD screen and output.
+ ovrHmdCap_NoMirrorToWindow = 0x2000, // Disables mirrowing of HMD output to the window;
+ // may improve rendering performance slightly.
+ */
+
+ // Modifiable flags (through ovrHmd_SetEnabledCaps).
+ ovrHmdCap_LowPersistence = 0x0080, // Supports low persistence mode.
+ ovrHmdCap_LatencyTest = 0x0100, // Supports pixel reading for continuous latency testing.
+ ovrHmdCap_DynamicPrediction = 0x0200, // Adjust prediction dynamically based on DK2 Latency.
+ // Support rendering without VSync for debugging
+ ovrHmdCap_NoVSync = 0x1000,
+ ovrHmdCap_NoRestore = 0x4000,
+
+ // These bits can be modified by ovrHmd_SetEnabledCaps.
+ ovrHmdCap_Writable_Mask = 0x1380
+} ovrHmdCaps;
+
+
+// Sensor capability bits reported by device.
+// Used with ovrHmd_StartSensor.
+typedef enum
+{
+ ovrSensorCap_Orientation = 0x0010, // Supports orientation tracking (IMU).
+ ovrSensorCap_YawCorrection = 0x0020, // Supports yaw correction through magnetometer or other means.
+ ovrSensorCap_Position = 0x0040, // Supports positional tracking.
+
+} ovrSensorCaps;
+
+// Distortion capability bits reported by device.
+// Used with ovrHmd_ConfigureRendering and ovrHmd_CreateDistortionMesh.
+typedef enum
+{
+ ovrDistortionCap_Chromatic = 0x01, // Supports chromatic aberration correction.
+ ovrDistortionCap_TimeWarp = 0x02, // Supports timewarp.
+ ovrDistortionCap_Vignette = 0x08 // Supports vignetting around the edges of the view.
+} ovrDistortionCaps;
+
+
+// Specifies which eye is being used for rendering.
+// This type explicitly does not include a third "NoStereo" option, as such is
+// not required for an HMD-centered API.
+typedef enum
+{
+ ovrEye_Left = 0,
+ ovrEye_Right = 1,
+ ovrEye_Count = 2
+} ovrEyeType;
+
+
+// Handle to HMD; returned by ovrHmd_Create.
+typedef struct ovrHmdStruct* ovrHmd;
+
+// This is a complete descriptor of the HMD.
+typedef struct ovrHmdDesc_
+{
+ ovrHmd Handle; // Handle of this HMD.
+ ovrHmdType Type;
+
+ // Name string describing the product: "Oculus Rift DK1", etc.
+ const char* ProductName;
+ const char* Manufacturer;
+
+ // Capability bits described by ovrHmdCaps.
+ unsigned int HmdCaps;
+ // Capability bits described by ovrSensorCaps.
+ unsigned int SensorCaps;
+ // Capability bits described by ovrDistortionCaps.
+ unsigned int DistortionCaps;
+
+ // Resolution of the entire HMD screen (for both eyes) in pixels.
+ ovrSizei Resolution;
+ // Where monitor window should be on screen or (0,0).
+ ovrVector2i WindowsPos;
+
+ // These define the recommended and maximum optical FOVs for the HMD.
+ ovrFovPort DefaultEyeFov[ovrEye_Count];
+ ovrFovPort MaxEyeFov[ovrEye_Count];
+
+ // Preferred eye rendering order for best performance.
+ // Can help reduce latency on sideways-scanned screens.
+ ovrEyeType EyeRenderOrder[ovrEye_Count];
+
+ // Display that HMD should present on.
+ // TBD: It may be good to remove this information relying on WidowPos instead.
+ // Ultimately, we may need to come up with a more convenient alternative,
+ // such as a API-specific functions that return adapter, ot something that will
+ // work with our monitor driver.
+
+ // Windows: "\\\\.\\DISPLAY3", etc. Can be used in EnumDisplaySettings/CreateDC.
+ const char* DisplayDeviceName;
+ // MacOS
+ int DisplayId;
+} ovrHmdDesc;
+
+// Describes the type of positional tracking being done.
+/*
+typedef enum
+{
+ovrPose_None,
+ovrPose_HeadModel,
+ovrPose_Positional
+} ovrPoseType;
+*/
+
+
+// Bit flags describing the current status of sensor tracking.
+typedef enum
+{
+ ovrStatus_OrientationTracked = 0x0001, // Orientation is currently tracked (connected and in use).
+ ovrStatus_PositionTracked = 0x0002, // Position is currently tracked (FALSE if out of range).
+ ovrStatus_PositionConnected = 0x0020, // Position tracking HW is connected.
+ ovrStatus_HmdConnected = 0x0080 // HMD Display is available & connected.
+} ovrStatusBits;
+
+
+// State of the sensor at a given absolute time.
+typedef struct ovrSensorState_
+{
+ // Predicted pose configuration at requested absolute time.
+ // One can determine the time difference between predicted and actual
+ // readings by comparing ovrPoseState.TimeInSeconds.
+ ovrPoseStatef Predicted;
+ // Actual recorded pose configuration based on the sensor sample at a
+ // moment closest to the requested time.
+ ovrPoseStatef Recorded;
+
+ // Sensor temperature reading, in degrees Celsius, as sample time.
+ float Temperature;
+ // Sensor status described by ovrStatusBits.
+ unsigned int StatusFlags;
+} ovrSensorState;
+
+// For now.
+// TBD: Decide if this becomes a part of HMDDesc
+typedef struct ovrSensorDesc_
+{
+ // HID Vendor and ProductId of the device.
+ short VendorId;
+ short ProductId;
+ // Sensor (and display) serial number.
+ char SerialNumber[24];
+} ovrSensorDesc;
+
+
+
+// Frame data reported by ovrHmd_BeginFrameTiming().
+typedef struct ovrFrameTiming_
+{
+ // The amount of time that has passed since the previous frame returned
+ // BeginFrameSeconds value, usable for movement scaling.
+ // This will be clamped to no more than 0.1 seconds to prevent
+ // excessive movement after pauses for loading or initialization.
+ float DeltaSeconds;
+
+ // It is generally expected that the following hold:
+ // ThisFrameSeconds < TimewarpPointSeconds < NextFrameSeconds <
+ // EyeScanoutSeconds[EyeOrder[0]] <= ScanoutMidpointSeconds <= EyeScanoutSeconds[EyeOrder[1]]
+
+ // Absolute time value of when rendering of this frame began or is expected to
+ // begin; generally equal to NextFrameSeconds of the previous frame. Can be used
+ // for animation timing.
+ double ThisFrameSeconds;
+ // Absolute point when IMU expects to be sampled for this frame.
+ double TimewarpPointSeconds;
+ // Absolute time when frame Present + GPU Flush will finish, and the next frame starts.
+ double NextFrameSeconds;
+
+ // Time when when half of the screen will be scanned out. Can be passes as a prediction
+ // value to ovrHmd_GetSensorState() go get general orientation.
+ double ScanoutMidpointSeconds;
+ // Timing points when each eye will be scanned out to display. Used for rendering each eye.
+ double EyeScanoutSeconds[2];
+
+} ovrFrameTiming;
+
+
+
+// Rendering information for each eye, computed by either ovrHmd_ConfigureRendering().
+// or ovrHmd_GetRenderDesc() based on the specified Fov.
+// Note that the rendering viewport is not included here as it can be
+// specified separately and modified per frame though:
+// (a) calling ovrHmd_GetRenderScaleAndOffset with game-rendered api,
+// or (b) passing different values in ovrTexture in case of SDK-rendered distortion.
+typedef struct ovrEyeRenderDesc_
+{
+ ovrEyeType Eye;
+ ovrFovPort Fov;
+ ovrRecti DistortedViewport; // Distortion viewport
+ ovrVector2f PixelsPerTanAngleAtCenter; // How many display pixels will fit in tan(angle) = 1.
+ ovrVector3f ViewAdjust; // Translation to be applied to view matrix.
+} ovrEyeRenderDesc;
+
+
+//-----------------------------------------------------------------------------------
+// ***** Platform-independent Rendering Configuration
+
+// These types are used to hide platform-specific details when passing
+// render device, OS and texture data to the APIs.
+//
+// The benefit of having these wrappers vs. platform-specific API functions is
+// that they allow game glue code to be portable. A typical example is an
+// engine that has multiple back ends, say GL and D3D. Portable code that calls
+// these back ends may also use LibOVR. To do this, back ends can be modified
+// to return portable types such as ovrTexture and ovrRenderAPIConfig.
+
+typedef enum
+{
+ ovrRenderAPI_None,
+ ovrRenderAPI_OpenGL,
+ ovrRenderAPI_Android_GLES, // May include extra native window pointers, etc.
+ ovrRenderAPI_D3D9,
+ ovrRenderAPI_D3D10,
+ ovrRenderAPI_D3D11,
+ ovrRenderAPI_Count
+} ovrRenderAPIType;
+
+// Platform-independent part of rendering API-configuration data.
+// It is a part of ovrRenderAPIConfig, passed to ovrHmd_Configure.
+typedef struct ovrRenderAPIConfigHeader_
+{
+ ovrRenderAPIType API;
+ ovrSizei RTSize;
+ int Multisample;
+} ovrRenderAPIConfigHeader;
+
+typedef struct ovrRenderAPIConfig_
+{
+ ovrRenderAPIConfigHeader Header;
+ uintptr_t PlatformData[8];
+} ovrRenderAPIConfig;
+
+// Platform-independent part of eye texture descriptor.
+// It is a part of ovrTexture, passed to ovrHmd_EndFrame.
+// - If RenderViewport is all zeros, will be used.
+typedef struct ovrTextureHeader_
+{
+ ovrRenderAPIType API;
+ ovrSizei TextureSize;
+ ovrRecti RenderViewport; // Pixel viewport in texture that holds eye image.
+} ovrTextureHeader;
+
+typedef struct ovrTexture_
+{
+ ovrTextureHeader Header;
+ uintptr_t PlatformData[8];
+} ovrTexture;
+
+
+// -----------------------------------------------------------------------------------
+// ***** API Interfaces
+
+// Basic steps to use the API:
+//
+// Setup:
+// 1. ovrInitialize();
+// 2. ovrHMD hmd = ovrHmd_Create(0); ovrHmd_GetDesc(hmd, &hmdDesc);
+// 3. Use hmdDesc and ovrHmd_GetFovTextureSize() to determine graphics configuration.
+// 4. Call ovrHmd_StartSensor() to configure and initialize tracking.
+// 5. Call ovrHmd_ConfigureRendering() to setup graphics for SDK rendering,
+// which is the preferred approach.
+// Please refer to "Game-Side Rendering" below if you prefer to do that instead.
+// 5. Allocate textures as needed.
+//
+// Game Loop:
+// 6. Call ovrHmd_BeginFrame() to get frame timing and orientation information.
+// 7. Render each eye in between ovrHmd_BeginEyeRender and ovrHmd_EndEyeRender calls,
+// providing the result texture to the API.
+// 8. Call ovrHmd_EndFrame() to render distorted textures to the back buffer
+// and present them on the Hmd.
+//
+// Shutdown:
+// 9. ovrHmd_Destroy(hmd)
+// 10. ovr_Shutdown()
+//
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ // Library init/shutdown, must be called around all other OVR code.
+ // No other functions calls are allowed before ovr_Initialize succeeds or after ovr_Shutdown.
+ OVR_EXPORT ovrBool ovr_Initialize();
+ OVR_EXPORT void ovr_Shutdown();
+
+
+ // Detects or re-detects HMDs and reports the total number detected.
+ // Users can get information about each HMD by calling ovrHmd_Create with an index.
+ OVR_EXPORT int ovrHmd_Detect();
+
+
+ // Creates a handle to an HMD and optionally fills in data about it.
+ // Index can [0 .. ovrHmd_Detect()-1]; index mappings can cange after each ovrHmd_Detect call.
+ // If not null, returned handle must be freed with ovrHmd_Destroy.
+ OVR_EXPORT ovrHmd ovrHmd_Create(int index);
+ OVR_EXPORT void ovrHmd_Destroy(ovrHmd hmd);
+
+ // Creates a "fake" HMD used for debugging only. This is not tied to specific hardware,
+ // but may be used to debug some of the related rendering.
+ OVR_EXPORT ovrHmd ovrHmd_CreateDebug(ovrHmdType type);
+
+
+ // Returns last error for HMD state. Returns null for no error.
+ // String is valid until next call or GetLastError or HMD is destroyed.
+ // Pass null hmd to get global error (for create, etc).
+ OVR_EXPORT const char* ovrHmd_GetLastError(ovrHmd hmd);
+
+
+ //-------------------------------------------------------------------------------------
+
+ // Returns capability bits that are enabled at this time; described by ovrHmdCaps.
+ // Note that this value is different font ovrHmdDesc::HmdCaps, which describes what
+ // capabilities are available.
+ OVR_EXPORT unsigned int ovrHmd_GetEnabledCaps(ovrHmd hmd);
+
+ // Modifies capability bits described by ovrHmdCaps that can be modified,
+ // such as ovrHmd_LowPersistance.
+ OVR_EXPORT void ovrHmd_SetEnabledCaps(ovrHmd hmd, unsigned int hmdCaps);
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Sensor Interface
+
+ // All sensor interface functions are thread-safe, allowing sensor state to be sampled
+ // from different threads.
+ // Starts sensor sampling, enabling specified capabilities, described by ovrSensorCaps.
+ // - supportedSensorCaps specifies support that is requested. The function will succeed
+ // even if these caps are not available (i.e. sensor or camera is unplugged). Support
+ // will automatically be enabled if such device is plugged in later. Software should
+ // check ovrSensorState.StatusFlags for real-time status.
+ // - requiredSensorCaps specify sensor capabilities required at the time of the call.
+ // If they are not available, the function will fail. Pass 0 if only specifying
+ // supportedSensorCaps.
+ OVR_EXPORT ovrBool ovrHmd_StartSensor(ovrHmd hmd, unsigned int supportedSensorCaps,
+ unsigned int requiredSensorCaps);
+ // Stops sensor sampling, shutting down internal resources.
+ OVR_EXPORT void ovrHmd_StopSensor(ovrHmd hmd);
+ // Resets sensor orientation.
+ OVR_EXPORT void ovrHmd_ResetSensor(ovrHmd hmd);
+
+ // Returns sensor state reading based on the specified absolute system time.
+ // Pass absTime value of 0.0 to request the most recent sensor reading; in this case
+ // both PredictedPose and SamplePose will have the same value.
+ // ovrHmd_GetEyePredictedSensorState relies on this internally.
+ // This may also be used for more refined timing of FrontBuffer rendering logic, etc.
+ OVR_EXPORT ovrSensorState ovrHmd_GetSensorState(ovrHmd hmd, double absTime);
+
+ // Returns information about a sensor.
+ // Only valid after StartSensor.
+ OVR_EXPORT ovrBool ovrHmd_GetSensorDesc(ovrHmd hmd, ovrSensorDesc* descOut);
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Graphics Setup
+
+ // Fills in description about HMD; this is the same as filled in by ovrHmd_Create.
+ OVR_EXPORT void ovrHmd_GetDesc(ovrHmd hmd, ovrHmdDesc* desc);
+
+ // Calculates texture size recommended for rendering one eye within HMD, given FOV cone.
+ // Higher FOV will generally require larger textures to maintain quality.
+ // - pixelsPerDisplayPixel specifies that number of render target pixels per display
+ // pixel at center of distortion; 1.0 is the default value. Lower values
+ // can improve performance.
+ OVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmd, ovrEyeType eye, ovrFovPort fov,
+ float pixelsPerDisplayPixel);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Rendering API Thread Safety
+
+ // All of rendering APIs, inclusing Configure and frame functions are *NOT
+ // Thread Safe*. It is ok to use ConfigureRendering on one thread and handle
+ // frames on another thread, but explicit synchronization must be done since
+ // functions that depend on configured state are not reentrant.
+ //
+ // As an extra requirement, any of the following calls must be done on
+ // the render thread, which is the same thread that calls ovrHmd_BeginFrame
+ // or ovrHmd_BeginFrameTiming.
+ // - ovrHmd_EndFrame
+ // - ovrHmd_BeginEyeRender
+ // - ovrHmd_EndEyeRender
+ // - ovrHmd_GetFramePointTime
+ // - ovrHmd_GetEyePose
+ // - ovrHmd_GetEyeTimewarpMatrices
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** SDK-Rendering Functions
+
+ // These functions support rendering of distortion by the SDK through direct
+ // access to the underlying rendering HW, such as D3D or GL.
+ // This is the recommended approach, as it allows for better support or future
+ // Oculus hardware and a range of low-level optimizations.
+
+
+ // Configures rendering; fills in computed render parameters.
+ // This function can be called multiple times to change rendering settings.
+ // The users pass in two eye view descriptors that are used to
+ // generate complete rendering information for each eye in eyeRenderDescOut[2].
+ //
+ // - apiConfig provides D3D/OpenGL specific parameters. Pass null
+ // to shutdown rendering and release all resources.
+ // - distortionCaps describe distortion settings that will be applied.
+ //
+ OVR_EXPORT ovrBool ovrHmd_ConfigureRendering(ovrHmd hmd,
+ const ovrRenderAPIConfig* apiConfig,
+ unsigned int distortionCaps,
+ const ovrFovPort eyeFovIn[2],
+ ovrEyeRenderDesc eyeRenderDescOut[2]);
+
+
+ // Begins a frame, returning timing and orientation information useful for simulation.
+ // This should be called in the beginning of game rendering loop (on render thread).
+ // This function relies on ovrHmd_BeginFrameTiming for some of its functionality.
+ // Pass 0 for frame index if not using GetFrameTiming.
+ OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrame(ovrHmd hmd, unsigned int frameIndex);
+
+ // Ends frame, rendering textures to frame buffer. This may perform distortion and scaling
+ // internally, assuming is it not delegated to another thread.
+ // Must be called on the same thread as BeginFrame. Calls ovrHmd_BeginEndTiming internally.
+ // *** This Function will to Present/SwapBuffers and potentially wait for GPU Sync ***.
+ OVR_EXPORT void ovrHmd_EndFrame(ovrHmd hmd);
+
+
+ // Marks beginning of eye rendering. Must be called on the same thread as BeginFrame.
+ // This function uses ovrHmd_GetEyePose to predict sensor state that should be
+ // used rendering the specified eye.
+ // This combines current absolute time with prediction that is appropriate for this HMD.
+ // It is ok to call ovrHmd_BeginEyeRender() on both eyes before calling ovrHmd_EndEyeRender.
+ // If rendering one eye at a time, it is best to render eye specified by
+ // HmdDesc.EyeRenderOrder[0] first.
+ OVR_EXPORT ovrPosef ovrHmd_BeginEyeRender(ovrHmd hmd, ovrEyeType eye);
+
+ // Marks the end of eye rendering and submits the eye texture for display after it is ready.
+ // Rendering viewport within the texture can change per frame if necessary.
+ // Specified texture may be presented immediately or wait until ovrHmd_EndFrame based
+ // on the implementation. The API performs distortion and scaling internally.
+ // 'renderPose' will typically be the value returned from ovrHmd_BeginEyeRender, but can
+ // be different if a different pose was used for rendering.
+ OVR_EXPORT void ovrHmd_EndEyeRender(ovrHmd hmd, ovrEyeType eye,
+ ovrPosef renderPose, ovrTexture* eyeTexture);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Game-Side Rendering Functions
+
+ // These functions provide distortion data and render timing support necessary to allow
+ // game rendering of distortion. Game-side rendering involves the following steps:
+ //
+ // 1. Setup ovrEyeDesc based on desired texture size and Fov.
+ // Call ovrHmd_GetRenderDesc to get the necessary rendering parameters for each eye.
+ //
+ // 2. Use ovrHmd_CreateDistortionMesh to generate distortion mesh.
+ //
+ // 3. Use ovrHmd_BeginFrameTiming, ovrHmd_GetEyePose and ovrHmd_BeginFrameTiming
+ // in the rendering loop to obtain timing and predicted view orientation for
+ // each eye.
+ // - If relying on timewarp, use ovr_WaitTillTime after rendering+flush, followed
+ // by ovrHmd_GetEyeTimewarpMatrices to obtain timewarp matrices used
+ // in distortion pixel shader to reduce latency.
+ //
+
+ // Computes distortion viewport, view adjust and other rendering for the specified
+ // eye. This can be used instead of ovrHmd_ConfigureRendering to help setup rendering on
+ // the game side.
+ OVR_EXPORT ovrEyeRenderDesc ovrHmd_GetRenderDesc(ovrHmd hmd,
+ ovrEyeType eyeType, ovrFovPort fov);
+
+
+ // Describes a vertex used for distortion; this is intended to be converted into
+ // the engine-specific format.
+ // Some fields may be unused based on ovrDistortionCaps selected. TexG and TexB, for example,
+ // are not used if chromatic correction is not requested.
+ typedef struct ovrDistortionVertex_
+ {
+ ovrVector2f Pos;
+ float TimeWarpFactor; // Lerp factor between time-warp matrices. Can be encoded in Pos.z.
+ float VignetteFactor; // Vignette fade factor. Can be encoded in Pos.w.
+ ovrVector2f TexR;
+ ovrVector2f TexG;
+ ovrVector2f TexB;
+ } ovrDistortionVertex;
+
+ // Describes a full set of distortion mesh data, filled in by ovrHmd_CreateDistortionMesh.
+ // Contents of this data structure, if not null, should be freed by ovrHmd_DestroyDistortionMesh.
+ typedef struct ovrDistortionMesh_
+ {
+ ovrDistortionVertex* pVertexData;
+ unsigned long* pIndexData;
+ unsigned int VertexCount;
+ unsigned int IndexCount;
+ } ovrDistortionMesh;
+
+ // Generate distortion mesh per eye.
+ // Distortion capabilities will depend on 'distortionCaps' flags; user should rely on
+ // appropriate shaders based on their settings.
+ // Distortion mesh data will be allocated and stored into the ovrDistortionMesh data structure,
+ // which should be explicitly freed with ovrHmd_DestroyDistortionMesh.
+ // Users should call ovrHmd_GetRenderScaleAndOffset to get uvScale and Offset values for rendering.
+ // The function shouldn't fail unless theres is a configuration or memory error, in which case
+ // ovrDistortionMesh values will be set to null.
+ OVR_EXPORT ovrBool ovrHmd_CreateDistortionMesh(ovrHmd hmd,
+ ovrEyeType eyeType, ovrFovPort fov,
+ unsigned int distortionCaps,
+ ovrDistortionMesh *meshData);
+
+ // Frees distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements
+ // are set to null and zeroes after the call.
+ OVR_EXPORT void ovrHmd_DestroyDistortionMesh(ovrDistortionMesh* meshData);
+
+ // Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or
+ // viewport changes after the fact. This can be used to adjust render size every frame, if desired.
+ OVR_EXPORT void ovrHmd_GetRenderScaleAndOffset(ovrFovPort fov,
+ ovrSizei textureSize, ovrRecti renderViewport,
+ ovrVector2f uvScaleOffsetOut[2]);
+
+
+ // Thread-safe timing function for the main thread. Caller should increment frameIndex
+ // with every frame and pass the index to RenderThread for processing.
+ OVR_EXPORT ovrFrameTiming ovrHmd_GetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+ // Called at the beginning of the frame on the Render Thread.
+ // Pass frameIndex == 0 if ovrHmd_GetFrameTiming isn't being used. Otherwise,
+ // pass the same frame index as was used for GetFrameTiming on the main thread.
+ OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+ // Marks the end of game-rendered frame, tracking the necessary timing information. This
+ // function must be called immediately after Present/SwapBuffers + GPU sync. GPU sync is important
+ // before this call to reduce latency and ensure proper timing.
+ OVR_EXPORT void ovrHmd_EndFrameTiming(ovrHmd hmd);
+
+ // Initializes and resets frame time tracking. This is typically not necessary, but
+ // is helpful if game changes vsync state or video mode. vsync is assumed to be on if this
+ // isn't called. Resets internal frame index to the specified number.
+ OVR_EXPORT void ovrHmd_ResetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+
+ // Predicts and returns Pose that should be used rendering the specified eye.
+ // Must be called between ovrHmd_BeginFrameTiming & ovrHmd_EndFrameTiming.
+ OVR_EXPORT ovrPosef ovrHmd_GetEyePose(ovrHmd hmd, ovrEyeType eye);
+
+ // Computes timewarp matrices used by distortion mesh shader, these are used to adjust
+ // for orientation change since the last call to ovrHmd_GetEyePose for this eye.
+ // The ovrDistortionVertex::TimeWarpFactor is used to blend between the matrices,
+ // usually representing two different sides of the screen.
+ // Must be called on the same thread as ovrHmd_BeginFrameTiming.
+ OVR_EXPORT void ovrHmd_GetEyeTimewarpMatrices(ovrHmd hmd, ovrEyeType eye,
+ ovrPosef renderPose, ovrMatrix4f twmOut[2]);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Stateless math setup functions
+
+ // Used to generate projection from ovrEyeDesc::Fov.
+ OVR_EXPORT ovrMatrix4f ovrMatrix4f_Projection(ovrFovPort fov,
+ float znear, float zfar, ovrBool rightHanded);
+
+ // Used for 2D rendering, Y is down
+ // orthoScale = 1.0f / pixelsPerTanAngleAtCenter
+ // orthoDistance = distance from camera, such as 0.8m
+ OVR_EXPORT ovrMatrix4f ovrMatrix4f_OrthoSubProjection(ovrMatrix4f projection, ovrVector2f orthoScale,
+ float orthoDistance, float eyeViewAdjustX);
+
+ // Returns global, absolute high-resolution time in seconds. This is the same
+ // value as used in sensor messages.
+ OVR_EXPORT double ovr_GetTimeInSeconds();
+
+ // Waits until the specified absolute time.
+ OVR_EXPORT double ovr_WaitTillTime(double absTime);
+
+
+
+ // -----------------------------------------------------------------------------------
+ // ***** Latency Test interface
+
+ // Does latency test processing and returns 'TRUE' if specified rgb color should
+ // be used to clear the screen.
+ OVR_EXPORT ovrBool ovrHmd_ProcessLatencyTest(ovrHmd hmd, unsigned char rgbColorOut[3]);
+
+ // Returns non-null string once with latency test result, when it is available.
+ // Buffer is valid until next call.
+ OVR_EXPORT const char* ovrHmd_GetLatencyTestResult(ovrHmd hmd);
+
+ // Returns latency for HMDs that support internal latency testing via the
+ // pixel-read back method (-1 for invalid or N/A)
+ OVR_EXPORT double ovrHmd_GetMeasuredLatencyTest2(ovrHmd hmd);
+
+
+ // -----------------------------------------------------------------------------------
+ // ***** Property Access
+
+ // NOTICE: This is experimental part of API that is likely to go away or change.
+
+ // These allow accessing different properties of the HMD and profile.
+ // Some of the properties may go away with profile/HMD versions, so software should
+ // use defaults and/or proper fallbacks.
+ //
+
+ // For now, access profile entries; this will change.
+#if !defined(OVR_KEY_USER)
+
+#define OVR_KEY_USER "User"
+#define OVR_KEY_NAME "Name"
+#define OVR_KEY_GENDER "Gender"
+#define OVR_KEY_PLAYER_HEIGHT "PlayerHeight"
+#define OVR_KEY_EYE_HEIGHT "EyeHeight"
+#define OVR_KEY_IPD "IPD"
+#define OVR_KEY_NECK_TO_EYE_HORIZONTAL "NeckEyeHori"
+#define OVR_KEY_NECK_TO_EYE_VERTICAL "NeckEyeVert"
+
+#define OVR_DEFAULT_GENDER "Male"
+#define OVR_DEFAULT_PLAYER_HEIGHT 1.778f
+#define OVR_DEFAULT_EYE_HEIGHT 1.675f
+#define OVR_DEFAULT_IPD 0.064f
+#define OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL 0.12f
+#define OVR_DEFAULT_NECK_TO_EYE_VERTICAL 0.12f
+#endif
+
+
+ // Get float property. Returns first element if property is a float array.
+ // Returns defaultValue if property doesn't exist.
+ OVR_EXPORT float ovrHmd_GetFloat(ovrHmd hmd, const char* propertyName, float defaultVal);
+
+ // Modify float property; false if property doesn't exist or is readonly.
+ OVR_EXPORT ovrBool ovrHmd_SetFloat(ovrHmd hmd, const char* propertyName, float value);
+
+
+ // Get float[] property. Returns the number of elements filled in, 0 if property doesn't exist.
+ // Maximum of arraySize elements will be written.
+ OVR_EXPORT unsigned int ovrHmd_GetFloatArray(ovrHmd hmd, const char* propertyName,
+ float values[], unsigned int arraySize);
+
+ // Modify float[] property; false if property doesn't exist or is readonly.
+ OVR_EXPORT ovrBool ovrHmd_SetFloatArray(ovrHmd hmd, const char* propertyName,
+ float values[], unsigned int arraySize);
+
+ // Get string property. Returns first element if property is a string array.
+ // Returns defaultValue if property doesn't exist.
+ // String memory is guaranteed to exist until next call to GetString or GetStringArray, or HMD is destroyed.
+ OVR_EXPORT const char* ovrHmd_GetString(ovrHmd hmd, const char* propertyName,
+ const char* defaultVal);
+
+ // Returns array size of a property, 0 if property doesn't exist.
+ // Can be used to check existence of a property.
+ OVR_EXPORT unsigned int ovrHmd_GetArraySize(ovrHmd hmd, const char* propertyName);
+
+
+ //OVR_EXPORT void DMKeepAlive(void);
+
+ /*
+ ** 调用这个函数判断设备设备插入状态是否改变
+ ** 如果返回1则表示发生变化
+ ** 返回0则表示未发生变换
+ */
+ OVR_EXPORT int DM_IsConnectionChanged(void);
+
+ /*
+ ** 调用这个函数判断设备是否插入该函数只返回当前设备连接状态不做任何操作
+ ** 如果返回1则表示设备已经插入
+ ** 返回0则表示已经拔出
+ */
+ OVR_EXPORT int DM_IsConnected(void);
+
+ /*
+ ** 调用这个函数执行陀螺仪校准命令,每调用一次,驱动层会向Hmd发送陀螺仪校准命令
+ ** 如果返回1则表示驱动层发送命令成功,SetFeatureReport成功
+ ** 返回0则表示发送失败 SetFeatureReport失败
+ ** 返回2表示驱动层错误: 说明USB HID句柄未初始化成功,指针为空。表示设备未插入或者驱动层未正常初始化
+ */
+ OVR_EXPORT int DM_CalibrateGyro(void);
+
+ /*
+ ** 调用这个函数执行进入DFU命令,每调用一次,驱动层会向Hmd发送进入DFU升级命令
+ ** 如果返回1则表示驱动层发送命令成功,SetFeatureReport成功
+ ** 返回0则表示发送失败 SetFeatureReport失败
+ ** 返回2表示驱动层错误: 说明USB HID句柄未初始化成功,指针为空。表示设备未插入或者驱动层未正常初始化
+ ** 注意发送DFU命令后,Hmd会立即进入DFU模式,USB会和当前驱动断开,除非再次以正常模式进行连接,否则该函数
+ ** 无法正常调用。
+ */
+ OVR_EXPORT int DM_EnterDFUMode(void);
+
+
+ /*
+ ** 调用该函数,发送命令设置Hmd的显示模式,如果为TRUE,Hmd则进入分屏模式(双屏模式),默认设置为FALSE,单屏模式显示
+ ** 返回0表示USB的SetFeatureReport失败,返回2表示:头显断开或者是初始化错误。返回1表示成功
+ */
+ OVR_EXPORT int DM_IsDoubleScreen(bool state);
+
+ /*
+ * 调用该函数设置屏幕背光亮度,返回1表示成功。返回-1表示亮度范围错误。亮度范围0
+#include
+#include
+#include
+#include "PipeHMD.h"
+#include "OVR_CAPI.h"
+#include
+
+
+using namespace std;
+namespace DMPipe
+{
+ PipeHMD::PipeHMD(string sname) :m_hPipe(INVALID_HANDLE_VALUE)
+ {
+ this->name = sname;
+ }
+ PipeHMD::~PipeHMD()
+ {
+ PipeHMD::Free();
+ }
+ BOOL PipeHMD::IsOpen()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_IS_OPEN;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ ovrSensorState PipeHMD::GetSensorData()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ ovrSensorState * result = (ovrSensorState *)&reciveBuf[0];
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_GET_DATA;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(ovrSensorState));
+ return result[0];
+ }
+ SensorPureData PipeHMD::GetPureSensorData()
+ {
+ memset(reciveBuf, 0, sizeof(BOOL));
+ SensorPureData * result = (SensorPureData *)&reciveBuf[0];
+ return result[0];
+ }
+ BOOL PipeHMD::EnterDFUMode()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_ENTER_DFU_MODE;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ BOOL PipeHMD::Calibration()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_CALIBRATION;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ void PipeHMD::SetName(string sname)
+ {
+ this->name = sname;
+ }
+}
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/PipeHMD.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/PipeHMD.h
new file mode 100644
index 0000000..68b801f
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/PipeHMD.h
@@ -0,0 +1,151 @@
+#ifndef _PIPE_H_
+#define _PIPE_H_
+
+#pragma once
+
+#include
+#include
+#include "OVR_CAPI.h"
+using namespace std;
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_DATA 2
+#define COMMAND_DEVICE_CALIBRATION 3
+#define COMMAND_DEVICE_GET_PURE_DATA 4
+#define COMMAND_DEVICE_ENTER_DFU_MODE 11
+
+#define ENTER_DFU_MODE_SUCCESS 1
+#define ENTER_DFU_MODE_FAILED 0
+#define CALIBRATION_SUCCESS 1
+#define CALIBRATION_FAILED 0
+
+namespace DMPipe{
+ class PipeHMD
+ {
+ public:
+ PipeHMD() :m_hPipe(INVALID_HANDLE_VALUE){}
+ ~PipeHMD();
+ PipeHMD(std::string sname);
+ BOOL IsOpen();
+ ovrSensorState GetSensorData();
+ SensorPureData GetPureSensorData();
+ BOOL EnterDFUMode();
+ BOOL Calibration();
+ inline LPCTSTR GetName()
+ {
+ return name.c_str();
+ }
+ void SetName(std::string sname);
+ private:
+ std::string name;
+ unsigned char reciveBuf[512];
+ unsigned char writeBuf[512];
+ DWORD readLenth;
+ DWORD writeLenth;
+ HANDLE m_hPipe;
+ BOOL isConnection;
+ inline void Init()
+ {
+ for (;;)
+ {
+ m_hPipe = CreateFile(
+ GetName(), // pipe name
+ GENERIC_READ | // read and write access
+ GENERIC_WRITE,
+ 0, // no sharing
+ NULL, // default security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // default attributes
+ NULL); // no template file
+
+ // Break if the pipe handle is valid.
+
+ if (m_hPipe != INVALID_HANDLE_VALUE)
+ {
+ isConnection = TRUE;
+ return;
+ }
+ // Exit if an error other than ERROR_PIPE_BUSY occurs.
+
+ if (GetLastError() != ERROR_PIPE_BUSY)
+ {
+ //char buf[255] = { 0 };
+ //printf(TEXT("Could not open pipe. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ return;
+ }
+
+ // All pipe instances are busy, so wait for 1 milliseconds.
+
+ if (!WaitNamedPipe(GetName(), 1))
+ {
+ //TimeLog("Could not open pipe: 1 millisecond wait timed out.");
+ return;
+ }
+ }
+
+ }
+ inline void Free()
+ {
+ if (m_hPipe == INVALID_HANDLE_VALUE)
+ {
+ isConnection = FALSE;
+ return;
+ }
+ else
+ {
+ if (CloseHandle(m_hPipe))
+ {
+ m_hPipe = INVALID_HANDLE_VALUE;
+ isConnection = FALSE;
+ }
+ }
+ }
+ inline void PipeProcess(DWORD sizeofrecive)
+ {
+ this->Init();
+ if (isConnection)
+ {
+ BOOL fSuccess = FALSE;
+ fSuccess = WriteFile(
+ m_hPipe, // pipe handle
+ writeBuf, // message
+ sizeof(unsigned int) * 3, // message length
+ &writeLenth, // bytes written
+ NULL); // not overlapped
+
+ if (!fSuccess)
+ {
+ char buf[255] = { 0 };
+ sprintf(buf, TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ goto freepipe;
+ }
+ //printf("\nMessage sent to server, receiving reply as follows:\n");
+ do
+ {
+ // Read from the pipe.
+ fSuccess = ReadFile(
+ m_hPipe, // pipe handle
+ reciveBuf, // buffer to receive reply
+ sizeofrecive, // size of buffer
+ &readLenth, // number of bytes read
+ NULL); // not overlapped
+ if (!fSuccess && GetLastError() != ERROR_MORE_DATA)
+ break;
+ } while (!fSuccess); // repeat loop if ERROR_MORE_DATA
+
+ if (!fSuccess)
+ {
+ char buf[255] = { 0 };
+ sprintf(buf, TEXT("ReadFile from pipe failed. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ goto freepipe;
+ }
+ freepipe:
+ this->Free();
+ }
+ }
+ };
+
+}
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/SensorImpl.cpp b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/SensorImpl.cpp
new file mode 100644
index 0000000..3cc84ff
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/SensorImpl.cpp
@@ -0,0 +1,578 @@
+#include "windows.h"
+#include "SensorImpl.h"
+#include "stdio.h"
+#include "quaternion.h"
+#include "math.h"
+#include "UsbHid_CAPI.h"
+#include "MyCls.h"
+extern "C" FILE* fpdata;
+Quaternion GlobalQ;
+BOOL GlobalQ_Updating;
+float LocX,LocY,LocZ;
+float Yaw,Pitch,Roll;
+extern FILE* Getfpdata();
+extern int global_calibration_flag;
+extern int global_Show;
+UINT8 global_key[4] = { 0 };
+float gxc=0, gyc=0, gzc=0;
+int gyro_cali_count = 0;
+#define GYRO_CALIBRATION_SAMPLE_NUMBER 3000
+float gx0=0, gy0=0, gz0=0;
+BOOL GlobalMag_Updating = false;
+Vector3 GlobalMag = {0};
+static bool HmdStandByState;
+
+Quaternion CQ_DM = { 1, 0, 0, 0 };
+
+bool DM_Corrected = false;
+
+void MagFilter(float *mx,float *my,float *mz,float sita);
+void GyroComputeDrift(float *gx, float *gy, float *gz);
+
+void LowPassFilterYaw(float *z, float alpha);
+
+bool IsHmdIntoStandBy(float *Pitch, float *Roll, float dTime);
+
+
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z)
+{
+
+ struct {INT32 x:21;} s;
+
+ *x = s.x = (buffer[0] << 13) | (buffer[1] << 5) | ((buffer[2] & 0xF8) >> 3);
+ *y = s.x = ((buffer[2] & 0x07) << 18) | (buffer[3] << 10) | (buffer[4] << 2) |
+ ((buffer[5] & 0xC0) >> 6);
+ *z = s.x = ((buffer[5] & 0x3F) << 15) | (buffer[6] << 7) | (buffer[7] >> 1);
+}
+
+Vector3 GetMagData()
+{
+ Vector3 v = { 0 };
+ static Vector3 VLast = { 0 };
+ if (!GlobalMag_Updating)
+ {
+ VLast = GlobalMag;
+ }
+ v = VLast;
+ return v;
+}
+
+void GetControllerSensor(unsigned char usb_input_buffer[])
+{
+ static UINT8 updatecnt = 0;
+ INT16 MagX,MagY,MagZ;
+ long GX,GY,GZ;
+ long AX,AY,AZ;
+ UINT NowTime;
+ float ax, ay, az, gx, gy, gz, mx, my, mz, mx1, my1, mz1;;
+ static float mxlast=0,mylast=0,mzlast=0;
+ static int Dtime = 0;
+ static UINT LastTime = 0;
+ float q0,q1,q2,q3;
+
+
+ NowTime = *(UINT16* )(usb_input_buffer+2);
+ if(LastTime != 0)
+ {
+ if(NowTime >= LastTime)
+ {
+ Dtime = NowTime - LastTime;
+ LastTime = NowTime;
+ }else
+ {
+ Dtime = (65535 - LastTime) + NowTime;
+ LastTime = NowTime;
+ }
+
+ }else
+ {
+ Dtime = 1;
+ LastTime = NowTime;
+ }
+
+ if (global_Show==5)
+ {
+ //clrscr();
+ back2zero();
+ printf("Hex数据\n\n");
+ for (int i = 0; i < 64; i++)
+ {
+ if ((i%16)==0)
+ {
+ printf("\n");
+ }
+ //if (global_debug)
+ printf("%2x ", usb_input_buffer[i]);
+
+ }
+ printf("\n");
+ }
+
+
+ MagX = *(INT16 *)(usb_input_buffer + 56);
+ MagY = *(INT16 *)(usb_input_buffer + 58);
+ MagZ = *(INT16 *)(usb_input_buffer + 60);
+
+ UnpackSensor(usb_input_buffer+8, &AX,&AY,&AZ);
+ UnpackSensor(usb_input_buffer+16, &GX,&GY,&GZ);
+
+
+ ax = (float)0.0001*AX;
+ ay = (float)0.0001*AY;
+ az = (float)0.0001*AZ;
+
+ gx = (float)0.0001*GX;
+ gy = (float)0.0001*GY;
+ gz = (float)0.0001*GZ;
+
+ float x = 16.4 * 180 / 3.14159265358979323846F;
+
+ if (global_Show == 1)
+ {
+ printf("gx = %f,gy = %f gz =%f\n", gx*x, gy*x, gz*x);
+ }
+
+ GyroComputeDrift(&gx, &gy, &gz);
+
+ if (global_calibration_flag == 1)
+ {
+ if (gyro_cali_count > GYRO_CALIBRATION_SAMPLE_NUMBER)
+ {
+ gyro_cali_count = 0;
+ gxc = gyc = gzc = 0;
+ }
+ gyro_cali_count++;
+ gxc += gx*x;
+ gyc += gy*x;
+ gzc += gz*x;
+ if (gyro_cali_count == GYRO_CALIBRATION_SAMPLE_NUMBER)
+ {
+ gx0 = gxc / gyro_cali_count;
+ gy0 = gyc / gyro_cali_count;
+ gz0 = gzc / gyro_cali_count;
+ gyro_cali_count++;
+ global_calibration_flag = 0;
+ printf("%f %f %f\n", gx0, gy0, gz0);
+ }
+ }
+
+
+ global_key[0] = usb_input_buffer[24];
+ global_key[3] = usb_input_buffer[27];
+
+
+ mx = (float)MagX / 16;
+ my = (float)MagY / 16;
+ mz = (float)MagZ / 16;
+ if (global_calibration_flag==3)
+ {
+ GlobalMag_Updating = true;
+ mx = (float)MagX;
+ my = (float)MagY;
+ mz = (float)MagZ;
+
+ GlobalMag.x = (float)MagX;
+ GlobalMag.y = (float)MagY;
+ GlobalMag.z = (float)MagZ;
+ GlobalMag_Updating = false;
+ }
+
+
+ if(mxlast == 0&&mylast == 0&&mzlast == 0)
+ {
+ mxlast = mx;
+ mylast = my;
+ mzlast = mz;
+
+ MagFilter(&mx, &my, &mz, 0.95f);
+ for (int i = 0; i < 200; i++)
+ AHRSupdate(0, 0, 0, az, ax, ay, mz, mx, my, 1, Dtime * 400);
+ }
+ else
+ {
+ updatecnt++;
+ if (updatecnt > 10)
+ updatecnt = 0;
+ if (mx == mxlast&&my == my&&mz == mzlast && updatecnt < 10)
+ {
+ AHRSupdate(gz,gx,gy,az,ax,ay,mz,mx,my,1,Dtime);
+
+ }
+ else
+ {
+ mxlast = mx;
+ mylast = my;
+ mzlast = mz;
+
+ MagFilter(&mx,&my,&mz,0.95f);
+
+ AHRSupdate(gz,gx,gy,az,ax,ay,mz,mx,my,1,Dtime);
+ }
+ }
+}
+
+
+/**********************************************************************************************************
+* Function Name : AHRSupdate
+* 输入 : 三轴加速度计、陀螺仪、磁力计的值
+* 描述 :加速度计、陀螺仪、磁力计融合得到的欧拉角
+
+ 1)这个算法基于标准笛卡尔右手坐标系,z轴朝上,x轴朝人,y轴朝右
+ 2)传感器的方向需要变换到和改算法定义的坐标轴相同。
+
+* 修改 :2016/11/5 : 根据磁力计采样率比较低的特点,设置了2种模式:1、融合磁力计 2、不融合磁力计
+ 2016/11/6 :改进了四元数更新算法,原来的四元数更新算法会导致累计误差。
+ 2016/11/9 : 规定了本算法运行的坐标轴,重写了四元数到欧拉角变换的代码。
+***********************************************************************************************************/
+
+
+float q0 = 1, q1 = 0, q2 = 0, q3 = 0;
+float exInt = 0, eyInt = 0, ezInt = 0; /*缩放积分误差 */
+#define Kp 2.5f /*加速度计和磁力计对陀螺仪的比例修正参数 */
+#define Ki 0.005f /*加速度计和磁力计对陀螺仪的积分修正参数 */
+#define Kd 0.0f
+static int AHRS_Init = 0;
+void ResetAHRS(){
+ AHRS_Init = 0; q0 = 1; q1 = 0; q2 = 0; q3 = 0;
+}
+void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz, char useMag, int Dtime)
+{
+ /*原算法的定义*/
+ float norm, halfT;
+ float hx, hy, hz, bz, by;
+ float vx, vy, vz, wx, wy, wz;
+ float ex, ey, ez;
+ float qw, qx, qy, qz;
+ float AccelAjust, MagAjust;
+ /*方便之后的程序使用,减少计算时间*/
+ float q0q0 = q0*q0; float q0q1 = q0*q1;
+ float q0q2 = q0*q2; float q0q3 = q0*q3;
+ float q1q1 = q1*q1; float q1q2 = q1*q2;
+ float q1q3 = q1*q3; float q2q2 = q2*q2;
+ float q2q3 = q2*q3; float q3q3 = q3*q3;
+ if (AHRS_Init > 200)
+ {
+ halfT = 0.0005f*Dtime; /*得到每次姿态更新的周期的一半t = (1/SampleFrq) * 0.5 */
+ }
+ else
+ {
+ if (useMag == 1)
+ {
+ halfT = 0.1;
+ gx = gy = gz = 0;
+ AHRS_Init++;
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ norm = invSqrt(ax*ax + ay*ay + az*az); /*把加速度计向量转换为单位向量*/
+
+ if ((1.0f / norm) > 1.6 || (1.0f / norm) < 0.4){
+ AccelAjust = 0;
+ MagAjust = 1.2f;
+
+ }
+ else{
+ AccelAjust = 1.0f;
+ MagAjust = 1.0f;
+ }
+
+
+ ax = ax * norm;
+ ay = ay * norm;
+ az = az * norm; /*把磁力计向量转换为单位向量 */
+ norm = invSqrt(mx*mx + my*my + mz*mz);
+ mx = mx * norm;
+ my = my * norm;
+ mz = mz * norm;
+
+
+ hx = 2.0f*(mx*(0.5f - q2q2 - q3q3) + my*(q1q2 - q0q3) + mz*(q1q3 + q0q2)); /*把(mx,my,mz)转换到地理坐标系的(hx,hy,hz),利用H = Q^-1 * M */
+ hy = 2.0f*(mx*(q1q2 + q0q3) + my*(0.5f - q1q1 - q3q3) + mz*(q2q3 - q0q1));
+ hz = 2.0f*(mx*(q1q3 - q0q2) + my*(q2q3 + q0q1) + mz*(0.5f - q1q1 - q2q2));
+
+ /*计的数值为(bx,by,0),所以我们不关注hx的数值 */
+ // bx = sqrtf((hx*hx) + (hy*hy)); /*使磁力计正交化*/
+ by = sqrtf((hx*hx) + (hy*hy));
+ bz = hz;
+
+ /*v代表的是把地理坐标系的加速度(0,0,1g)转换到机体坐标系的加 */
+ vx = 2.0f*(q1q3 - q0q2); /*速度计(ax,ay,az),其实就是用R*(0,0,1),R为旋转矩阵,此矩阵可 */
+ vy = 2 * (q0q1 + q2q3); /*由四元数转换得到 */
+ vz = q0q0 - q1q1 - q2q2 + q3q3;
+
+ wx = 2.0f*(by*(q1q2 + q0q3) + bz*(q1q3 - q0q2)); /*把正交化的H即B从地理坐标系转换到飞行器坐标系,利用W = Q * B */
+ wy = 2.0f*(by*(0.5f - q1q1 - q3q3) + bz*(q0q1 + q2q3)); /*这里认为bx = 0 */
+ wz = 2.0f*(by*(q2q3 - q0q1) + bz*(0.5f - q1q1 - q2q2));
+
+
+
+ /*如果使用磁力计,则融合磁力计*/
+ if (useMag != 0)
+ { /*用当前姿态向量和加速度的姿态向量做叉乘,乘积越小说明两个向量方向越相同*/
+ ex = AccelAjust*(ay*vz - az*vy) + MagAjust*(my*wz - mz*wy);
+ ey = AccelAjust*(az*vx - ax*vz) + MagAjust*(mz*wx - mx*wz);
+ ez = AccelAjust*(ax*vy - ay*vx) + MagAjust*(mx*wy - my*wx);
+ }
+ else
+ {
+
+ ex = AccelAjust*(ay*vz - az*vy);
+ ey = AccelAjust*(az*vx - ax*vz); /*因为加速度计没有校准,ez不靠谱*/
+ ez = AccelAjust*(ax*vy - ay*vx);
+ ez = 0;
+ }
+
+ if (ex != 0.0f && ey != 0.0f && ez != 0.0f)
+ {
+ /*这里使用了PID调节的方式,对角速度修正,Ki 是积分修正,Kp是直接修正 */
+ exInt = exInt + ex*Ki * halfT; /*对误差进行积分 */
+ eyInt = eyInt + ey*Ki * halfT;
+ ezInt = ezInt + ez*Ki * halfT;
+ gx = gx + Kp*(1 + Kd*fabsf(ex))*ex + exInt; /*使用比例和积分综合对陀螺仪进行修正,由于存在积分修正,所以才能确保回 */
+ gy = gy + Kp*(1 + Kd*fabsf(ey))*ey + eyInt; /*到期望回到的位置 */
+ gz = gz + Kp*(1 + Kd*fabsf(ez))*ez + ezInt;
+ }
+
+
+ qw = (-q1*gx - q2*gy - q3*gz)*halfT; /*利用一阶龙格库塔法对四元数进行更新*/
+ qx = (q0*gx + q2*gz - q3*gy)*halfT;
+ qy = (q0*gy - q1*gz + q3*gx)*halfT;
+ qz = (q0*gz + q1*gy - q2*gx)*halfT;
+
+ q0 = q0 + qw;
+ q1 = q1 + qx;
+ q2 = q2 + qy;
+ q3 = q3 + qz;
+
+ //LowPassFilterYaw(&q3,0.98);
+
+ norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3); /*对四元数进行规范化,即四元数模为1*/
+
+ q0 = q0 * norm; //w
+ q1 = q1 * norm; //x
+ q2 = q2 * norm; //y
+ q3 = q3 * norm; //z
+
+
+ /*对原变换公式进行重写,避免了以前坐标轴混乱的问题,按照标准y上z右x前*/
+ Pitch = asin(-2.0f*(q2*q1 - q0*q3))* (180.0f / 3.141592f); /*轴进行四元数到欧拉角的转换 */
+ Yaw = atan2(q3*q1 + q0*q2, 0.5f - q3*q3 - q2*q2)* (180.0f / 3.141592f);
+ Roll = atan2(q3*q2 + q0*q1, 0.5f - q3*q3 - q1*q1)* (180.0f / 3.141592f);
+
+ LowPassFilterYaw(&Yaw, 0.9f);
+
+ if (AHRS_Init > 200)
+ {
+ GlobalQ_Updating = TRUE;
+ GlobalQ.w = q0;
+ GlobalQ.x = q2;
+ GlobalQ.y = q3;
+ GlobalQ.z = q1;
+ GlobalQ_Updating = FALSE;
+ }
+ printf("%f %f %f\n", Yaw, Roll, Pitch);
+
+ IsHmdIntoStandBy(&Pitch, &Roll, 1.0f);
+}
+
+
+void MagFilter(float *mx, float *my, float *mz, float sita)
+{
+ static float xlast = 0, ylast = 0, zlast = 0;
+ if (xlast == 0 && ylast == 0 && zlast == 0)
+ {
+ xlast = *mx;
+ ylast = *my;
+ zlast = *mz;
+ }
+ else
+ {
+ xlast = sita*xlast + (1 - sita)*(*mx);
+ ylast = sita*ylast + (1 - sita)*(*my);
+ zlast = sita*zlast + (1 - sita)*(*mz);
+ }
+}
+
+
+/*******************************************************************************
+* Function Name : invSqrt
+* Description : 快速计算 1/Sqrt(x),源自雷神3,神奇的0x5f3759df
+* 输入 : x
+* 输出 :1/sqrt(x)
+*******************************************************************************/
+float invSqrt(float x)
+{
+ float halfx = 0.5f * x;
+ float y = x;
+ long i = *(long*)&y;
+ i = 0x5f3759df - (i >> 1);
+ y = *(float*)&i;
+ y = y * (1.5f - (halfx * y * y));
+ return y;
+}
+
+
+void GyroComputeDrift(float *gx, float *gy, float *gz)
+{
+ static float GxOffect = 0.0f, GyOffect = 0.0f, GzOffect = 0.0f;
+ static float GxOffectTmp = 0.0f, GyOffectTmp = 0.0f, GzOffectTmp = 0.0f;
+ static float GxTmp = 0.0f, GyTmp = 0.0f, GzTmp = 0.0f;
+ static int count = 0;
+
+ *gx = *gx - GxOffect;
+ *gy = *gy - GyOffect;
+ *gz = *gz - GzOffect;
+
+ if (HmdStandByState == true){
+ GxTmp = GxTmp + *gx;
+ GyTmp = GyTmp + *gy;
+ GzTmp = GzTmp + *gz;
+ count++;
+ if (count == 3000){
+ //printf("陀螺仪校准完成\n");
+
+ GxOffectTmp = GxTmp / count;
+ GyOffectTmp = GyTmp / count;
+ GzOffectTmp = GzTmp / count;
+
+ GxOffect = GxOffect + GxOffectTmp;
+ GyOffect = GyOffect + GyOffectTmp;
+ GzOffect = GzOffect + GzOffectTmp;
+
+ GxTmp = 0.0f;
+ GyTmp = 0.0f;
+ GzTmp = 0.0f;
+ count = 0;
+ }
+ }
+ else{
+ count = 0;
+ GxTmp = 0.0f;
+ GyTmp = 0.0f;
+ GzTmp = 0.0f;
+ }
+
+}
+
+void LowPassFilterYaw(float *z, float alpha)
+{
+ static float lastz = 0;
+ if (lastz == 0)
+ {
+ lastz = *z;
+ }
+ else
+ {
+ *z = alpha*lastz + (1 - alpha)*(*z);
+ lastz = *z;
+ }
+
+}
+
+
+
+bool IsHmdIntoStandBy(float *Pitch, float *Roll, float dTime)
+{
+ static float LastPitch = 0.0f, LastRoll = 0.0f;
+ static float LastGyroX = 0.0f, LastGyroY = 0.0f;
+ static int count = 0;
+ float GyroX = 0.0f, GyroY = 0.0f, alpha = 0.98f;
+
+
+ /* 初始化静态变量 */
+ if (LastPitch == 0.0f&&LastRoll == 0.0f){
+ LastPitch = *Pitch;
+ LastRoll = *Roll;
+ }
+ /*对Pitch和Roll微分,求Gx和Gy */
+ GyroX = fabsf(*Roll - LastRoll) / dTime;
+ GyroY = fabsf(*Pitch - LastPitch) / dTime;
+ /*初始化静态变量*/
+ if (LastGyroX == 0.0f&&LastGyroY == 0.0f){
+ LastGyroX = GyroX;
+ LastGyroY = GyroY;
+ }
+ /*进行一个滑动窗口滤波降低偶然误差*/
+ GyroX = alpha*LastGyroX + (1 - alpha)*GyroX;
+ GyroY = alpha*LastGyroY + (1 - alpha)*GyroY;
+
+ //printf("%f %f\n", GyroX, GyroY);
+
+ if (GyroX < 0.0055f&&GyroY < 0.0015f){
+ count++;
+ if (count == 3000){
+ count = 0;
+ HmdStandByState = true;
+ printf("头显进入休眠\n");
+ }
+ }
+ else{
+ count = 0;
+ HmdStandByState = false;
+ }
+ /* 更新静态变量 */
+ LastRoll = *Roll;
+ LastPitch = *Pitch;
+ LastGyroX = GyroX;
+ LastGyroY = GyroY;
+
+ return HmdStandByState;
+}
+
+float DM_GetYaw(void)
+{
+ return Yaw;
+}
+
+float DM_GetPitch(void)
+{
+ return Pitch;
+}
+float DM_GetRoll(void)
+{
+ return Roll;
+}
+
+
+
+
+Quaternion CorrectQuaterinonYaw(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+int ResetHeading(void)
+{
+ Quaternion q = { GlobalQ.w, 0, GlobalQ.y, 0 };
+ CQ_DM = CorrectQuaterinonYaw(q);
+ DM_Corrected = true;
+ return DM_Corrected ? 1 : 0;
+}
+
+Quaternion GetPoseQuat(void)
+{
+ static Quaternion QLast = { 1.0f, 0.0f, 0.0f, 0.0f };
+ if (!GlobalQ_Updating)
+ {
+ QLast.w = GlobalQ.w;
+ QLast.x = GlobalQ.x;
+ QLast.y = GlobalQ.y;
+ QLast.z = GlobalQ.z;
+ }
+ if (DM_Corrected){
+ return QuaternionMulti(QLast, CQ_DM);
+ }
+ return QLast;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/SensorImpl.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/SensorImpl.h
new file mode 100644
index 0000000..e31fb3e
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/SensorImpl.h
@@ -0,0 +1,56 @@
+#ifndef _SENSORIMPL_H_
+#define _SENSORIMPL_H_
+#include "quaternion.h"
+
+#ifdef __cplusplus
+extern "C"{
+ Quaternion GetPoseQuat(void);
+
+ void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+ void GetControllerSensor(unsigned char usb_input_buffer[]);
+
+ /*
+ * 描述 : 获取偏航角Yaw
+ */
+ float DM_GetYaw(void);
+ /*
+ * 描述 :获取俯仰角Pitch
+ */
+ float DM_GetPitch(void);
+ /*
+ * 描述 :获取滚转角Roll
+ */
+ float DM_GetRoll(void);
+
+ float invSqrt(float x) ;
+
+ void ResetAHRS();
+
+ void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz,char useMag,int Dtime);
+
+ Vector3 GetMagData();
+
+ int ResetHeading(void);
+
+}
+#else
+
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+void GetControllerSensor(unsigned char usb_input_buffer[]);
+
+__declspec(dllexport) float GetLocX(void);
+
+__declspec(dllexport) float GetLocY(void);
+
+__declspec(dllexport) float GetLocZ(void);
+
+#endif
+
+
+
+#endif
+
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/USB_Win32_HIDDevice.c b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/USB_Win32_HIDDevice.c
new file mode 100644
index 0000000..03dfa57
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/USB_Win32_HIDDevice.c
@@ -0,0 +1,246 @@
+/***************************************************************************
+* 描 述: USBHID设备驱动代码
+* 作 者: 詹力
+* 时 间: 2016/10/29
+***************************************************************************/
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "USB_Win32_HIDDevice.h"
+#include "MagCalibrate.h"
+#include "SensorImpl.h"
+
+#pragma comment(lib,"setupapi.lib")
+#pragma comment(lib, "hid.lib")
+
+unsigned char usb_output_buffer[65];
+unsigned char usb_input_buffer[256];
+unsigned char usb_feature_report_buffer[256];
+
+unsigned char buffer[255];
+/* 主函数,程序的入口 */
+
+HANDLE dematrix_usb_handle = INVALID_HANDLE_VALUE;
+HDEVINFO device_info_set;
+GUID HidGuid;
+SP_DEVICE_INTERFACE_DATA device_interface_data;
+HIDP_CAPS dematrix_device_capabilities;
+
+HANDLE DM_HID_Read_HANDLE;
+HANDLE DM_HID_Write_HANDLE;
+
+int i=5;
+BOOL device_is_found;
+OVERLAPPED usb_read_over_lapped;
+PSP_DEVICE_INTERFACE_DETAIL_DATA pData;
+
+
+BOOL HIDFindDeviceFromVendor(USHORT PID,USHORT VID,CHAR *Path)
+{
+ HANDLE DM_USB_HANDLE;
+ HIDD_ATTRIBUTES Dev_Attr;
+
+ Dev_Attr.Size = sizeof(Dev_Attr);
+
+ DM_USB_HANDLE = CreateFileA(Path, (DWORD)NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, (DWORD)NULL, NULL);
+ if(DM_USB_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ if (HidD_GetAttributes(DM_USB_HANDLE, &Dev_Attr) == FALSE) return FALSE;
+
+ HidD_GetNumInputBuffers(DM_USB_HANDLE, &i);
+ //printf("BufferSize[%d]\n",i);
+ dematrix_usb_get_capabilities(DM_USB_HANDLE);
+ //printf("Cap.out.length[%d]\n", dematrix_device_capabilities.OutputReportByteLength);
+ //printf("(PID=%x,VID=%x,VersionTest=%x)\n", Dev_Attr.ProductID, Dev_Attr.VendorID, Dev_Attr.VersionNumber);
+ if (Dev_Attr.ProductID == PID && Dev_Attr.VendorID == VID)
+ {
+ //printf("(PID=%x,VID=%x,VersionTest=%x)\n", Dev_Attr.ProductID, Dev_Attr.VendorID, Dev_Attr.VersionNumber);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+
+BOOL InitPathFromInterfaceData(HDEVINFO hdevInfoSet, SP_DEVICE_INTERFACE_DATA* pidata)
+{
+ DWORD detailSize = 0;
+ BOOL Result;
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet,pidata, NULL, (DWORD)NULL, &detailSize, NULL);
+
+ pData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(detailSize);
+ if (pData == NULL){
+ printf("内存不足!\n");
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ return FALSE;
+ }
+ pData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, pData, detailSize, NULL, NULL);
+ if(Result==TRUE)
+ {
+ //printf("Path = %s\n",(char *)(pData->DevicePath));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*给定USB设备,对USB设备进行枚举,如果PID和VID都符合,就打开USB设备并创建句柄*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID)
+{
+ HDEVINFO hdevInfoSet;
+ SP_DEVICE_INTERFACE_DATA interfaceData;
+
+
+ int deviceIndex = 0;
+ interfaceData.cbSize = sizeof(interfaceData);
+
+ /* 先取得GUID */
+ HidD_GetHidGuid(&HidGuid);
+
+ hdevInfoSet = SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);
+
+ if (hdevInfoSet == INVALID_HANDLE_VALUE) return FALSE;
+
+ for(deviceIndex = 0;
+ SetupDiEnumDeviceInterfaces(hdevInfoSet, NULL, &HidGuid, deviceIndex, &interfaceData);
+ deviceIndex++)
+ {
+ //printf("index = %d\n",deviceIndex);
+
+ if (!InitPathFromInterfaceData(hdevInfoSet, &interfaceData))
+ continue;
+ // 下面的函数需要路径
+ if(HIDFindDeviceFromVendor(PID,VID,(CHAR*)(pData->DevicePath)))
+ {
+ //printf("Path = %s\n",(char *)(pData->DevicePath));
+
+ DM_HID_Read_HANDLE = CreateFileA((char *)(pData->DevicePath), (DWORD)GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
+ FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+ DM_HID_Write_HANDLE = CreateFileA((char *)(pData->DevicePath), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
+
+
+ device_is_found = TRUE;
+ SetEvent(usb_read_over_lapped.hEvent);
+ printf("打开设备成功!\n");
+ break;
+ }else
+ continue;
+ }
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+
+ if(device_is_found==TRUE)return TRUE;
+ else
+ return FALSE;
+}
+
+void USB_HID_Init()
+{
+ //初始化读报告时用的Overlapped结构体
+ //偏移量设置为0
+ usb_read_over_lapped.Offset = 0;
+ usb_read_over_lapped.OffsetHigh = 0;
+ //创建一个事件,提供给ReadFile使用,当ReadFile完成时,
+ //会设置该事件为触发状态。
+ usb_read_over_lapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ start_thread(dematrix_usb_private_read_thread, NULL);
+}
+
+
+
+int globalpacklen = 0;
+DWORD dematrix_usb_private_read_thread(LPVOID param)
+{
+ DWORD length;
+
+ //该线程是个死循环,直到程序退出时,它才退出
+ while (1)
+ {
+ //设置事件为无效状态
+ ResetEvent(usb_read_over_lapped.hEvent);
+
+ //如果设备已经找到
+ if (device_is_found == TRUE)
+ {
+
+ if (DM_HID_Read_HANDLE == INVALID_HANDLE_VALUE) {
+ printf("无效的读报告句柄,可能是打开设备时失败");
+ }
+ else {
+
+ CancelIo(DM_HID_Read_HANDLE);
+ // DKHD2这里使用62,DK2一定要使用64,否则无法读取数据
+ ReadFile(DM_HID_Read_HANDLE, usb_input_buffer,globalpacklen, NULL, &usb_read_over_lapped);
+ }
+
+ //等待事件触发
+ WaitForSingleObject(usb_read_over_lapped.hEvent, INFINITE);
+
+ //如果等待过程中设备被拔出,也会导致事件触发,但此时MyDevFound
+ //被设置为假,因此在这里判断MyDevFound为假的话就进入下一轮循环。
+ if (device_is_found == FALSE) continue;
+
+ //如果设备没有被拔下,则是ReadFile函数正常操作完成。
+ //通过GetOverlappedResult函数来获取实际读取到的字节数。
+ GetOverlappedResult(DM_HID_Read_HANDLE, &usb_read_over_lapped, &length, TRUE);
+
+ //如果字节数不为0,则将读到的数据显示到信息框中
+ if (length != 0)
+ {
+ int useful_length = usb_input_buffer[1];
+
+ GetControllerSensor(usb_input_buffer);
+ }
+ }
+ else {
+ //阻塞线程,直到下次事件被触发
+ WaitForSingleObject(usb_read_over_lapped.hEvent, INFINITE);
+ }
+ }
+ return 0;
+}
+
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle)
+{
+ PHIDP_PREPARSED_DATA PreparsedData;
+
+ if (hid_usb_handle == NULL) return;
+
+ HidD_GetPreparsedData(hid_usb_handle, &PreparsedData);
+
+ HidP_GetCaps(PreparsedData, &dematrix_device_capabilities);
+
+ HidD_FreePreparsedData(PreparsedData);
+}
+
+DWORD start_thread(void *function_address, void *param)
+{
+ DWORD temp;
+#ifdef _WIN32
+ HANDLE hThread;
+ hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)function_address, param, 0, &temp);
+ if (hThread != NULL) return (DWORD)hThread;
+ else return 0x00;
+#else
+#ifdef linux
+ pthread_t hThread;
+ int Result;
+ Result = pthread_create(&hThread, NULL, (void *)function_address, param);
+ if (Result != NULL) return Result;
+ else return -NULL;
+#endif
+#endif
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/USB_Win32_HIDDevice.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/USB_Win32_HIDDevice.h
new file mode 100644
index 0000000..b38f61b
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/USB_Win32_HIDDevice.h
@@ -0,0 +1,50 @@
+#ifndef DM_Win32_HIDDevice_h_
+#define DM_Win32_HIDDevice_h_
+
+
+typedef struct _HID_HANDLE{
+ HANDLE HID_Read_HANDLE;
+ HANDLE HID_Write_HANDLE;
+}UsbHidHandle;
+
+#ifdef __cplusplus
+extern "C"{
+
+
+ /*给定USB设备的PID和VID,对USB设备进行枚举*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID);
+
+/*对USB HID 进行一些初始化操作,初始化一些必要的变量*/
+void USB_HID_Init();
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+DWORD start_thread(void *function_address, void *param);
+
+
+}
+
+#else
+
+ /*给定USB设备的PID和VID,对USB设备进行枚举*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID);
+
+/*对USB HID 进行一些初始化操作,初始化一些必要的变量*/
+void USB_HID_Init();
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+DWORD start_thread(void *function_address, void *param);
+
+#endif
+
+
+
+
+#endif
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/UsbHid_CAPI.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/UsbHid_CAPI.h
new file mode 100644
index 0000000..e8b2bb6
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/UsbHid_CAPI.h
@@ -0,0 +1,16 @@
+#ifndef _UsbHid_CAPI_H_
+#define _UsbHid_CAPI_H_
+
+#ifdef __cplusplus
+extern "C"{
+
+__declspec(dllexport) int Init_Hmd(void);
+
+}
+#else
+
+__declspec(dllexport) int Init_Hmd(void);
+
+#endif
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/dematrix_usb.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/dematrix_usb.h
new file mode 100644
index 0000000..d4983ce
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/dematrix_usb.h
@@ -0,0 +1,41 @@
+#ifndef _DEMATRIX_USB_H_
+#define _DEMATRIX_USB_H_
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/*返回1则找到设备,返回0 表示未找到设备*/
+_declspec(dllexport) int Init_Hmd(void);
+
+
+
+void dematrix_usb_init();
+
+BOOL HIDFindDeviceFromVendor(USHORT PID,USHORT VID,CHAR *Path);
+BOOL DM_HIDDeviceEnumerate(void);
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+int DK2_GetFeatureReport(HANDLE hid_usb_handle);
+int DK2_GetDisplayInfo(HANDLE hid_usb_handle,FILE *fp);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+
+
+
+
+
+#endif
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/hid.lib b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/hid.lib
new file mode 100644
index 0000000..0040fcc
Binary files /dev/null and b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/hid.lib differ
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/main.cpp b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/main.cpp
new file mode 100644
index 0000000..141fd0f
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/main.cpp
@@ -0,0 +1,1809 @@
+#include
+#include
+#include
+#include "USB_Win32_HIDDevice.h"
+#include "MagCalibrate.h"
+#include "SensorImpl.h"
+#include "IMU_CAPI.h"
+#include "UsbHid_CAPI.h"
+#include "quaternion.h"
+
+#include
+#include "hidsdi.h"
+#include
+
+#include
+
+#include "PipeHMD.h"
+
+#include
+#include
+#include
+#include
+#include
+#include "openvr_driver.h"
+#include "OVR_CAPI.h"
+#include "MagCalibrate.h"
+
+int global_calibration_flag = 0;//0none 1 gyro 2 acc 3 mag
+int global_Show = 0;//0 hide 1 gyro 2acc 3mag 4angle 5Hex
+
+std::string sCurrent_Device_str("null");
+std::string strGlobalDevicePath("null");
+extern "C" int globalpacklen;
+
+extern "C" BOOL device_is_found;
+extern "C" PSP_DEVICE_INTERFACE_DETAIL_DATA pData;
+extern "C" HANDLE DM_HID_Read_HANDLE;
+extern "C" HANDLE DM_HID_Write_HANDLE;
+extern float gx0, gy0, gz0;
+extern "C" OVERLAPPED usb_read_over_lapped;
+
+int global_pipeserver = 0;
+//extern Quaternion Qcorr;
+bool global_debug = false;
+
+#include
+
+#include
+
+
+
+FILE *fpdata;
+
+#define BUFSIZE 512
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_LEFT_POSE 2
+#define COMMAND_GET_RIGHT_POSE 3
+#define COMMAND_GET_LEFT_BAT 10
+#define COMMAND_GET_RIGHT_BAT 11
+
+#define COMMAND_SET_RUMBLE 20
+
+
+#define LEFT_HAND 0
+#define RIGHT_HAND 1
+
+
+
+
+#define BUFSIZE 512
+
+
+
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_DATA 2
+#define COMMAND_DEVICE_CALIBRATION 3
+#define COMMAND_DEVICE_GET_PURE_DATA 4
+#define COMMAND_DEVICE_ENTER_DFU_MODE 11
+
+#define ENTER_DFU_MODE_SUCCESS 1
+#define ENTER_DFU_MODE_FAILED 0
+#define CALIBRATION_SUCCESS 1
+#define CALIBRATION_FAILED 0
+
+
+#define FEATURE_OFFSET_SET_GYRO 1
+#define FEATURE_OFFSET_SET_ACC 2
+#define FEATURE_OFFSET_SET_MAG 3
+#define FEATURE_OFFSET_SET_LED 4
+#define FEATURE_OFFSET_GET_GYRO 0x11
+#define FEATURE_OFFSET_GET_ACC 0x12
+#define FEATURE_OFFSET_GET_MAG 0x13
+
+
+
+#define LED_COLOR_BLACK 0x00
+#define LED_COLOR_WHITE 0x07
+#define LED_COLOR_RED 0x04
+#define LED_COLOR_GREEN 0x02
+#define LED_COLOR_BLUE 0x01
+#define LED_COLOR_CYAN 0x03
+#define LED_COLOR_MAGENTA 0x06
+#define LED_COLOR_YELLOW 0x05
+
+UINT8 LED_COLOR_LIST[8] = {LED_COLOR_BLACK,LED_COLOR_WHITE,LED_COLOR_RED,LED_COLOR_GREEN,
+LED_COLOR_BLUE,LED_COLOR_CYAN,LED_COLOR_MAGENTA,LED_COLOR_YELLOW,};
+
+Quaternion CQGamePad = { 1, 0, 0, 0 };
+Quaternion CQHMD = { 1, 0, 0, 0 };
+
+
+
+
+
+
+#define FEATURE_OFFSET_SIZE 52//3+1+4*12
+
+DWORD WINAPI InstanceThread(LPVOID);
+VOID GetAnswerToRequest(LPCSTR, LPCSTR, LPDWORD);
+BOOL CreatePipeSecurity(PSECURITY_ATTRIBUTES *ppSa)
+{
+ BOOL fSucceeded = TRUE;
+ DWORD dwError = ERROR_SUCCESS;
+
+ PSECURITY_DESCRIPTOR pSd = NULL;
+ PSECURITY_ATTRIBUTES pSa = NULL;
+
+ // Define the SDDL for the security descriptor.
+ LPCSTR szSDDL = "D:" // Discretionary ACL
+ "(A;OICI;GRGW;;;AU)" // Allow read/write to authenticated users
+ "(A;OICI;GA;;;BA)"; // Allow full control to administrators
+
+ if (!ConvertStringSecurityDescriptorToSecurityDescriptor(szSDDL,
+ SDDL_REVISION_1, &pSd, NULL))
+ {
+ fSucceeded = FALSE;
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+ // Allocate the memory of SECURITY_ATTRIBUTES.
+ pSa = (PSECURITY_ATTRIBUTES)LocalAlloc(LPTR, sizeof(*pSa));
+ if (pSa == NULL)
+ {
+ fSucceeded = FALSE;
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+ pSa->nLength = sizeof(*pSa);
+ pSa->lpSecurityDescriptor = pSd;
+ pSa->bInheritHandle = FALSE;
+
+ *ppSa = pSa;
+
+Cleanup:
+ // Clean up the allocated resources if something is wrong.
+ if (!fSucceeded)
+ {
+ if (pSd)
+ {
+ LocalFree(pSd);
+ pSd = NULL;
+ }
+ if (pSa)
+ {
+ LocalFree(pSa);
+ pSa = NULL;
+ }
+
+ SetLastError(dwError);
+ }
+
+ return fSucceeded;
+}
+void FreePipeSecurity(PSECURITY_ATTRIBUTES pSa)
+{
+ if (pSa)
+ {
+ if (pSa->lpSecurityDescriptor)
+ {
+ LocalFree(pSa->lpSecurityDescriptor);
+ }
+ LocalFree(pSa);
+ }
+}
+int pipeservermain(VOID)
+{
+ if (global_pipeserver != 1)
+ {
+ return 0;
+ }
+ global_pipeserver = 2;
+
+ BOOL fConnected = FALSE;
+ DWORD dwThreadId = 0;
+ HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL;
+ //LPCSTR lpszPipename = TEXT("\\\\.\\pipe\\Dematrix_SteamVR");
+ LPCSTR lpszPipename = TEXT("\\\\.\\pipe\\Dematrix_CTL");
+ PSECURITY_ATTRIBUTES pSa;
+ if (!CreatePipeSecurity(&pSa))
+ {
+ printf("CreatePipeSecurity pSa FALSE\n");
+ FreePipeSecurity(pSa);
+ return 0;
+ }
+ // The main loop creates an instance of the named pipe and
+ // then waits for a client to connect to it. When the client
+ // connects, a thread is created to handle communications
+ // with that client, and this loop is free to wait for the
+ // next client connect request. It is an infinite loop.
+
+ for (;;)
+ {
+ if (global_pipeserver == -1)
+ {
+ global_pipeserver = 0;
+ break;
+ }
+ //_tprintf(TEXT("\nPipe Server: Main thread awaiting client connection on %s\n"), lpszPipename);
+ hPipe = CreateNamedPipe(
+ lpszPipename, // pipe name
+ PIPE_ACCESS_DUPLEX, // read/write access
+ PIPE_TYPE_MESSAGE | // message type pipe
+ PIPE_READMODE_MESSAGE | // message-read mode
+ PIPE_WAIT, // blocking mode
+ PIPE_UNLIMITED_INSTANCES, // max. instances
+ BUFSIZE, // output buffer size
+ BUFSIZE, // input buffer size
+ 0, // client time-out
+ pSa); // default security attribute
+
+ if (hPipe == INVALID_HANDLE_VALUE)
+ {
+ _tprintf(TEXT("CreateNamedPipe failed, GLE=%d.\n"), GetLastError());
+ return -1;
+ }
+
+ // Wait for the client to connect; if it succeeds,
+ // the function returns a nonzero value. If the function
+ // returns zero, GetLastError returns ERROR_PIPE_CONNECTED.
+
+ fConnected = ConnectNamedPipe(hPipe, NULL) ?
+ TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
+
+ if (fConnected)
+ {
+ //printf("Client connected, creating a processing thread.\n");
+
+ // Create a thread for this client.
+ hThread = CreateThread(
+ NULL, // no security attribute
+ 0, // default stack size
+ InstanceThread, // thread proc
+ (LPVOID)hPipe, // thread parameter
+ 0, // not suspended
+ &dwThreadId); // returns thread ID
+
+ if (hThread == NULL)
+ {
+ _tprintf(TEXT("CreateThread failed, GLE=%d.\n"), GetLastError());
+ return -1;
+ }
+ else CloseHandle(hThread);
+ }
+ else
+ // The client could not connect, so close the pipe.
+ CloseHandle(hPipe);
+ }
+ printf("管道服务器终止....\n");
+ return 0;
+}
+
+DWORD WINAPI InstanceThread(LPVOID lpvParam)
+// This routine is a thread processing function to read from and reply to a client
+// via the open pipe connection passed from the main loop. Note this allows
+// the main loop to continue executing, potentially creating more threads of
+// of this procedure to run concurrently, depending on the number of incoming
+// client connections.
+{
+ HANDLE hHeap = GetProcessHeap();
+ CHAR* pchRequest = (CHAR*)HeapAlloc(hHeap, 0, BUFSIZE*sizeof(CHAR));
+ CHAR* pchReply = (CHAR*)HeapAlloc(hHeap, 0, BUFSIZE*sizeof(CHAR));
+
+ DWORD cbBytesRead = 0, cbReplyBytes = 0, cbWritten = 0;
+ BOOL fSuccess = FALSE;
+ HANDLE hPipe = NULL;
+
+ // Do some extra error checking since the app will keep running even if this
+ // thread fails.
+
+ if (lpvParam == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL value in lpvParam.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchReply != NULL) HeapFree(hHeap, 0, pchReply);
+ if (pchRequest != NULL) HeapFree(hHeap, 0, pchRequest);
+ return (DWORD)-1;
+ }
+
+ if (pchRequest == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL heap allocation.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchReply != NULL) HeapFree(hHeap, 0, pchReply);
+ return (DWORD)-1;
+ }
+
+ if (pchReply == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL heap allocation.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchRequest != NULL) HeapFree(hHeap, 0, pchRequest);
+ return (DWORD)-1;
+ }
+
+ // Print verbose messages. In production code, this should be for debugging only.
+ //printf("InstanceThread created, receiving and processing messages.\n");
+
+ // The thread's parameter is a handle to a pipe object instance.
+
+ hPipe = (HANDLE)lpvParam;
+
+ // Loop until done reading
+ while (1)
+ {
+ // Read client requests from the pipe. This simplistic code only allows messages
+ // up to BUFSIZE characters in length.
+ fSuccess = ReadFile(
+ hPipe, // handle to pipe
+ pchRequest, // buffer to receive data
+ BUFSIZE*sizeof(TCHAR), // size of buffer
+ &cbBytesRead, // number of bytes read
+ NULL); // not overlapped I/O
+
+ if (!fSuccess || cbBytesRead == 0)
+ {
+ if (GetLastError() == ERROR_BROKEN_PIPE)
+ {
+ //_tprintf(TEXT("InstanceThread: client disconnected.\n"), GetLastError());
+ }
+ else
+ {
+ _tprintf(TEXT("InstanceThread ReadFile failed, GLE=%d.\n"), GetLastError());
+ }
+ break;
+ }
+
+ // Process the incoming message.
+ GetAnswerToRequest(pchRequest, pchReply, &cbReplyBytes);
+
+ // Write the reply to the pipe.
+ fSuccess = WriteFile(
+ hPipe, // handle to pipe
+ pchReply, // buffer to write from
+ cbReplyBytes, // number of bytes to write
+ &cbWritten, // number of bytes written
+ NULL); // not overlapped I/O
+
+ if (!fSuccess || cbReplyBytes != cbWritten)
+ {
+ _tprintf(TEXT("InstanceThread WriteFile failed, GLE=%d.\n"), GetLastError());
+ break;
+ }
+ }
+
+ // Flush the pipe to allow the client to read the pipe's contents
+ // before disconnecting. Then disconnect the pipe, and close the
+ // handle to this pipe instance.
+
+ FlushFileBuffers(hPipe);
+ DisconnectNamedPipe(hPipe);
+ CloseHandle(hPipe);
+
+ HeapFree(hHeap, 0, pchRequest);
+ HeapFree(hHeap, 0, pchReply);
+
+ //printf("InstanceThread exitting.\n");
+ return 1;
+}
+
+void ProcessHMDData(void *read_buffer, void* write_buffer, LPDWORD pchBytes){
+ unsigned char* writeBuffer = (unsigned char*)write_buffer;
+ BOOL status = FALSE;
+ unsigned int *int_value;
+ int_value = (unsigned int *)read_buffer;
+
+ memset(writeBuffer, 0, 512);
+ switch (int_value[0]){
+ case COMMAND_DEVICE_IS_OPEN:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ case COMMAND_GET_DATA:{
+ ovrSensorState *result = (ovrSensorState*)&writeBuffer[0];
+ Quaternion q = GetPoseQuat();
+ result[0].Recorded.Pose.Orientation.w = q.w;
+ result[0].Recorded.Pose.Orientation.x = q.x;
+ result[0].Recorded.Pose.Orientation.y = q.y;
+ result[0].Recorded.Pose.Orientation.z = q.z;
+ *pchBytes = sizeof(ovrSensorState);
+ break;
+ }
+ case COMMAND_DEVICE_CALIBRATION:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ // case COMMAND_DEVICE_GET_PURE_DATA:{
+ // float *result = (float*)&writeBuffer[0];
+ // result[0] = usbDEV.fBatteryLevel[LEFT_HAND];
+ // if (!device_is_found)
+ // {
+ // result[0] = 0.0f;
+ // }
+ // *pchBytes = sizeof(float);
+ // break;
+ // }
+ case COMMAND_DEVICE_ENTER_DFU_MODE:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ }
+}
+extern UINT8 global_key[4];
+
+float global_ctlposition[3] = {0,0,0};
+void ProcessCtlData(void *read_buffer, void* write_buffer, LPDWORD pchBytes){
+ unsigned char* writeBuffer = (unsigned char*)write_buffer;
+ BOOL status = FALSE;
+ unsigned int *int_value;
+ int_value = (unsigned int *)read_buffer;
+
+ memset(writeBuffer, 0, 512);
+ switch (int_value[0]){
+ case COMMAND_DEVICE_IS_OPEN:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ *result = device_is_found;
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ case COMMAND_GET_LEFT_POSE:{
+ vr::DriverPose_t *result = (vr::DriverPose_t*)&writeBuffer[0];
+ //Quaternion q = DM_GetQ();
+ result[0].qRotation.w = 1;
+ result[0].qRotation.x = 0;
+ result[0].qRotation.y = 0;
+ result[0].qRotation.z = 0;
+ *pchBytes = sizeof(vr::DriverPose_t);
+ break;
+ }
+ case COMMAND_GET_RIGHT_POSE:{
+ vr::DriverPose_t *result = (vr::DriverPose_t*)&writeBuffer[0];
+ Quaternion q = QuaternionMulti(GetPoseQuat(),CQGamePad);
+ result[0].qRotation.w = q.w;
+ result[0].qRotation.x = q.x;
+ result[0].qRotation.y = q.y;
+ result[0].qRotation.z = q.z;
+ result[0].vecPosition[0]=global_ctlposition[0];
+ result[0].vecPosition[1]=global_ctlposition[1];
+ result[0].vecPosition[2]=global_ctlposition[2];
+ unsigned char *aAxis = (unsigned char *)&result[0].vecVelocity[3];
+ aAxis[0] = global_key[0]<<1;//unsigned char K[4] ;//依次为 8个按键数据(8bit依次△,▽,RB,◎(轴按下), Y,B,A,X ),x轴,y轴,和trig
+ //aAxis[1] = usbDEV.K[hand][1];
+ //aAxis[2] = usbDEV.K[hand][2];
+ aAxis[3] = global_key[3];//我偷懒用这传的按键状态......你说不需要vecVelocity的嘛....
+ *pchBytes = sizeof(vr::DriverPose_t);
+ break;
+ }
+ case COMMAND_GET_LEFT_BAT:{
+ float *result = (float*)&writeBuffer[0];
+ result[0] = 0;
+ if (!device_is_found)
+ {
+ result[0] = 0.0f;
+ }
+ *pchBytes = sizeof(float);
+ break;
+ }
+ case COMMAND_GET_RIGHT_BAT:{
+ float *result = (float*)&writeBuffer[0];
+ result[0] = 0.7f;
+ if (!device_is_found)
+ {
+ result[0] = 0.0f;
+ }
+ *pchBytes = sizeof(float);
+ break;
+ }
+ case COMMAND_SET_RUMBLE:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ *result = true;// TriggerHaptic(*(unsigned int*)a_command.data / 255, 50);
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ }
+}
+
+VOID GetAnswerToRequest(LPCSTR pchRequest,
+ LPCSTR pchReply,
+ LPDWORD pchBytes)
+{
+ // This routine is a simple function to print the client request to the console
+ // and populate the reply buffer with a default data string. This is where you
+ // would put the actual client request processing code that runs in the context
+ // of an instance thread. Keep in mind the main thread will continue to wait for
+ // and receive other client connections while the instance thread is working.
+ ProcessCtlData((void*)pchRequest, (void*)pchReply, pchBytes);
+}
+FILE* Getfpdata()
+{
+ return fpdata;
+}
+
+Quaternion CorrectQuaterinonY(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+Quaternion CorrectQuaterinon(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+
+void ShowHelp()
+{
+ printf("============================HELP===========================\n");
+ printf("h - 显示帮助\n");
+ printf("c - 检查设备连接\n");
+ printf("d - 进入DFU模式\n");
+ printf("l - LED 颜色设置\n");
+ printf("t - 校准陀螺仪\n");
+// printf(" - b - 取消校准\n");
+// printf(" - s - 显示陀螺仪数据\n");
+// printf(" - - b - 返回\n");
+ printf("p - 启动管道服务器\n");
+// printf(" - r - 启动管道服务器\n");
+// printf(" - s - 关闭管道服务器\n");
+ printf("g - 进入陀螺仪校准\n");
+// printf(" - s - 显示陀螺仪数据\n");
+// printf(" - - b - 返回\n");
+// printf(" - c - 校准数据\n");
+// printf(" - r - 重置为0\n");
+// printf(" - g - 获取当前陀螺仪计校准参数\n");
+// printf(" - b - 返回\n");
+ printf("m - 进入磁力校准\n");
+// printf(" - g - 获取当前磁力计校准参数\n");
+// printf(" - s - 写入默认磁力计参数\n");
+// printf(" - c - 开始获取磁力计数据并写入data.txt\n");
+// printf(" - - f - 数据获取完成 需要输入新的校准参数\n");
+// printf(" - - c - 取消校准\n");
+// printf(" - - q - 退出校准\n");
+ printf("a - 显示欧拉角数据\n");
+// printf(" - b - 返回\n");
+ printf("o - 显示原始数据\n");
+// printf(" - b - 返回\n");
+ printf("M - 移动虚拟位置\n");
+ printf(" c校准方向 b返回 空格归零 \n");
+ printf(" ws ad qe按照手柄方向移动虚拟位置 \n");
+ printf(" WS AD QE按照头盔方向移动虚拟位置 \n");
+ printf("============================帮助===========================\n");
+}
+
+
+int main()
+{
+// printf("DMGamePad调试工具 2016-12-13 02:11:20\n");
+// /**
+// * 初始化USB_HID
+// * 相关初始化变量
+// * 启动读取线程
+// **/globalpacklen = 64;
+// USB_HID_Init();
+// find_device:
+// /*查找PID=0x0001,VID为0x2833的USB设备*/
+// //while (!DM_HIDDeviceEnumerate(0x5750, 0x0483))
+// while (!DM_HIDDeviceEnumerate(0x0002, 0x2833))
+// {
+// printf("找不到0x0001, 0x2833 USB设备!\n");
+// Sleep(1000);
+// // if (_getche()=='q')
+// // {
+// // return 0;
+// // }
+// }
+ Init("VID_2833&PID_0002");
+ //system("cls");
+ ShowHelp();
+ DMPipe::PipeHMD p("\\\\.\\Pipe\\Dematrix_SteamVR");
+
+// UINT8 MAG_Info[FEATURE_OFFSET_SIZE] = { 0x0b };
+// UINT8 MAG_Set[FEATURE_OFFSET_SIZE] = { 0x0b};
+
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+
+ while (1)
+ {
+ //printf(">>");
+ *offset_set_dev = *offset_get_dev = 0;
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ memset(offset_set_data, 0, FEATURE_OFFSET_SIZE - 4);
+ char s;
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'c')//检查设备是否有效
+ {
+ if (CheckDevice()==0)
+ {
+ printf("设备已连接...\n");
+ }
+ else
+ {
+ printf("设备断开连接...\n");
+ device_is_found = FALSE;
+ Sleep(1000);
+ //goto find_device;
+ }
+ }
+ else if (s == 'h')
+ {
+ ShowHelp();
+ }
+ else if (s == 'a')
+ {
+ global_Show = 4;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s == 'M')
+ {
+ int _flag = 1;
+ float step = 0.005f;
+ //clrscr();
+ //global_Show = 4;
+ while (_flag!=0)
+ {
+ printf(">>"); s = _getch(); printf("\n");
+ MVector3 tmppos = {0,0,0};
+ Quaternion qhmd = { 1, 0, 0, 0 };
+ if (s == 'b')
+ {
+ _flag = 0;
+ }
+ else if (s == ' ')
+ {
+ global_ctlposition[0] = 0;
+ global_ctlposition[1] = 0;
+ global_ctlposition[2] = 0;
+ }
+ else if (s == 'r')
+ {
+ CQHMD = {1,0,0,0};
+ CQGamePad = { 1, 0, 0, 0 };
+ }
+ else if (s == 'c')
+ {
+
+ if (p.IsOpen())
+ {
+ ovrSensorState ss = p.GetSensorData();
+ qhmd = { ss.Recorded.Pose.Orientation.w, 0, ss.Recorded.Pose.Orientation.y, 0 };
+ CQHMD = CorrectQuaterinonY(qhmd);
+ CQGamePad = QuaternionMulti(CorrectQuaterinonY(GetPoseQuat()), qhmd);
+ printf("Success!\n");
+ }
+
+ }
+ else if ((s == 'w') || (s == 'W'))
+ {
+ tmppos = { 0, 0, -1 };//向前 -z方向
+ }
+ else if ((s == 's') || (s == 'S'))
+ {
+ tmppos = { 0, 0, 1 };//向后 z方向
+ }
+ else if ((s == 'a') || (s == 'A'))
+ {
+ tmppos = { 0, 0, -1 };//向左 -x方向
+ }
+ else if ((s == 'd') || (s == 'D'))
+ {
+ tmppos = { 0, 0, 1 };//向右 x方向
+ }
+ else if ((s == 'q') || (s == 'Q'))
+ {
+ global_ctlposition[1] -= step;
+ }
+ else if ((s == 'e') || (s == 'E'))
+ {
+ global_ctlposition[1] += step;
+ }
+ Quaternion cq;// = CorrectQuaterinonY(DM_GetQ());
+ if ((s == 'W') || (s == 'A') || (s == 'S') || (s == 'D'))
+ {
+ if (p.IsOpen())
+ {
+ ovrSensorState ss = p.GetSensorData();
+ qhmd = { ss.Recorded.Pose.Orientation.w, ss.Recorded.Pose.Orientation.x, ss.Recorded.Pose.Orientation.y, ss.Recorded.Pose.Orientation.z };
+ CQHMD = CorrectQuaterinonY(qhmd);
+ }
+ cq = CQHMD;
+ }
+ else if ((s == 'w') || (s == 'a') || (s == 's') || (s == 'd'))
+ {
+ cq = QuaternionMulti(CorrectQuaterinonY(GetPoseQuat()), CQGamePad);
+ }
+
+ if ((s == 'a') || (s == 'd') || (s == 'A') || (s == 'D'))
+ {
+ cq = QuaternionMulti(cq, CreateQuaternion(-90, { 0, 1, 0 }));
+ }
+
+ Matrix3 rm3 = QuaternionToMatrix(cq);
+ MVector3 posv3 = ComputeRotate(rm3, tmppos);
+ global_ctlposition[2] += posv3.v[2] * step;
+ global_ctlposition[0] += posv3.v[0] * step;
+ printf("POS:%f %f %f\n", global_ctlposition[0], global_ctlposition[1], global_ctlposition[2]);
+ }
+ }
+ else if (s == 'o')//原始数据
+ {
+ system("cls");
+ global_Show = 5;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s=='l')
+ {
+ printf("\nLED 颜色设置\n");
+ printf("K - BLACK\n");
+ printf("W - WHITE\n");
+ printf("R - RED\n");
+ printf("G - GREEN\n");
+ printf("B - BLUE\n");
+ printf("C - CYAN\n");
+ printf("M - MAGENTA\n");
+ printf("Y - YELLOW\n");
+ printf("L - LOOP\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s=='L'||s=='l')
+ {
+ for (int i = 0; i < 8; i++)
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[i];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ Sleep(250);
+ }
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[5];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ }
+ else
+ {
+ char colorlist[8]{'K', 'W', 'R', 'G', 'B', 'C', 'M', 'Y'};
+ for (int i = 0; i < 8; i++)
+ {
+ if (colorlist[i] == s || colorlist[i] == (s - 32))//大小写
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[i];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("Color Set\n");
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ else
+ {
+ printf("FAILED\n");
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (s == 'g')
+ {
+ printf("\n上位机陀螺仪校准\n");
+ printf(" - s - 显示陀螺仪数据\n");
+ printf(" - - b - 返回\n");
+ printf(" - c - 校准数据\n");
+ printf(" - r - 重置为0\n");
+ printf(" - g - 获取当前陀螺仪计校准参数\n");
+ printf(" - b - 返回\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'c')
+ {
+ //printf("上位机校准尚未实现\n");
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 GYRO_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ GYRO_Cali_Last[3] = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, GYRO_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ float gyrodefault[3] = { 0.0f, 0.0f, 0.0f};
+ memcpy(offset_set_data, gyrodefault, sizeof(float) * 3);
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ global_Show = 1;
+ global_calibration_flag = 1;
+ while (global_calibration_flag == 1)//开始获取gyro数据
+ {
+
+ }
+ global_Show = 0;
+ Sleep(500);
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ float gyronew[3] = { -gx0,-gz0,-gy0 };//逆向坐标转换
+ memcpy(offset_set_data, gyronew, sizeof(float) * 3);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Set[i]);
+ }
+ printf("\n");
+ printf("SetGyroOffset\n");
+ }
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ //显示数据
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ }
+ else if (s == 'g')//获取陀螺仪零偏数据
+ {
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("GetGyro\n");
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+ }
+ printf("\n");
+ //显示数据
+ //float* f= (float*)(FEATURE_OFFSET_Get + 6);
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ",offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ else if (s=='r')
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ float gyronew[3] = { 0, 0, 0 };
+ memcpy(offset_set_data, gyronew, sizeof(float) * 3);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("ResetGyroOffset\n");
+ }
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ", offset_set_data[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 's')
+ {
+ global_Show = 1;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s == 'b')
+ {
+
+ }
+ }
+ else if (s == 't')
+ {
+ printf("\n下位机陀螺仪校准\n请静置头显 \n 按任意键开始校准陀螺仪\n");
+ printf(" - b - 取消校准\n");
+ printf(" - s - 显示陀螺仪数据\n");
+ printf(" - - b - 返回\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ printf("校准取消\n");
+ }
+ else if (s == 's')
+ {
+ global_Show = 1;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else
+ {
+ Sleep(1000);
+ UINT8 gyrocali[5] = { 0x08, 0x00, 0x00, 0x10, 0x26 };
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, gyrocali, 5))
+ {
+ printf("正在校准陀螺仪...请保持头盔静置!\n");
+ Sleep(5000);
+ printf("校准陀螺仪成功\n");
+ }
+ else
+ {
+ printf("校准陀螺仪失败\n");
+ }
+ }
+ }
+ else if (s == 'd')
+ {
+ printf("enter dfu\n");
+ UINT8 dfu[5] = { 0x08, 0x00, 0x00, 0x10, 0x25 };
+ HidD_SetFeature(DM_HID_Read_HANDLE, dfu, 5);
+ }
+ else if (s == 'i')
+ {
+ printf("chipid\n");
+ UINT8 chipid[15] = { 0x0A };
+ HidD_GetFeature(DM_HID_Read_HANDLE, chipid, 15);
+ for (int i = 0; i < 15; i++)
+ {
+ if(global_debug) printf("%2x ", chipid[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 'm')
+ {
+ printf("\n磁力校准\n");
+ printf(" - l - 计算2data.txt");
+ printf(" - r - 重置为默认值\n");
+ printf(" - g - 获取当前磁力计校准参数\n");
+ printf(" - s - 写入默认磁力计参数\n");
+ printf(" - c - 开始获取磁力计数据并写入data.txt\n");
+ printf(" - - f - 数据获取完成 需要输入新的校准参数\n");
+ printf(" - - c - 取消校准\n");
+ printf(" - - q - 退出校准\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s=='l')
+ {
+ GetMagDataFormFile();
+ }
+ else if (s == 's')
+ {
+ printf("setreport\n");
+ float magcali[6] = { -2.018673f, -2.303837f, 1.989453f, 4.899964f, 4.839235f, 5.541566f };
+ memcpy(offset_set_data, magcali, sizeof(float) * 6);
+
+
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Set[i]);
+ }
+ if (HidD_SetFeature(DM_HID_Read_HANDLE,FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("success\n");
+ }
+ }
+ else if (s == 'r')
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("ResetMagOffset\n");
+ }
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_set_data[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 'g')
+ {
+// printf("GetMag\n");
+//
+// for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+// {
+// if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+// }
+// printf("\nin float\n");
+// for (int i = 0; i < 6; i++)
+// {
+// printf("%f ", offset_get_data[i]);
+// }
+// printf("\n");
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+ }
+ printf("\nin float\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ else if (s == 'c')
+ {
+ global_calibration_flag = 3;
+ if (global_calibration_flag == 3)//MagConfig
+ {
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 MAG_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ MAG_Cali_Last[3] = FEATURE_OFFSET_GET_MAG;
+ //if (HidD_GetFeature(DM_HID_Read_HANDLE, MAG_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ *offset_set_dev= FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ //if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ remove("data.txt");
+ fopen_s(&fpdata, "data.txt", "w");//打开一个空文件以进行写入。如果该文件存在,其内容将被销毁。
+
+ if (fpdata != NULL)
+ {
+ global_Show = 3;
+ printf("文件初始化成功!\n");
+ //Sleep(100);
+
+ }
+ else
+ {
+ printf("文件初始化失败!\n");
+ global_calibration_flag = 0;
+ }
+ while (global_calibration_flag == 3)//开始获取Mag数据
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'f' || s == 'c' || s == 'q')//结束/取消/退出
+ {
+ break;
+ }
+ }
+ }
+ global_Show = 0;
+ }
+ global_calibration_flag = 0;
+ if (fpdata != NULL)
+ {
+ CancelIo(fpdata);
+ fclose(fpdata);
+ }
+
+ if (s == 'f')//Finished
+ {
+ printf("写入文件数据结束,等待计算参数后输入:\n");
+ float mag_new_cali[6];
+ system("pause");
+ MagCaliParam magcalitmp = GetMagDataFormFile();
+ mag_new_cali[0] = magcalitmp.xOffset;
+ mag_new_cali[1] = magcalitmp.yOffset;
+ mag_new_cali[2] = magcalitmp.zOffset;
+ mag_new_cali[3] = magcalitmp.xScale;
+ mag_new_cali[4] = magcalitmp.yScale;
+ mag_new_cali[5] = magcalitmp.zScale;
+// for (int i = 0; i < 6; i++)
+// {
+// printf("输入第%d个参数:", i + 1);
+// std::cin >> mag_str_tmp;
+// mag_new_cali[i] = atof(mag_str_tmp);
+// }
+ memcpy(offset_set_data, mag_new_cali, sizeof(float) * 6);
+ }
+ else
+ {
+ if (s == 'c')
+ printf("校准取消");
+ memcpy(FEATURE_OFFSET_Set, MAG_Cali_Last, FEATURE_OFFSET_SIZE);
+ }
+ printf("\n");
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ if (s == 'c')
+ printf("参数写入成功\n");
+ }
+ //最后读取一遍
+ printf("Get\n");
+ Sleep(100);
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("当前校准参数:\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+
+ }
+ }
+
+
+ }
+ else if (s == 'p')
+ {
+
+ printf("管道服务器\n");
+ printf(" - r - 启动管道服务器\n");
+ printf(" - s - 关闭管道服务器\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'r')
+ {
+ if (global_pipeserver == 0)
+ {
+ global_pipeserver = 1;
+ printf("启动管道服务器.....\n");
+ start_thread(pipeservermain, NULL);
+ }
+ else
+ {
+ printf("管道服务器已经运行...\n");
+ }
+ }
+ else if (s == 's')
+ {
+ if (global_pipeserver == 0)
+ {
+ printf("管道服务器尚未开启...\n");
+ }
+ else
+ {
+ global_pipeserver = -1;
+ }
+ }
+
+ }
+ }
+
+ printf("按任意按键开始校准...\n");
+ getchar();
+ printf("开始写入数据...\n");
+
+ while (1)
+ {
+
+ }
+
+
+
+}
+//win消息
+#include
+BOOL bIsRunning = TRUE;
+//transform
+#include
+#pragma region HID
+HDEVINFO device_info_set;
+
+SP_DEVICE_INTERFACE_DATA device_interface_data;
+HIDP_CAPS dematrix_device_capabilities;
+GUID HidGuid;
+BOOL InitPathFromInterfaceData(HDEVINFO hdevInfoSet, SP_DEVICE_INTERFACE_DATA* pidata)
+{
+ DWORD detailSize = 0;
+ BOOL Result;
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, NULL, (DWORD)NULL, &detailSize, NULL);
+
+ pData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(detailSize);
+ if (pData == NULL){
+ printf("内存不足!\n");
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ return FALSE;
+ }
+ pData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, pData, detailSize, NULL, NULL);
+ if (Result == TRUE)
+ {
+ //printf("Path = %s\n", (char *)(pData->DevicePath));
+ return TRUE;
+ }
+ return FALSE;
+}
+BOOL DM_HIDDeviceEnumerate(void)
+{
+
+ HDEVINFO hdevInfoSet;
+ SP_DEVICE_INTERFACE_DATA interfaceData;
+ int gamepadcount = 0;
+
+ int deviceIndex = 0;
+ interfaceData.cbSize = sizeof(interfaceData);
+
+ /* 先取得GUID */
+ HidD_GetHidGuid(&HidGuid);
+
+ hdevInfoSet = SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);
+
+ if (hdevInfoSet == INVALID_HANDLE_VALUE) return FALSE;
+
+ for (deviceIndex = 0;
+ SetupDiEnumDeviceInterfaces(hdevInfoSet, NULL, &HidGuid, deviceIndex, &interfaceData);
+ deviceIndex++)
+ {
+
+
+ if (!InitPathFromInterfaceData(hdevInfoSet, &interfaceData))
+ continue;
+ //printf("index = %d\n",deviceIndex);
+ string pathstr(pData->DevicePath);
+ transform(pathstr.begin(), pathstr.end(), pathstr.begin(), toupper);
+ std::size_t found = pathstr.find(strGlobalDevicePath);
+
+ if (found != std::string::npos)
+ {
+ // printf("Path = %s\n", pathstr.c_str());
+ sCurrent_Device_str = pathstr;
+ //printf("sCurrent_Device_str:\n %s\n", sCurrent_Device_str.c_str());
+ DM_HID_Read_HANDLE = CreateFileA((char *)(pData->DevicePath), (DWORD)GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
+ FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+ DM_HID_Write_HANDLE = CreateFileA((char *)(pData->DevicePath), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
+
+ if (DM_HID_Read_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ device_is_found = TRUE;
+ SetEvent(usb_read_over_lapped.hEvent);
+ printf("read打开设备成功!\n>>");
+ }
+ else
+ {
+ printf("read打开设备失败!\n>>");
+ }
+ if (DM_HID_Write_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ printf("write打开设备成功!\n>>");
+ }
+ else
+ {
+ printf("write打开设备失败!\n>>");
+ }
+
+ break;
+ }
+ else
+ continue;
+ }
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ if (device_is_found == TRUE)return TRUE;
+ else
+ return FALSE;
+}
+#pragma endregion
+#pragma region WindowsMessage
+
+HWND hMessageWindow;
+HDEVNOTIFY hDeviceNotify;
+
+bool MessageCallback(WORD messageType, const std::string& devicePath)
+{
+ bool rv = true;
+ if (messageType == DBT_DEVICEARRIVAL)
+ {
+
+ //rv = pNotificationClient->OnMessage(Notifier::DeviceAdded, devicePath);
+ if (!device_is_found)
+ {
+ printf("检测到新设备插入,正在初始化!\n>>");
+ DM_HIDDeviceEnumerate();
+ rv = device_is_found;
+ //TriggerHaptic(1, 50);
+ //TriggerHaptic(1, 100);
+ }
+ else
+ {
+ printf("检测到插入VID PID 相同的设备,但设备已经初始化!\n>>");
+ }
+ }
+ else if (messageType == DBT_DEVICEREMOVECOMPLETE)
+ {
+ //pNotificationClient->OnMessage(Notifier::DeviceRemoved, devicePath);
+ //printf("%s\n%s\n", devicePath.c_str(), sCurrent_Device_str.c_str());
+ if (device_is_found)
+ {
+ //found = devicePath.find(sCurrent_Device_str);
+ if (devicePath.find(sCurrent_Device_str) != std::string::npos)
+ {
+ ResetAHRS();
+ device_is_found = FALSE;
+ sCurrent_Device_str = "NULL";
+ if (DM_HID_Read_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(DM_HID_Read_HANDLE);
+ DM_HID_Read_HANDLE = INVALID_HANDLE_VALUE;
+ }
+ if (DM_HID_Write_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(DM_HID_Write_HANDLE);
+ DM_HID_Write_HANDLE = INVALID_HANDLE_VALUE;
+ }
+ printf("设备已拔出!\n>>");
+ }
+ else
+ {
+ printf("拔出了具有相同的vid pid但并不是已经打开的设备!\n>>");
+ }
+ }
+ }
+ else
+ {
+
+ }
+ return rv;
+}
+
+
+LRESULT CALLBACK WindowsMessageCallback(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_CREATE:
+ {
+ // Setup window user data with device status object pointer.
+ LPCREATESTRUCT create_struct = reinterpret_cast(lParam);
+ void *lpCreateParam = create_struct->lpCreateParams;
+ //DeviceStatus *pDeviceStatus = reinterpret_cast(lpCreateParam);
+ //printf("create\n");
+ bIsRunning = TRUE;
+ //SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast(pDeviceStatus));
+ }
+ return 0; // Return 0 for successfully handled WM_CREATE.
+
+ case WM_DEVICECHANGE:
+ {
+ WORD loword = LOWORD(wParam);
+
+ if (loword != DBT_DEVICEARRIVAL &&
+ loword != DBT_DEVICEREMOVECOMPLETE)
+ {
+ // Ignore messages other than device arrive and remove complete
+ // (we're not handling intermediate ones).
+ return TRUE; // Grant WM_DEVICECHANGE request.
+ }
+
+ DEV_BROADCAST_DEVICEINTERFACE* hdr;
+ hdr = (DEV_BROADCAST_DEVICEINTERFACE*)lParam;
+
+ if (hdr->dbcc_devicetype != DBT_DEVTYP_DEVICEINTERFACE)
+ {
+ // Ignore non interface device messages.
+ return TRUE; // Grant WM_DEVICECHANGE request.
+ }
+
+ //LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
+
+ //DeviceStatus* pDeviceStatus = (DeviceStatus*)userData;
+ string devicePath(hdr->dbcc_name);
+
+ if (/*pDeviceStatus->*/HidGuid == hdr->dbcc_classguid)
+ {
+ transform(devicePath.begin(), devicePath.end(), devicePath.begin(), toupper);
+ std::string str2(strGlobalDevicePath);
+ //printf("devicePath:%s\n", devicePath.c_str());
+ std::size_t found = devicePath.find(str2);
+ if (found != std::string::npos)
+ {
+ if (!MessageCallback(loword, devicePath))
+ {
+
+ }
+ break;
+ }
+ }
+ }
+ return TRUE; // Grant WM_DEVICECHANGE request.
+
+
+ case WM_CLOSE:
+ {
+ //LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ bIsRunning = FALSE;
+ DestroyWindow(hwnd);
+ }
+ return 0; // We processed the WM_CLOSE message.
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0; // We processed the WM_DESTROY message.
+ }
+
+ return DefWindowProc(hwnd, message, wParam, lParam);
+}
+
+
+bool WinProcInitialize()
+{
+ TCHAR special_name[] = TEXT("wnd_class_name_usbDMCali_JustFeng_2017");
+ WNDCLASS wndClass;
+ wndClass.style = CS_HREDRAW | CS_VREDRAW;
+ wndClass.lpfnWndProc = WindowsMessageCallback;
+ wndClass.cbClsExtra = 0;
+ wndClass.cbWndExtra = 0;
+ wndClass.hInstance = 0;
+ wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
+ wndClass.lpszMenuName = NULL;
+ wndClass.lpszClassName = special_name;
+
+ if (!RegisterClass(&wndClass))
+ {
+ printf("Failed to register window class.");
+ return false;
+ }
+
+ // We're going to create a 'message-only' window. This will be hidden, can't be enumerated etc.
+ // To do this we supply 'HWND_MESSAGE' as the hWndParent.
+ // http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
+ hMessageWindow = CreateWindow(special_name,
+ special_name,
+ WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ HWND_MESSAGE,
+ NULL,
+ 0,
+ NULL); // Pass this object via the CREATESTRUCT mechanism
+ // so that we can attach it to the window user data.
+
+ if (hMessageWindow == NULL)
+ {
+ printf("Failed to create window.");
+ return false;
+ }
+
+ // According to MS, topmost windows receive WM_DEVICECHANGE faster.
+ ::SetWindowPos(hMessageWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+ UpdateWindow(hMessageWindow);
+
+
+ // Register notification for additional HID messages.
+ HidD_GetHidGuid(&HidGuid);
+
+ DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
+
+ ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
+ notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+ notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+ //notificationFilter.dbcc_classguid = hidguid;
+
+ // We need DEVICE_NOTIFY_ALL_INTERFACE_CLASSES to detect
+ // HDMI plug/unplug events.
+ hDeviceNotify = RegisterDeviceNotification(
+ hMessageWindow,
+ ¬ificationFilter,
+ DEVICE_NOTIFY_ALL_INTERFACE_CLASSES | DEVICE_NOTIFY_WINDOW_HANDLE);
+
+ if (hDeviceNotify == NULL)
+ {
+ printf("Failed to register for device notifications.");
+ return false;
+ }
+
+ return true;
+}
+
+void ProcessMessages()
+{
+ //printf("MSG\n");
+ if (hMessageWindow == NULL)
+ printf("Need to call 'Initialize' before first use.");
+
+ MSG msg;
+
+ // Note WM_DEVICECHANGED messages are dispatched but not retrieved by PeekMessage.
+ // I think this is because they are pending, non-queued messages.
+ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+}
+
+#pragma endregion
+
+
+DWORD Thread_Win_MSG()
+{
+
+ if (!WinProcInitialize())
+ {
+ bIsRunning = FALSE;
+ }
+ while (bIsRunning)
+ {
+ Sleep(1);
+ ProcessMessages();
+
+ }
+ return 0;
+}
+
+
+
+
+
+ /* 控制器初始化函数 */
+ __declspec(dllexport) int Init(char* devpath)
+ {
+ USB_HID_Init();
+ strGlobalDevicePath = devpath;//"VID_2833&PID_0002";
+ globalpacklen = 64;
+ start_thread(Thread_Win_MSG, 0);
+ DM_HIDDeviceEnumerate();
+ return 1;
+ }
+
+
+ __declspec(dllexport) int CheckDevice(void)
+ {
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("设备已连接...\n");
+ }
+ else
+ {
+ printf("设备断开连接...\n");
+ device_is_found = FALSE;
+ }
+ return device_is_found?1:0;
+ }
+
+ __declspec(dllexport) int GyroCali(void)
+ {
+ if (device_is_found)
+ {
+ UINT8 gyrocali[5] = { 0x08, 0x00, 0x00, 0x10, 0x26 };
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, gyrocali, 5))
+ {
+ //printf("正在校准陀螺仪...请保持头盔静置!\n");
+ //Sleep(1000);
+ return 1;
+ //printf("校准陀螺仪成功\n");
+ }
+ }
+
+ return 0;
+
+
+ }
+ __declspec(dllexport) Vector3 GetGyroCali(void)
+ {
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ if (!device_is_found)
+ return v;
+
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+
+
+ *offset_set_dev = *offset_get_dev = 0;
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ memset(offset_set_data, 0, FEATURE_OFFSET_SIZE - 4);
+
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ v.x = offset_get_data[0];
+ v.y = offset_get_data[1];
+ v.z = offset_get_data[2];
+ }
+ return v;
+ }
+
+ __declspec(dllexport) MagCaliParam GetMagCali()
+ {
+ MagCaliParam mcp;
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ mcp.xOffset = offset_get_data[0];
+ mcp.yOffset = offset_get_data[1];
+ mcp.zOffset = offset_get_data[2];
+ mcp.xScale = offset_get_data[3];
+ mcp.yScale = offset_get_data[4];
+ mcp.zScale = offset_get_data[5];
+
+ printf("当前校准参数:\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ return mcp;
+ }
+ __declspec(dllexport) int SetMagCali(float x, float y, float z, float x0, float y0, float z0)
+ {
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { x, y, z, x0, y0, z0 };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("SetMagOffset\n");
+ return 1;
+ }
+ return 0;
+ }
+
+
+int Global_MagCali = 0;
+
+__declspec(dllexport) int MagCalibrate(void)
+{
+ if (global_calibration_flag == 3)
+ {
+ return 0;
+ }
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ DWORD checkhandle;
+ global_calibration_flag = 3;
+ if (global_calibration_flag == 3)//MagConfig
+ {
+
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 MAG_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ MAG_Cali_Last[3] = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, MAG_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ if (SetMagCali(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f))
+ {
+ return 1;
+ }
+ global_Show = 0;
+ }
+ global_calibration_flag = 0;
+
+ return 0;
+ }
+}
+
+__declspec(dllexport) int FinishMagCali(void)
+{
+ global_calibration_flag = 0;
+ global_Show = 0;
+ return 1;
+}
+__declspec(dllexport) MagCaliParam CalculateMagParam()
+{
+ return GetMagDataFormFile();
+}
+
+/* 获取左手信息 */
+__declspec(dllexport) Vector3 GetPoint(void)
+{
+ if (!device_is_found){
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ return v;
+ }
+ return GetMagData();
+}
+
+__declspec(dllexport) Vector3 GetEulerianAngle(void)
+{
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ if (device_is_found)
+ {
+ v.z = DM_GetYaw();
+ v.x = DM_GetPitch();
+ v.y = DM_GetRoll();
+ }
+ return v;
+}
+
+__declspec(dllexport) int Correction(void)
+{
+ return ResetHeading();
+}
+
+__declspec(dllexport) Quaternion GetQuaternion(void)
+{
+ return GetPoseQuat();
+}
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/openvr_driver.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/openvr_driver.h
new file mode 100644
index 0000000..ea7f8d1
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/openvr_driver.h
@@ -0,0 +1,1635 @@
+#pragma once
+
+// openvr_driver.h
+//========= Copyright Valve Corporation ============//
+// Dynamically generated file. Do not modify this file directly.
+
+#ifndef _OPENVR_DRIVER_API
+#define _OPENVR_DRIVER_API
+
+#include
+
+
+
+// vrtypes.h
+#ifndef _INCLUDE_VRTYPES_H
+#define _INCLUDE_VRTYPES_H
+
+namespace vr
+{
+
+#if defined(__linux__) || defined(__APPLE__)
+ // The 32-bit version of gcc has the alignment requirement for uint64 and double set to
+ // 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
+ // The 64-bit version of gcc has the alignment requirement for these types set to
+ // 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
+ // The 64-bit structure packing has to match the 32-bit structure packing for each platform.
+ #pragma pack( push, 4 )
+#else
+ #pragma pack( push, 8 )
+#endif
+
+typedef void* glSharedTextureHandle_t;
+typedef int32_t glInt_t;
+typedef uint32_t glUInt_t;
+
+// right-handed system
+// +y is up
+// +x is to the right
+// -z is going away from you
+// Distance unit is meters
+struct HmdMatrix34_t
+{
+ float m[3][4];
+};
+
+struct HmdMatrix44_t
+{
+ float m[4][4];
+};
+
+struct HmdVector3_t
+{
+ float v[3];
+};
+
+struct HmdVector4_t
+{
+ float v[4];
+};
+
+struct HmdVector3d_t
+{
+ double v[3];
+};
+
+struct HmdVector2_t
+{
+ float v[2];
+};
+
+struct HmdQuaternion_t
+{
+ double w, x, y, z;
+};
+
+struct HmdColor_t
+{
+ float r, g, b, a;
+};
+
+struct HmdQuad_t
+{
+ HmdVector3_t vCorners[ 4 ];
+};
+
+struct HmdRect2_t
+{
+ HmdVector2_t vTopLeft;
+ HmdVector2_t vBottomRight;
+};
+
+/** Used to return the post-distortion UVs for each color channel.
+* UVs range from 0 to 1 with 0,0 in the upper left corner of the
+* source render target. The 0,0 to 1,1 range covers a single eye. */
+struct DistortionCoordinates_t
+{
+ float rfRed[2];
+ float rfGreen[2];
+ float rfBlue[2];
+};
+
+enum EVREye
+{
+ Eye_Left = 0,
+ Eye_Right = 1
+};
+
+enum EGraphicsAPIConvention
+{
+ API_DirectX = 0, // Normalized Z goes from 0 at the viewer to 1 at the far clip plane
+ API_OpenGL = 1, // Normalized Z goes from 1 at the viewer to -1 at the far clip plane
+};
+
+enum EColorSpace
+{
+ ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants.
+ ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format).
+ ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm.
+};
+
+struct Texture_t
+{
+ void* handle; // Native d3d texture pointer or GL texture id.
+ EGraphicsAPIConvention eType;
+ EColorSpace eColorSpace;
+};
+
+enum ETrackingResult
+{
+ TrackingResult_Uninitialized = 1,
+
+ TrackingResult_Calibrating_InProgress = 100,
+ TrackingResult_Calibrating_OutOfRange = 101,
+
+ TrackingResult_Running_OK = 200,
+ TrackingResult_Running_OutOfRange = 201,
+};
+
+static const uint32_t k_unTrackingStringSize = 32;
+static const uint32_t k_unMaxDriverDebugResponseSize = 32768;
+
+/** Used to pass device IDs to API calls */
+typedef uint32_t TrackedDeviceIndex_t;
+static const uint32_t k_unTrackedDeviceIndex_Hmd = 0;
+static const uint32_t k_unMaxTrackedDeviceCount = 16;
+static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF;
+
+/** Describes what kind of object is being tracked at a given ID */
+enum ETrackedDeviceClass
+{
+ TrackedDeviceClass_Invalid = 0, // the ID was not valid.
+ TrackedDeviceClass_HMD = 1, // Head-Mounted Displays
+ TrackedDeviceClass_Controller = 2, // Tracked controllers
+ TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points
+
+ TrackedDeviceClass_Other = 1000,
+};
+
+
+/** Describes what specific role associated with a tracked device */
+enum ETrackedControllerRole
+{
+ TrackedControllerRole_Invalid = 0, // Invalid value for controller type
+ TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand
+ TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand
+};
+
+
+/** describes a single pose for a tracked object */
+struct TrackedDevicePose_t
+{
+ HmdMatrix34_t mDeviceToAbsoluteTracking;
+ HmdVector3_t vVelocity; // velocity in tracker space in m/s
+ HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?)
+ ETrackingResult eTrackingResult;
+ bool bPoseIsValid;
+
+ // This indicates that there is a device connected for this spot in the pose array.
+ // It could go from true to false if the user unplugs the device.
+ bool bDeviceIsConnected;
+};
+
+/** Identifies which style of tracking origin the application wants to use
+* for the poses it is requesting */
+enum ETrackingUniverseOrigin
+{
+ TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose
+ TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user
+ TrackingUniverseRawAndUncalibrated = 2, // Poses are provided in the coordinate system defined by the driver. You probably don't want this one.
+};
+
+
+/** Each entry in this enum represents a property that can be retrieved about a
+* tracked device. Many fields are only valid for one ETrackedDeviceClass. */
+enum ETrackedDeviceProperty
+{
+ // general properties that apply to all device classes
+ Prop_TrackingSystemName_String = 1000,
+ Prop_ModelNumber_String = 1001,
+ Prop_SerialNumber_String = 1002,
+ Prop_RenderModelName_String = 1003,
+ Prop_WillDriftInYaw_Bool = 1004,
+ Prop_ManufacturerName_String = 1005,
+ Prop_TrackingFirmwareVersion_String = 1006,
+ Prop_HardwareRevision_String = 1007,
+ Prop_AllWirelessDongleDescriptions_String = 1008,
+ Prop_ConnectedWirelessDongle_String = 1009,
+ Prop_DeviceIsWireless_Bool = 1010,
+ Prop_DeviceIsCharging_Bool = 1011,
+ Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full
+ Prop_StatusDisplayTransform_Matrix34 = 1013,
+ Prop_Firmware_UpdateAvailable_Bool = 1014,
+ Prop_Firmware_ManualUpdate_Bool = 1015,
+ Prop_Firmware_ManualUpdateURL_String = 1016,
+ Prop_HardwareRevision_Uint64 = 1017,
+ Prop_FirmwareVersion_Uint64 = 1018,
+ Prop_FPGAVersion_Uint64 = 1019,
+ Prop_VRCVersion_Uint64 = 1020,
+ Prop_RadioVersion_Uint64 = 1021,
+ Prop_DongleVersion_Uint64 = 1022,
+ Prop_BlockServerShutdown_Bool = 1023,
+ Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024,
+ Prop_ContainsProximitySensor_Bool = 1025,
+ Prop_DeviceProvidesBatteryStatus_Bool = 1026,
+ Prop_DeviceCanPowerOff_Bool = 1027,
+ Prop_Firmware_ProgrammingTarget_String = 1028,
+ Prop_DeviceClass_Int32 = 1029,
+ Prop_HasCamera_Bool = 1030,
+
+ // Properties that are unique to TrackedDeviceClass_HMD
+ Prop_ReportsTimeSinceVSync_Bool = 2000,
+ Prop_SecondsFromVsyncToPhotons_Float = 2001,
+ Prop_DisplayFrequency_Float = 2002,
+ Prop_UserIpdMeters_Float = 2003,
+ Prop_CurrentUniverseId_Uint64 = 2004,
+ Prop_PreviousUniverseId_Uint64 = 2005,
+ Prop_DisplayFirmwareVersion_Uint64 = 2006,
+ Prop_IsOnDesktop_Bool = 2007,
+ Prop_DisplayMCType_Int32 = 2008,
+ Prop_DisplayMCOffset_Float = 2009,
+ Prop_DisplayMCScale_Float = 2010,
+ Prop_EdidVendorID_Int32 = 2011,
+ Prop_DisplayMCImageLeft_String = 2012,
+ Prop_DisplayMCImageRight_String = 2013,
+ Prop_DisplayGCBlackClamp_Float = 2014,
+ Prop_EdidProductID_Int32 = 2015,
+ Prop_CameraToHeadTransform_Matrix34 = 2016,
+ Prop_DisplayGCType_Int32 = 2017,
+ Prop_DisplayGCOffset_Float = 2018,
+ Prop_DisplayGCScale_Float = 2019,
+ Prop_DisplayGCPrescale_Float = 2020,
+ Prop_DisplayGCImage_String = 2021,
+ Prop_LensCenterLeftU_Float = 2022,
+ Prop_LensCenterLeftV_Float = 2023,
+ Prop_LensCenterRightU_Float = 2024,
+ Prop_LensCenterRightV_Float = 2025,
+ Prop_UserHeadToEyeDepthMeters_Float = 2026,
+ Prop_CameraFirmwareVersion_Uint64 = 2027,
+ Prop_CameraFirmwareDescription_String = 2028,
+ Prop_DisplayFPGAVersion_Uint64 = 2029,
+ Prop_DisplayBootloaderVersion_Uint64 = 2030,
+ Prop_DisplayHardwareVersion_Uint64 = 2031,
+ Prop_AudioFirmwareVersion_Uint64 = 2032,
+ Prop_CameraCompatibilityMode_Int32 = 2033,
+
+ // Properties that are unique to TrackedDeviceClass_Controller
+ Prop_AttachedDeviceId_String = 3000,
+ Prop_SupportedButtons_Uint64 = 3001,
+ Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType
+ Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType
+ Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType
+ Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType
+ Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType
+
+ // Properties that are unique to TrackedDeviceClass_TrackingReference
+ Prop_FieldOfViewLeftDegrees_Float = 4000,
+ Prop_FieldOfViewRightDegrees_Float = 4001,
+ Prop_FieldOfViewTopDegrees_Float = 4002,
+ Prop_FieldOfViewBottomDegrees_Float = 4003,
+ Prop_TrackingRangeMinimumMeters_Float = 4004,
+ Prop_TrackingRangeMaximumMeters_Float = 4005,
+ Prop_ModeLabel_String = 4006,
+
+ // Vendors are free to expose private debug data in this reserved region
+ Prop_VendorSpecific_Reserved_Start = 10000,
+ Prop_VendorSpecific_Reserved_End = 10999,
+};
+
+/** No string property will ever be longer than this length */
+static const uint32_t k_unMaxPropertyStringSize = 32 * 1024;
+
+/** Used to return errors that occur when reading properties. */
+enum ETrackedPropertyError
+{
+ TrackedProp_Success = 0,
+ TrackedProp_WrongDataType = 1,
+ TrackedProp_WrongDeviceClass = 2,
+ TrackedProp_BufferTooSmall = 3,
+ TrackedProp_UnknownProperty = 4,
+ TrackedProp_InvalidDevice = 5,
+ TrackedProp_CouldNotContactServer = 6,
+ TrackedProp_ValueNotProvidedByDevice = 7,
+ TrackedProp_StringExceedsMaximumLength = 8,
+ TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later.
+};
+
+/** Allows the application to control what part of the provided texture will be used in the
+* frame buffer. */
+struct VRTextureBounds_t
+{
+ float uMin, vMin;
+ float uMax, vMax;
+};
+
+
+/** Allows the applicaiton to control how scene textures are used by the compositor when calling Submit. */
+enum EVRSubmitFlags
+{
+ // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied.
+ Submit_Default = 0x00,
+
+ // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear
+ // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by
+ // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit().
+ Submit_LensDistortionAlreadyApplied = 0x01,
+
+ // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag.
+ Submit_GlRenderBuffer = 0x02
+};
+
+
+/** Status of the overall system or tracked objects */
+enum EVRState
+{
+ VRState_Undefined = -1,
+ VRState_Off = 0,
+ VRState_Searching = 1,
+ VRState_Searching_Alert = 2,
+ VRState_Ready = 3,
+ VRState_Ready_Alert = 4,
+ VRState_NotReady = 5,
+};
+
+/** The types of events that could be posted (and what the parameters mean for each event type) */
+enum EVREventType
+{
+ VREvent_None = 0,
+
+ VREvent_TrackedDeviceActivated = 100,
+ VREvent_TrackedDeviceDeactivated = 101,
+ VREvent_TrackedDeviceUpdated = 102,
+ VREvent_TrackedDeviceUserInteractionStarted = 103,
+ VREvent_TrackedDeviceUserInteractionEnded = 104,
+ VREvent_IpdChanged = 105,
+ VREvent_EnterStandbyMode = 106,
+ VREvent_LeaveStandbyMode = 107,
+ VREvent_TrackedDeviceRoleChanged = 108,
+
+ VREvent_ButtonPress = 200, // data is controller
+ VREvent_ButtonUnpress = 201, // data is controller
+ VREvent_ButtonTouch = 202, // data is controller
+ VREvent_ButtonUntouch = 203, // data is controller
+
+ VREvent_MouseMove = 300, // data is mouse
+ VREvent_MouseButtonDown = 301, // data is mouse
+ VREvent_MouseButtonUp = 302, // data is mouse
+ VREvent_FocusEnter = 303, // data is overlay
+ VREvent_FocusLeave = 304, // data is overlay
+ VREvent_Scroll = 305, // data is mouse
+ VREvent_TouchPadMove = 306, // data is mouse
+
+ VREvent_InputFocusCaptured = 400, // data is process
+ VREvent_InputFocusReleased = 401, // data is process
+ VREvent_SceneFocusLost = 402, // data is process
+ VREvent_SceneFocusGained = 403, // data is process
+ VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor)
+ VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene
+
+ VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily
+ VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility
+
+ VREvent_OverlayShown = 500,
+ VREvent_OverlayHidden = 501,
+ VREvent_DashboardActivated = 502,
+ VREvent_DashboardDeactivated = 503,
+ VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay
+ VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay
+ VREvent_ResetDashboard = 506, // Send to the overlay manager
+ VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID
+ VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading
+ VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it
+ VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it
+ VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it
+ VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else
+ VREvent_OverlaySharedTextureChanged = 513,
+
+ VREvent_Notification_Shown = 600,
+ VREvent_Notification_Hidden = 601,
+ VREvent_Notification_BeginInteraction = 602,
+ VREvent_Notification_Destroyed = 603,
+
+ VREvent_Quit = 700, // data is process
+ VREvent_ProcessQuit = 701, // data is process
+ VREvent_QuitAborted_UserPrompt = 702, // data is process
+ VREvent_QuitAcknowledged = 703, // data is process
+
+ VREvent_ChaperoneDataHasChanged = 800,
+ VREvent_ChaperoneUniverseHasChanged = 801,
+ VREvent_ChaperoneTempDataHasChanged = 802,
+ VREvent_ChaperoneSettingsHaveChanged = 803,
+ VREvent_SeatedZeroPoseReset = 804,
+
+ VREvent_BackgroundSettingHasChanged = 850,
+ VREvent_CameraSettingsHaveChanged = 851,
+
+ VREvent_StatusUpdate = 900,
+
+ VREvent_MCImageUpdated = 1000,
+
+ VREvent_FirmwareUpdateStarted = 1100,
+ VREvent_FirmwareUpdateFinished = 1101,
+
+ VREvent_KeyboardClosed = 1200,
+ VREvent_KeyboardCharInput = 1201,
+ VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard
+
+ VREvent_ApplicationTransitionStarted = 1300,
+ VREvent_ApplicationTransitionAborted = 1301,
+ VREvent_ApplicationTransitionNewAppStarted = 1302,
+
+ VREvent_Compositor_MirrorWindowShown = 1400,
+ VREvent_Compositor_MirrorWindowHidden = 1401,
+ VREvent_Compositor_ChaperoneBoundsShown = 1410,
+ VREvent_Compositor_ChaperoneBoundsHidden = 1411,
+
+ VREvent_TrackedCamera_StartVideoStream = 1500,
+ VREvent_TrackedCamera_StopVideoStream = 1501,
+ VREvent_TrackedCamera_PauseVideoStream = 1502,
+ VREvent_TrackedCamera_ResumeVideoStream = 1503,
+
+ VREvent_PerformanceTest_EnableCapture = 1600,
+ VREvent_PerformanceTest_DisableCapture = 1601,
+ VREvent_PerformanceTest_FidelityLevel = 1602,
+
+ // Vendors are free to expose private events in this reserved region
+ VREvent_VendorSpecific_Reserved_Start = 10000,
+ VREvent_VendorSpecific_Reserved_End = 19999,
+};
+
+
+/** Level of Hmd activity */
+enum EDeviceActivityLevel
+{
+ k_EDeviceActivityLevel_Unknown = -1,
+ k_EDeviceActivityLevel_Idle = 0,
+ k_EDeviceActivityLevel_UserInteraction = 1,
+ k_EDeviceActivityLevel_UserInteraction_Timeout = 2,
+ k_EDeviceActivityLevel_Standby = 3,
+};
+
+
+/** VR controller button and axis IDs */
+enum EVRButtonId
+{
+ k_EButton_System = 0,
+ k_EButton_ApplicationMenu = 1,
+ k_EButton_Grip = 2,
+ k_EButton_DPad_Left = 3,
+ k_EButton_DPad_Up = 4,
+ k_EButton_DPad_Right = 5,
+ k_EButton_DPad_Down = 6,
+ k_EButton_A = 7,
+
+ k_EButton_Axis0 = 32,
+ k_EButton_Axis1 = 33,
+ k_EButton_Axis2 = 34,
+ k_EButton_Axis3 = 35,
+ k_EButton_Axis4 = 36,
+
+ // aliases for well known controllers
+ k_EButton_SteamVR_Touchpad = k_EButton_Axis0,
+ k_EButton_SteamVR_Trigger = k_EButton_Axis1,
+
+ k_EButton_Dashboard_Back = k_EButton_Grip,
+
+ k_EButton_Max = 64
+};
+
+inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; }
+
+/** used for controller button events */
+struct VREvent_Controller_t
+{
+ uint32_t button; // EVRButtonId enum
+};
+
+
+/** used for simulated mouse events in overlay space */
+enum EVRMouseButton
+{
+ VRMouseButton_Left = 0x0001,
+ VRMouseButton_Right = 0x0002,
+ VRMouseButton_Middle = 0x0004,
+};
+
+
+/** used for simulated mouse events in overlay space */
+struct VREvent_Mouse_t
+{
+ float x, y; // co-ords are in GL space, bottom left of the texture is 0,0
+ uint32_t button; // EVRMouseButton enum
+};
+
+/** used for simulated mouse wheel scroll in overlay space */
+struct VREvent_Scroll_t
+{
+ float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe
+ uint32_t repeatCount;
+};
+
+/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger
+ is on the touchpad (or just released from it)
+**/
+struct VREvent_TouchPadMove_t
+{
+ // true if the users finger is detected on the touch pad
+ bool bFingerDown;
+
+ // How long the finger has been down in seconds
+ float flSecondsFingerDown;
+
+ // These values indicate the starting finger position (so you can do some basic swipe stuff)
+ float fValueXFirst;
+ float fValueYFirst;
+
+ // This is the raw sampled coordinate without deadzoning
+ float fValueXRaw;
+ float fValueYRaw;
+};
+
+/** notification related events. Details will still change at this point */
+struct VREvent_Notification_t
+{
+ uint64_t ulUserValue;
+ uint32_t notificationId;
+};
+
+/** Used for events about processes */
+struct VREvent_Process_t
+{
+ uint32_t pid;
+ uint32_t oldPid;
+ bool bForced;
+};
+
+
+/** Used for a few events about overlays */
+struct VREvent_Overlay_t
+{
+ uint64_t overlayHandle;
+};
+
+
+/** Used for a few events about overlays */
+struct VREvent_Status_t
+{
+ uint32_t statusState; // EVRState enum
+};
+
+/** Used for keyboard events **/
+struct VREvent_Keyboard_t
+{
+ char cNewInput[8]; // Up to 11 bytes of new input
+ uint64_t uUserValue; // Possible flags about the new input
+};
+
+struct VREvent_Ipd_t
+{
+ float ipdMeters;
+};
+
+struct VREvent_Chaperone_t
+{
+ uint64_t m_nPreviousUniverse;
+ uint64_t m_nCurrentUniverse;
+};
+
+/** Not actually used for any events */
+struct VREvent_Reserved_t
+{
+ uint64_t reserved0;
+ uint64_t reserved1;
+};
+
+struct VREvent_PerformanceTest_t
+{
+ uint32_t m_nFidelityLevel;
+};
+
+struct VREvent_SeatedZeroPoseReset_t
+{
+ bool bResetBySystemMenu;
+};
+
+/** If you change this you must manually update openvr_interop.cs.py */
+typedef union
+{
+ VREvent_Reserved_t reserved;
+ VREvent_Controller_t controller;
+ VREvent_Mouse_t mouse;
+ VREvent_Scroll_t scroll;
+ VREvent_Process_t process;
+ VREvent_Notification_t notification;
+ VREvent_Overlay_t overlay;
+ VREvent_Status_t status;
+ VREvent_Keyboard_t keyboard;
+ VREvent_Ipd_t ipd;
+ VREvent_Chaperone_t chaperone;
+ VREvent_PerformanceTest_t performanceTest;
+ VREvent_TouchPadMove_t touchPadMove;
+ VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset;
+} VREvent_Data_t;
+
+/** An event posted by the server to all running applications */
+struct VREvent_t
+{
+ uint32_t eventType; // EVREventType enum
+ TrackedDeviceIndex_t trackedDeviceIndex;
+ float eventAgeSeconds;
+ // event data must be the end of the struct as its size is variable
+ VREvent_Data_t data;
+};
+
+
+/** The mesh to draw into the stencil (or depth) buffer to perform
+* early stencil (or depth) kills of pixels that will never appear on the HMD.
+* This mesh draws on all the pixels that will be hidden after distortion.
+*
+* If the HMD does not provide a visible area mesh pVertexData will be
+* NULL and unTriangleCount will be 0. */
+struct HiddenAreaMesh_t
+{
+ const HmdVector2_t *pVertexData;
+ uint32_t unTriangleCount;
+};
+
+
+/** Identifies what kind of axis is on the controller at index n. Read this type
+* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n );
+*/
+enum EVRControllerAxisType
+{
+ k_eControllerAxis_None = 0,
+ k_eControllerAxis_TrackPad = 1,
+ k_eControllerAxis_Joystick = 2,
+ k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis
+};
+
+
+/** contains information about one axis on the controller */
+struct VRControllerAxis_t
+{
+ float x; // Ranges from -1.0 to 1.0 for joysticks and track pads. Ranges from 0.0 to 1.0 for triggers were 0 is fully released.
+ float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers.
+};
+
+
+/** the number of axes in the controller state */
+static const uint32_t k_unControllerStateAxisCount = 5;
+
+
+/** Holds all the state of a controller at one moment in time. */
+struct VRControllerState001_t
+{
+ // If packet num matches that on your prior call, then the controller state hasn't been changed since
+ // your last call and there is no need to process it
+ uint32_t unPacketNum;
+
+ // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask
+ uint64_t ulButtonPressed;
+ uint64_t ulButtonTouched;
+
+ // Axis data for the controller's analog inputs
+ VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ];
+};
+
+
+typedef VRControllerState001_t VRControllerState_t;
+
+
+/** determines how to provide output to the application of various event processing functions. */
+enum EVRControllerEventOutputType
+{
+ ControllerEventOutput_OSEvents = 0,
+ ControllerEventOutput_VREvents = 1,
+};
+
+
+
+/** Collision Bounds Style */
+enum ECollisionBoundsStyle
+{
+ COLLISION_BOUNDS_STYLE_BEGINNER = 0,
+ COLLISION_BOUNDS_STYLE_INTERMEDIATE,
+ COLLISION_BOUNDS_STYLE_SQUARES,
+ COLLISION_BOUNDS_STYLE_ADVANCED,
+ COLLISION_BOUNDS_STYLE_NONE,
+
+ COLLISION_BOUNDS_STYLE_COUNT
+};
+
+/** Allows the application to customize how the overlay appears in the compositor */
+struct Compositor_OverlaySettings
+{
+ uint32_t size; // sizeof(Compositor_OverlaySettings)
+ bool curved, antialias;
+ float scale, distance, alpha;
+ float uOffset, vOffset, uScale, vScale;
+ float gridDivs, gridWidth, gridScale;
+ HmdMatrix44_t transform;
+};
+
+/** used to refer to a single VR overlay */
+typedef uint64_t VROverlayHandle_t;
+
+static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0;
+
+/** Errors that can occur around VR overlays */
+enum EVROverlayError
+{
+ VROverlayError_None = 0,
+
+ VROverlayError_UnknownOverlay = 10,
+ VROverlayError_InvalidHandle = 11,
+ VROverlayError_PermissionDenied = 12,
+ VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist
+ VROverlayError_WrongVisibilityType = 14,
+ VROverlayError_KeyTooLong = 15,
+ VROverlayError_NameTooLong = 16,
+ VROverlayError_KeyInUse = 17,
+ VROverlayError_WrongTransformType = 18,
+ VROverlayError_InvalidTrackedDevice = 19,
+ VROverlayError_InvalidParameter = 20,
+ VROverlayError_ThumbnailCantBeDestroyed = 21,
+ VROverlayError_ArrayTooSmall = 22,
+ VROverlayError_RequestFailed = 23,
+ VROverlayError_InvalidTexture = 24,
+ VROverlayError_UnableToLoadFile = 25,
+ VROVerlayError_KeyboardAlreadyInUse = 26,
+ VROverlayError_NoNeighbor = 27,
+};
+
+/** enum values to pass in to VR_Init to identify whether the application will
+* draw a 3D scene. */
+enum EVRApplicationType
+{
+ VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries
+ VRApplication_Scene = 1, // Application will submit 3D frames
+ VRApplication_Overlay = 2, // Application only interacts with overlays
+ VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not
+ // keep it running if everything else quits.
+ VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility
+ // interfaces (like IVRSettings and IVRApplications) but not hardware.
+};
+
+
+/** error codes for firmware */
+enum EVRFirmwareError
+{
+ VRFirmwareError_None = 0,
+ VRFirmwareError_Success = 1,
+ VRFirmwareError_Fail = 2,
+};
+
+
+/** error codes for notifications */
+enum EVRNotificationError
+{
+ VRNotificationError_OK = 0,
+ VRNotificationError_InvalidNotificationId = 100,
+ VRNotificationError_NotificationQueueFull = 101,
+ VRNotificationError_InvalidOverlayHandle = 102,
+};
+
+
+/** error codes returned by Vr_Init */
+
+// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp
+enum EVRInitError
+{
+ VRInitError_None = 0,
+ VRInitError_Unknown = 1,
+
+ VRInitError_Init_InstallationNotFound = 100,
+ VRInitError_Init_InstallationCorrupt = 101,
+ VRInitError_Init_VRClientDLLNotFound = 102,
+ VRInitError_Init_FileNotFound = 103,
+ VRInitError_Init_FactoryNotFound = 104,
+ VRInitError_Init_InterfaceNotFound = 105,
+ VRInitError_Init_InvalidInterface = 106,
+ VRInitError_Init_UserConfigDirectoryInvalid = 107,
+ VRInitError_Init_HmdNotFound = 108,
+ VRInitError_Init_NotInitialized = 109,
+ VRInitError_Init_PathRegistryNotFound = 110,
+ VRInitError_Init_NoConfigPath = 111,
+ VRInitError_Init_NoLogPath = 112,
+ VRInitError_Init_PathRegistryNotWritable = 113,
+ VRInitError_Init_AppInfoInitFailed = 114,
+ VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver
+ VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup
+ VRInitError_Init_AnotherAppLaunching = 117,
+ VRInitError_Init_SettingsInitFailed = 118,
+ VRInitError_Init_ShuttingDown = 119,
+ VRInitError_Init_TooManyObjects = 120,
+ VRInitError_Init_NoServerForBackgroundApp = 121,
+ VRInitError_Init_NotSupportedWithCompositor = 122,
+ VRInitError_Init_NotAvailableToUtilityApps = 123,
+
+ VRInitError_Driver_Failed = 200,
+ VRInitError_Driver_Unknown = 201,
+ VRInitError_Driver_HmdUnknown = 202,
+ VRInitError_Driver_NotLoaded = 203,
+ VRInitError_Driver_RuntimeOutOfDate = 204,
+ VRInitError_Driver_HmdInUse = 205,
+ VRInitError_Driver_NotCalibrated = 206,
+ VRInitError_Driver_CalibrationInvalid = 207,
+ VRInitError_Driver_HmdDisplayNotFound = 208,
+
+ VRInitError_IPC_ServerInitFailed = 300,
+ VRInitError_IPC_ConnectFailed = 301,
+ VRInitError_IPC_SharedStateInitFailed = 302,
+ VRInitError_IPC_CompositorInitFailed = 303,
+ VRInitError_IPC_MutexInitFailed = 304,
+ VRInitError_IPC_Failed = 305,
+
+ VRInitError_Compositor_Failed = 400,
+ VRInitError_Compositor_D3D11HardwareRequired = 401,
+
+ VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000,
+
+ VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101,
+ VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102,
+ VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103,
+ VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104,
+ VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105,
+ VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106,
+ VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107,
+ VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108,
+ VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109,
+ VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110,
+ VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111,
+ VRInitError_VendorSpecific_HmdFound_UserDataError = 1112,
+ VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113,
+
+ VRInitError_Steam_SteamInstallationNotFound = 2000,
+
+};
+
+#pragma pack( pop )
+
+// figure out how to import from the VR API dll
+#if defined(_WIN32)
+
+#ifdef VR_API_EXPORT
+#define VR_INTERFACE extern "C" __declspec( dllexport )
+#else
+#define VR_INTERFACE extern "C" __declspec( dllimport )
+#endif
+
+#elif defined(GNUC) || defined(COMPILER_GCC) || defined(__APPLE__)
+
+#ifdef VR_API_EXPORT
+#define VR_INTERFACE extern "C" __attribute__((visibility("default")))
+#else
+#define VR_INTERFACE extern "C"
+#endif
+
+#else
+#error "Unsupported Platform."
+#endif
+
+
+#if defined( _WIN32 )
+#define VR_CALLTYPE __cdecl
+#else
+#define VR_CALLTYPE
+#endif
+
+}
+
+#endif // _INCLUDE_VRTYPES_H
+
+
+// vrtrackedcameratypes.h
+#ifndef _VRTRACKEDCAMERATYPES_H
+#define _VRTRACKEDCAMERATYPES_H
+
+namespace vr
+{
+
+#if defined(__linux__) || defined(__APPLE__)
+ // The 32-bit version of gcc has the alignment requirement for uint64 and double set to
+ // 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
+ // The 64-bit version of gcc has the alignment requirement for these types set to
+ // 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
+ // The 64-bit structure packing has to match the 32-bit structure packing for each platform.
+ #pragma pack( push, 4 )
+#else
+ #pragma pack( push, 8 )
+#endif
+
+enum ECameraVideoStreamFormat
+{
+ CVS_FORMAT_UNKNOWN = 0,
+ CVS_FORMAT_RAW10 = 1, // 10 bits per pixel
+ CVS_FORMAT_NV12 = 2, // 12 bits per pixel
+ CVS_FORMAT_RGB24 = 3, // 24 bits per pixel
+ CVS_MAX_FORMATS
+};
+
+enum ECameraCompatibilityMode
+{
+ CAMERA_COMPAT_MODE_BULK_DEFAULT = 0,
+ CAMERA_COMPAT_MODE_BULK_64K_DMA,
+ CAMERA_COMPAT_MODE_BULK_16K_DMA,
+ CAMERA_COMPAT_MODE_BULK_8K_DMA,
+ CAMERA_COMPAT_MODE_ISO_52FPS,
+ CAMERA_COMPAT_MODE_ISO_50FPS,
+ CAMERA_COMPAT_MODE_ISO_48FPS,
+ CAMERA_COMPAT_MODE_ISO_46FPS,
+ CAMERA_COMPAT_MODE_ISO_44FPS,
+ CAMERA_COMPAT_MODE_ISO_42FPS,
+ CAMERA_COMPAT_MODE_ISO_40FPS,
+ CAMERA_COMPAT_MODE_ISO_35FPS,
+ CAMERA_COMPAT_MODE_ISO_30FPS,
+ MAX_CAMERA_COMPAT_MODES
+};
+
+#ifdef _MSC_VER
+#define VR_CAMERA_DECL_ALIGN( x ) __declspec( align( x ) )
+#else
+#define VR_CAMERA_DECL_ALIGN( x ) //
+#endif
+
+VR_CAMERA_DECL_ALIGN( 8 ) struct CameraVideoStreamFrame_t
+{
+ ECameraVideoStreamFormat m_nStreamFormat;
+
+ uint32_t m_nWidth;
+ uint32_t m_nHeight;
+
+ uint32_t m_nImageDataSize; // Based on stream format, width, height
+
+ uint32_t m_nFrameSequence; // Starts from 0 when stream starts.
+
+ uint32_t m_nBufferIndex; // Identifies which buffer the image data is hosted
+ uint32_t m_nBufferCount; // Total number of configured buffers
+
+ uint32_t m_nExposureTime;
+
+ uint32_t m_nISPFrameTimeStamp; // Driver provided time stamp per driver centric time base
+ uint32_t m_nISPReferenceTimeStamp;
+ uint32_t m_nSyncCounter;
+
+ uint32_t m_nCamSyncEvents;
+ double m_flReferenceCamSyncTime;
+
+ double m_flFrameElapsedTime; // Starts from 0 when stream starts. In seconds.
+ double m_flFrameDeliveryRate;
+
+ double m_flFrameCaptureTime_DriverAbsolute; // In USB time, via AuxEvent
+ double m_flFrameCaptureTime_ServerRelative; // In System time within the server
+ uint64_t m_nFrameCaptureTicks_ServerAbsolute; // In system ticks within the server
+ double m_flFrameCaptureTime_ClientRelative; // At the client, relative to when the frame was exposed/captured.
+
+ bool m_bPoseIsValid; // Supplied by HMD layer when used as a tracked camera
+ vr::HmdMatrix34_t m_matDeviceToAbsoluteTracking;
+
+ float m_Pad[4];
+
+ void *m_pImageData;
+};
+
+#pragma pack( pop )
+
+}
+
+#endif // _VRTRACKEDCAMERATYPES_H
+// ivrsettings.h
+namespace vr
+{
+ enum EVRSettingsError
+ {
+ VRSettingsError_None = 0,
+ VRSettingsError_IPCFailed = 1,
+ VRSettingsError_WriteFailed = 2,
+ VRSettingsError_ReadFailed = 3,
+ };
+
+ // The maximum length of a settings key
+ static const uint32_t k_unMaxSettingsKeyLength = 128;
+
+ class IVRSettings
+ {
+ public:
+ virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0;
+
+ // Returns true if file sync occurred (force or settings dirty)
+ virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0;
+
+ virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, bool bDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, float flDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void GetString( const char *pchSection, const char *pchSettingsKey, char *pchValue, uint32_t unValueLen, const char *pchDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0;
+
+ virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0;
+ };
+
+ //-----------------------------------------------------------------------------
+ // steamvr keys
+
+ static const char * const k_pch_SteamVR_Section = "steamvr";
+ static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd";
+ static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
+ static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
+ static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug";
+ static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe";
+ static const char * const k_pch_SteamVR_EnableDistortion_Bool = "enableDistortion";
+ static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX";
+ static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY";
+ static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps";
+ static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel";
+ static const char * const k_pch_SteamVR_IPD_Float = "ipd";
+ static const char * const k_pch_SteamVR_Background_String = "background";
+ static const char * const k_pch_SteamVR_GridColor_String = "gridColor";
+ static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
+ static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
+ static const char * const k_pch_SteamVR_PowerOffOnExit_Bool = "powerOffOnExit";
+ static const char * const k_pch_SteamVR_StandbyAppRunningTimeout_Float = "standbyAppRunningTimeout";
+ static const char * const k_pch_SteamVR_StandbyNoAppTimeout_Float = "standbyNoAppTimeout";
+ static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode";
+ static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid";
+ static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid";
+ static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers";
+ static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees";
+ static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement";
+ static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses";
+
+ //-----------------------------------------------------------------------------
+ // lighthouse keys
+
+ static const char * const k_pch_Lighthouse_Section = "driver_lighthouse";
+ static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu";
+ static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation";
+ static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug";
+
+ static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation";
+ static const char * const k_pch_Lighthouse_LighthouseName_String = "lighthousename";
+ static const char * const k_pch_Lighthouse_MaxIncidenceAngleDegrees_Float = "maxincidenceangledegrees";
+ static const char * const k_pch_Lighthouse_UseLighthouseDirect_Bool = "uselighthousedirect";
+ static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory";
+ static const char * const k_pch_Lighthouse_OriginOffsetX_Float = "originoffsetx";
+ static const char * const k_pch_Lighthouse_OriginOffsetY_Float = "originoffsety";
+ static const char * const k_pch_Lighthouse_OriginOffsetZ_Float = "originoffsetz";
+ static const char * const k_pch_Lighthouse_HeadingOffset_Float = "headingoffset";
+
+ //-----------------------------------------------------------------------------
+ // null keys
+
+ static const char * const k_pch_Null_Section = "driver_null";
+ static const char * const k_pch_Null_EnableNullDriver_Bool = "enable";
+ static const char * const k_pch_Null_SerialNumber_String = "serialNumber";
+ static const char * const k_pch_Null_ModelNumber_String = "modelNumber";
+ static const char * const k_pch_Null_WindowX_Int32 = "windowX";
+ static const char * const k_pch_Null_WindowY_Int32 = "windowY";
+ static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth";
+ static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight";
+ static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth";
+ static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight";
+ static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons";
+ static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency";
+
+ //-----------------------------------------------------------------------------
+ // user interface keys
+ static const char * const k_pch_UserInterface_Section = "userinterface";
+ static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop";
+
+ //-----------------------------------------------------------------------------
+ // notification keys
+ static const char * const k_pch_Notifications_Section = "notifications";
+ static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb";
+
+ //-----------------------------------------------------------------------------
+ // keyboard keys
+ static const char * const k_pch_Keyboard_Section = "keyboard";
+ static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions";
+
+ //-----------------------------------------------------------------------------
+ // perf keys
+ static const char * const k_pch_Perf_Section = "perfcheck";
+ static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive";
+ static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD";
+ static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce";
+ static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore";
+ static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit";
+ static const char * const k_pch_Perf_TestData_Float = "perfTestData";
+
+ //-----------------------------------------------------------------------------
+ // camera keys
+ static const char * const k_pch_Camera_Section = "camera";
+
+ //-----------------------------------------------------------------------------
+
+ static const char * const IVRSettings_Version = "IVRSettings_001";
+
+ //-----------------------------------------------------------------------------
+ // audio keys
+ static const char * const k_pch_audio_Section = "audio";
+ static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice";
+ static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice";
+ static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice";
+ static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice";
+ static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain";
+} // namespace vr
+
+// iservertrackeddevicedriver.h
+namespace vr
+{
+
+
+struct DriverPoseQuaternion_t
+{
+ double w, x, y, z;
+};
+
+struct DriverPose_t
+{
+ /* Time offset of this pose, in seconds from the actual time of the pose,
+ * relative to the time of the PoseUpdated() call made by the driver.
+ */
+ double poseTimeOffset;
+
+ /* Generally, the pose maintained by a driver
+ * is in an inertial coordinate system different
+ * from the world system of x+ right, y+ up, z+ back.
+ * Also, the driver is not usually tracking the "head" position,
+ * but instead an internal IMU or another reference point in the HMD.
+ * The following two transforms transform positions and orientations
+ * to app world space from driver world space,
+ * and to HMD head space from driver local body space.
+ *
+ * We maintain the driver pose state in its internal coordinate system,
+ * so we can do the pose prediction math without having to
+ * use angular acceleration. A driver's angular acceleration is generally not measured,
+ * and is instead calculated from successive samples of angular velocity.
+ * This leads to a noisy angular acceleration values, which are also
+ * lagged due to the filtering required to reduce noise to an acceptable level.
+ */
+ vr::HmdQuaternion_t qWorldFromDriverRotation;
+ double vecWorldFromDriverTranslation[ 3 ];
+
+ vr::HmdQuaternion_t qDriverFromHeadRotation;
+ double vecDriverFromHeadTranslation[ 3 ];
+
+ /* State of driver pose, in meters and radians. */
+ /* Position of the driver tracking reference in driver world space
+ * +[0] (x) is right
+ * +[1] (y) is up
+ * -[2] (z) is forward
+ */
+ double vecPosition[ 3 ];
+
+ /* Velocity of the pose in meters/second */
+ double vecVelocity[ 3 ];
+
+ /* Acceleration of the pose in meters/second */
+ double vecAcceleration[ 3 ];
+
+ /* Orientation of the tracker, represented as a quaternion */
+ vr::HmdQuaternion_t qRotation;
+
+ /* Angular velocity of the pose in axis-angle
+ * representation. The direction is the angle of
+ * rotation and the magnitude is the angle around
+ * that axis in radians/second. */
+ double vecAngularVelocity[ 3 ];
+
+ /* Angular acceleration of the pose in axis-angle
+ * representation. The direction is the angle of
+ * rotation and the magnitude is the angle around
+ * that axis in radians/second^2. */
+ double vecAngularAcceleration[ 3 ];
+
+ ETrackingResult result;
+
+ bool poseIsValid;
+ bool willDriftInYaw;
+ bool shouldApplyHeadModel;
+ bool deviceIsConnected;
+};
+
+
+// ----------------------------------------------------------------------------------------------
+// Purpose: Represents a single tracked device in a driver
+// ----------------------------------------------------------------------------------------------
+class ITrackedDeviceServerDriver
+{
+public:
+
+ // ------------------------------------
+ // Management Methods
+ // ------------------------------------
+ /** This is called before an HMD is returned to the application. It will always be
+ * called before any display or tracking methods. Memory and processor use by the
+ * ITrackedDeviceServerDriver object should be kept to a minimum until it is activated.
+ * The pose listener is guaranteed to be valid until Deactivate is called, but
+ * should not be used after that point. */
+ virtual EVRInitError Activate( uint32_t unObjectId ) = 0;
+
+ /** This is called when The VR system is switching from this Hmd being the active display
+ * to another Hmd being the active display. The driver should clean whatever memory
+ * and thread use it can when it is deactivated */
+ virtual void Deactivate() = 0;
+
+ /** Handles a request from the system to power off this device */
+ virtual void PowerOff() = 0;
+
+ /** Requests a component interface of the driver for device-specific functionality. The driver should return NULL
+ * if the requested interface or version is not supported. */
+ virtual void *GetComponent( const char *pchComponentNameAndVersion ) = 0;
+
+ /** A VR Client has made this debug request of the driver. The set of valid requests is entirely
+ * up to the driver and the client to figure out, as is the format of the response. Responses that
+ * exceed the length of the supplied buffer should be truncated and null terminated */
+ virtual void DebugRequest( const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0;
+
+ // ------------------------------------
+ // Tracking Methods
+ // ------------------------------------
+ virtual DriverPose_t GetPose() = 0;
+
+ // ------------------------------------
+ // Property Methods
+ // ------------------------------------
+
+ /** Returns a bool property. If the property is not available this function will return false. */
+ virtual bool GetBoolTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a float property. If the property is not available this function will return 0. */
+ virtual float GetFloatTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns an int property. If the property is not available this function will return 0. */
+ virtual int32_t GetInt32TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a uint64 property. If the property is not available this function will return 0. */
+ virtual uint64_t GetUint64TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */
+ virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a string property. If the property is not available this function will return 0 and pError will be
+ * set to an error. Otherwise it returns the length of the number of bytes necessary to hold this string including
+ * the trailing null. If the buffer is too small the error will be TrackedProp_BufferTooSmall. Strings will
+ * generally fit in buffers of k_unTrackingStringSize characters. Drivers may not return strings longer than
+ * k_unMaxPropertyStringSize. */
+ virtual uint32_t GetStringTrackedDeviceProperty( ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError ) = 0;
+
+};
+
+
+
+static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_004";
+
+}
+// ivrdisplaycomponent.h
+namespace vr
+{
+
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: The display component on a single tracked device
+ // ----------------------------------------------------------------------------------------------
+ class IVRDisplayComponent
+ {
+ public:
+
+ // ------------------------------------
+ // Display Methods
+ // ------------------------------------
+
+ /** Size and position that the window needs to be on the VR display. */
+ virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** Returns true if the display is extending the desktop. */
+ virtual bool IsDisplayOnDesktop( ) = 0;
+
+ /** Returns true if the display is real and not a fictional display. */
+ virtual bool IsDisplayRealDisplay( ) = 0;
+
+ /** Suggested size for the intermediate render target that the distortion pulls from. */
+ virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** Gets the viewport in the frame buffer to draw the output of the distortion into */
+ virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** The components necessary to build your own projection matrix in case your
+ * application is doing something fancy like infinite Z */
+ virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0;
+
+ /** Returns the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in
+ * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. */
+ virtual DistortionCoordinates_t ComputeDistortion( EVREye eEye, float fU, float fV ) = 0;
+
+ // -----------------------------------
+ // Direct mode methods
+ // -----------------------------------
+
+ /** Specific to Oculus compositor support, textures supplied must be created using this method. */
+ virtual void CreateSwapTextureSet( uint32_t unPid, uint32_t unFormat, uint32_t unWidth, uint32_t unHeight, void *(*pSharedTextureHandles)[2] ) {}
+
+ /** Used to textures created using CreateSwapTextureSet. Only one of the set's handles needs to be used to destroy the entire set. */
+ virtual void DestroySwapTextureSet( void *pSharedTextureHandle ) {}
+
+ /** Used to purge all texture sets for a given process. */
+ virtual void DestroyAllSwapTextureSets( uint32_t unPid ) {}
+
+ /** Call once per layer to draw for this frame. One shared texture handle per eye. Textures must be created
+ * using CreateSwapTextureSet and should be alternated per frame. Call Present once all layers have been submitted. */
+ virtual void SubmitLayer( void *pSharedTextureHandles[ 2 ], const vr::VRTextureBounds_t( &bounds )[ 2 ], const vr::HmdMatrix34_t *pPose ) {}
+
+ /** Submits queued layers for display. */
+ virtual void Present( void *hSyncTexture ) {}
+
+ };
+
+ static const char *IVRDisplayComponent_Version = "IVRDisplayComponent_001";
+
+}
+
+// ivrcontrollercomponent.h
+namespace vr
+{
+
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: Controller access on a single tracked device.
+ // ----------------------------------------------------------------------------------------------
+ class IVRControllerComponent
+ {
+ public:
+
+ // ------------------------------------
+ // Controller Methods
+ // ------------------------------------
+
+ /** Gets the current state of a controller. */
+ virtual VRControllerState_t GetControllerState( ) = 0;
+
+ /** Returns a uint64 property. If the property is not available this function will return 0. */
+ virtual bool TriggerHapticPulse( uint32_t unAxisId, uint16_t usPulseDurationMicroseconds ) = 0;
+
+ };
+
+
+
+ static const char *IVRControllerComponent_Version = "IVRControllerComponent_001";
+
+}
+// ivrcameracomponent.h
+namespace vr
+{
+
+ //-----------------------------------------------------------------------------
+ //-----------------------------------------------------------------------------
+ class ICameraVideoSinkCallback
+ {
+ public:
+ virtual void OnCameraVideoSinkCallback() = 0;
+ };
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: The camera on a single tracked device
+ // ----------------------------------------------------------------------------------------------
+ class IVRCameraComponent
+ {
+ public:
+ // ------------------------------------
+ // Camera Methods
+ // ------------------------------------
+ virtual bool HasCamera() = 0;
+ virtual bool GetCameraFirmwareDescription( char *pBuffer, uint32_t nBufferLen ) = 0;
+ virtual bool GetCameraFrameDimensions( vr::ECameraVideoStreamFormat nVideoStreamFormat, uint32_t *pWidth, uint32_t *pHeight ) = 0;
+ virtual bool GetCameraFrameBufferingRequirements( int *pDefaultFrameQueueSize, uint32_t *pFrameBufferDataSize ) = 0;
+ virtual bool SetCameraFrameBuffering( int nFrameBufferCount, void **ppFrameBuffers, uint32_t nFrameBufferDataSize ) = 0;
+ virtual bool SetCameraVideoStreamFormat( vr::ECameraVideoStreamFormat nVideoStreamFormat ) = 0;
+ virtual vr::ECameraVideoStreamFormat GetCameraVideoStreamFormat() = 0;
+ virtual bool StartVideoStream() = 0;
+ virtual void StopVideoStream() = 0;
+ virtual bool IsVideoStreamActive() = 0;
+ virtual float GetVideoStreamElapsedTime() = 0;
+ virtual const vr::CameraVideoStreamFrame_t *GetVideoStreamFrame() = 0;
+ virtual void ReleaseVideoStreamFrame( const vr::CameraVideoStreamFrame_t *pFrameImage ) = 0;
+ virtual bool SetAutoExposure( bool bEnable ) = 0;
+ virtual bool PauseVideoStream() = 0;
+ virtual bool ResumeVideoStream() = 0;
+ virtual bool IsVideoStreamPaused() = 0;
+ virtual bool GetCameraDistortion( float flInputU, float flInputV, float *pflOutputU, float *pflOutputV ) = 0;
+ virtual bool GetCameraProjection( float flWidthPixels, float flHeightPixels, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0;
+ virtual bool GetRecommendedCameraUndistortion( uint32_t *pUndistortionWidthPixels, uint32_t *pUndistortionHeightPixels ) = 0;
+ virtual bool SetCameraUndistortion( uint32_t nUndistortionWidthPixels, uint32_t nUndistortionHeightPixels ) = 0;
+ virtual bool GetCameraFirmwareVersion( uint64_t *pFirmwareVersion ) = 0;
+ virtual bool SetFrameRate( int nISPFrameRate, int nSensorFrameRate ) = 0;
+ virtual bool SetCameraVideoSinkCallback( vr::ICameraVideoSinkCallback *pCameraVideoSinkCallback ) = 0;
+ virtual bool GetCameraCompatibilityMode( vr::ECameraCompatibilityMode *pCameraCompatibilityMode ) = 0;
+ virtual bool SetCameraCompatibilityMode( vr::ECameraCompatibilityMode nCameraCompatibilityMode ) = 0;
+ };
+
+ static const char *IVRCameraComponent_Version = "IVRCameraComponent_001";
+}
+// itrackeddevicedriverprovider.h
+namespace vr
+{
+
+class ITrackedDeviceServerDriver;
+struct TrackedDeviceDriverInfo_t;
+struct DriverPose_t;
+
+class IDriverLog
+{
+public:
+ /** Writes a log message to the log file prefixed with the driver name */
+ virtual void Log( const char *pchLogMessage ) = 0;
+};
+
+/** This interface is provided by vrserver to allow the driver to notify
+* the system when something changes about a device. These changes must
+* not change the serial number or class of the device because those values
+* are permanently associated with the device's index. */
+class IServerDriverHost
+{
+public:
+ /** Notifies the server that a tracked device has been added. If this function returns true
+ * the server will call Activate on the device. If it returns false some kind of error
+ * has occurred and the device will not be activated. */
+ virtual bool TrackedDeviceAdded( const char *pchDeviceSerialNumber ) = 0;
+
+ /** Notifies the server that a tracked device's pose has been updated */
+ virtual void TrackedDevicePoseUpdated( uint32_t unWhichDevice, const DriverPose_t & newPose ) = 0;
+
+ /** Notifies the server that the property cache for the specified device should be invalidated */
+ virtual void TrackedDevicePropertiesChanged( uint32_t unWhichDevice ) = 0;
+
+ /** Notifies the server that vsync has occurred on the the display attached to the device. This is
+ * only permitted on devices of the HMD class. */
+ virtual void VsyncEvent( double vsyncTimeOffsetSeconds ) = 0;
+
+ /** notifies the server that the button was pressed */
+ virtual void TrackedDeviceButtonPressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was unpressed */
+ virtual void TrackedDeviceButtonUnpressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was pressed */
+ virtual void TrackedDeviceButtonTouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was unpressed */
+ virtual void TrackedDeviceButtonUntouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server than a controller axis changed */
+ virtual void TrackedDeviceAxisUpdated( uint32_t unWhichDevice, uint32_t unWhichAxis, const VRControllerAxis_t & axisState ) = 0;
+
+ /** Notifies the server that the MC image has been updated for the display attached to the device. This is
+ * only permitted on devices of the HMD class. */
+ virtual void MCImageUpdated() = 0;
+
+ /** always returns a pointer to a valid interface pointer of IVRSettings */
+ virtual IVRSettings *GetSettings( const char *pchInterfaceVersion ) = 0;
+
+ /** Notifies the server that the physical IPD adjustment has been moved on the HMD */
+ virtual void PhysicalIpdSet( uint32_t unWhichDevice, float fPhysicalIpdMeters ) = 0;
+
+ /** Notifies the server that the proximity sensor on the specified device */
+ virtual void ProximitySensorState( uint32_t unWhichDevice, bool bProximitySensorTriggered ) = 0;
+
+ /** Sends a vendor specific event (VREvent_VendorSpecific_Reserved_Start..VREvent_VendorSpecific_Reserved_End */
+ virtual void VendorSpecificEvent( uint32_t unWhichDevice, vr::EVREventType eventType, const VREvent_Data_t & eventData, double eventTimeOffset ) = 0;
+
+ /** Returns true if SteamVR is exiting */
+ virtual bool IsExiting() = 0;
+};
+
+
+/** This interface must be implemented in each driver. It will be loaded in vrserver.exe */
+class IServerTrackedDeviceProvider
+{
+public:
+ /** initializes the driver. This will be called before any other methods are called.
+ * If Init returns anything other than VRInitError_None the driver DLL will be unloaded.
+ *
+ * pDriverHost will never be NULL, and will always be a pointer to a IServerDriverHost interface
+ *
+ * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user
+ * config files.
+ * pchDriverInstallDir - The absolute path of the root directory for the driver.
+ */
+ virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IServerDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+
+ /** cleans up the driver right before it is unloaded */
+ virtual void Cleanup() = 0;
+
+ /** returns the number of HMDs that this driver manages that are physically connected. */
+ virtual uint32_t GetTrackedDeviceCount() = 0;
+
+ /** returns a single HMD */
+ virtual ITrackedDeviceServerDriver *GetTrackedDeviceDriver( uint32_t unWhich, const char *pchInterfaceVersion ) = 0;
+
+ /** returns a single HMD by ID */
+ virtual ITrackedDeviceServerDriver* FindTrackedDeviceDriver( const char *pchId, const char *pchInterfaceVersion ) = 0;
+
+ /** Allows the driver do to some work in the main loop of the server. */
+ virtual void RunFrame() = 0;
+
+
+ // ------------ Power State Functions ----------------------- //
+
+ /** Returns true if the driver wants to block Standby mode. */
+ virtual bool ShouldBlockStandbyMode() = 0;
+
+ /** Called when the system is entering Standby mode. The driver should switch itself into whatever sort of low-power
+ * state it has. */
+ virtual void EnterStandby() = 0;
+
+ /** Called when the system is leaving Standby mode. The driver should switch itself back to
+ full operation. */
+ virtual void LeaveStandby() = 0;
+
+};
+
+
+static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_002";
+
+
+/** This interface is provided by vrclient to allow the driver call back and query various information */
+class IClientDriverHost
+{
+public:
+ /** Returns the device class of a tracked device. If there has not been a device connected in this slot
+ * since the application started this function will return TrackedDevice_Invalid. For previous detected
+ * devices the function will return the previously observed device class.
+ *
+ * To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check
+ * the device class. Every device with something other than TrackedDevice_Invalid is associated with an
+ * actual tracked device. */
+ virtual ETrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
+
+ /** Returns true if there is a device connected in this slot. */
+ virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
+
+ /** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */
+ virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */
+ virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */
+ virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */
+ virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a string property. If the device index is not valid or the property is not a float type this function will
+ * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
+ * null. Strings will generally fit in buffers of k_unTrackingStringSize characters. */
+ virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** always returns a pointer to a valid interface pointer of IVRSettings */
+ virtual IVRSettings *GetSettings( const char *pchInterfaceVersion ) = 0;
+};
+
+
+
+/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */
+class IClientTrackedDeviceProvider
+{
+public:
+ /** initializes the driver. This will be called before any other methods are called,
+ * except BIsHmdPresent(). BIsHmdPresent is called outside of the Init/Cleanup pair.
+ * If Init returns anything other than VRInitError_None the driver DLL will be unloaded.
+ *
+ * pDriverHost will never be NULL, and will always be a pointer to a IClientDriverHost interface
+ *
+ * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user
+ * config files.
+ * pchDriverInstallDir - The absolute path of the root directory for the driver.
+ */
+ virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IClientDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+
+ /** cleans up the driver right before it is unloaded */
+ virtual void Cleanup() = 0;
+
+ /** Called when the client needs to inform an application if an HMD is attached that uses
+ * this driver. This method should be as lightweight as possible and should have no side effects
+ * such as hooking process functions or leaving resources loaded. Init will not be called before
+ * this method and Cleanup will not be called after it.
+ */
+ virtual bool BIsHmdPresent( const char *pchUserConfigDir ) = 0;
+
+ /** called when the client inits an HMD to let the client driver know which one is in use */
+ virtual EVRInitError SetDisplayId( const char *pchDisplayId ) = 0;
+
+ /** Returns the stencil mesh information for the current HMD. If this HMD does not have a stencil mesh the vertex data and count will be
+ * NULL and 0 respectively. This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering
+ * each eye's view. The pixels covered by this mesh will never be seen by the user after the lens distortion is applied and based on visibility to the panels.
+ * This will improve perf by letting the GPU early-reject pixels the user will never see before running the pixel shader.
+ * NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye.
+ */
+ virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye ) = 0;
+
+ /** Get the MC image for the current HMD.
+ * Returns the size in bytes of the buffer required to hold the specified resource. */
+ virtual uint32_t GetMCImage( uint32_t *pImgWidth, uint32_t *pImgHeight, uint32_t *pChannels, void *pDataBuffer, uint32_t unBufferLen ) = 0;
+};
+
+static const char *IClientTrackedDeviceProvider_Version = "IClientTrackedDeviceProvider_003";
+
+}// End
+
+#endif // _OPENVR_DRIVER_API
+
+
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/quaternion.cpp b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/quaternion.cpp
new file mode 100644
index 0000000..3bba066
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/quaternion.cpp
@@ -0,0 +1,266 @@
+#include "quaternion.h"
+#include "math.h"
+#include "stdio.h"
+
+#define PI 3.141592f
+
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v)
+{
+ Quaternion q;
+ /*把angle转换为弧度*/
+ angle = PI*angle/(180.0f);
+ q.w = cos(angle/2.0f);
+ q.x = v.x * sin(angle/2);
+ q.y = v.y * sin(angle/2);
+ q.z = v.z * sin(angle/2);
+ return q;
+}
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,_Quaternion q2)
+{
+ Quaternion q;
+ float mod;
+ /*按照四元数乘法计算系数*/
+ q.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.x = q1.w * q2.x + q1.x * q2.w - q1.y * q2.z + q1.z * q2.y; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.y = q1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.z = q1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+
+ // //按照四元数乘法标准计算法,实际不用
+ //q.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z;
+ //q.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y;
+ //q.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x;
+ //q.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w;
+
+ mod = QuaternionMod(q);
+ q.w = q.w/mod; q.x = q.x/mod; q.y = q.y/mod; q.z = q.z/mod;
+ return q;
+}
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1)
+{
+ Quaternion q;
+ /*按照四元数乘法计算系数*/
+ q.w = q1.w;
+ q.x = -q1.x;
+ q.y = -q1.y;
+ q.z = -q1.z;
+ return q;
+}
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1)
+{
+ float mod;
+ /*按照四元数乘法计算系数*/
+ mod = q1.w * q1.w + q1.x * q1.x +
+ q1.y * q1.y + q1.z * q1.z;
+ mod = sqrt(mod);
+ return mod;
+}
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1)
+{
+ Quaternion q;
+ /*计算四元数模的平方*/
+ float mod2 = QuaternionMod(q1);
+ /* 按照公式: *q^-1 = (q*)/(|q|)^2 */
+ q = QuaternionConjugate(q1);
+ q.w = q.w / mod2;
+ q.x = q.x / mod2;
+ q.y = q.y / mod2;
+ q.z = q.z / mod2;
+ return q;
+}
+
+void DisplayQuaternion(Quaternion q)
+{
+ float q0,q1,q2,q3;
+ q0 = q.w; q1 = q.x; q2 = q.y; q3 = q.z;
+ printf("DisplayQuaternion ::w = %f x = %f y = %f z = %f\n",q.w,q.x,q.y,q.z);
+}
+
+/*欧拉角转四元数*/
+Quaternion EulerAnglesToQuaternion(EulerAngles e)
+{
+ Quaternion q;
+ e.Pitch = e.Pitch/(180.00f/3.141592f);
+ e.Yaw = e.Yaw/ (180.00f/3.141592f);
+ e.Roll = e.Roll/ (180.00f/3.141592f);
+ // 按照Qz*Qy*Qx 产生四元数
+ /*w*/
+ q.w = (float)(cos(0.5*e.Roll)*cos(0.5*e.Pitch)*cos(0.5*e.Yaw) - sin(0.5*e.Roll)*sin(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*x 绕x轴旋转是pitch*/
+ q.x = (float)(cos(0.5*e.Roll)*sin(0.5*e.Pitch)*cos(0.5*e.Yaw) - sin(0.5*e.Roll)*cos(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*y 绕y轴旋转是roll*/
+ q.y = (float)(sin(0.5*e.Roll)*cos(0.5*e.Pitch)*cos(0.5*e.Yaw) + cos(0.5*e.Roll)*sin(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*z 绕z轴旋转是Yaw*/
+ q.z = (float)(cos(0.5*e.Roll)*cos(0.5*e.Pitch)*sin(0.5*e.Yaw) + sin(0.5*e.Roll)*sin(0.5*e.Pitch)*cos(0.5*e.Yaw));
+ return q;
+}
+
+EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer)
+{
+ EulerAngles e;
+ /*Pitch 在D3D坐标系中被认为是绕x轴旋转,Roll绕z旋转,Yaw是绕y旋转*/
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(y*z-w*x))* (180.0f /PI);
+ e.Yaw = atan2(x*z + w*y,0.5f - x*x - y*y)* (180.0f /PI);
+ e.Roll = atan2(x*y + w*z,0.5f - x*x - z*z)* (180.0f /PI);
+
+ return e;
+}
+
+
+void DisplayEulerAngles(EulerAngles e)
+{
+ printf("DisplayEulerAngles::Yaw=%f,Pitch=%f,Roll=%f\n",e.Yaw,e.Pitch,e.Roll);
+}
+
+void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll)
+{
+ (*e).Pitch = Pitch; (*e).Roll = Roll;(*e).Yaw = Yaw;
+}
+
+
+EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll)
+{
+ EulerAngles e;
+ (e).Pitch = Pitch; (e).Roll = Roll;(e).Yaw = Yaw;
+ return e;
+}
+
+Vector3 SetVector3(float x,float y,float z)
+{
+ Vector3 v;
+ v.x = x;
+ v.y = y;
+ v.z = z;
+ return v;
+}
+
+
+bool QuaternionEqual(Quaternion q1,Quaternion q2)
+{
+ if(fabsf(q1.w-q2.w)<0.0001f&&
+ fabsf(q1.x-q2.x)<0.0001f&&
+ fabsf(q1.y-q2.y)<0.0001f&&
+ fabsf(q1.z-q2.z)<0.0001f)return true;
+ return false;
+}
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz)
+{
+ float qw,qx,qy,qz;
+ static float q0 = 1.0f,q1 = 0.0f,q2 = 0.0f,q3 = 0.0f;
+ float halfT = 1.0f;
+
+ Quaternion q;
+ qw = (-q1*gx - q2*gy - q3*gz)*halfT; /*利用一阶龙格库塔法对四元数进行更新*/
+ qx = ( q0*gx + q2*gz - q3*gy)*halfT;
+ qy = ( q0*gy - q1*gz + q3*gx)*halfT;
+ qz = ( q0*gz + q1*gy - q2*gx)*halfT;
+
+ q0 = q0 + qw;
+ q1 = q1 + qx;
+ q2 = q2 + qy;
+ q3 = q3 + qz;
+
+ q.w = q0;
+ q.x = q1;
+ q.y = q2;
+ q.z = q3;
+
+
+ float mod2 = QuaternionMod(q); /*求模*/
+
+ q.w = q.w / mod2;
+ q.x = q.x / mod2;
+ q.y = q.y / mod2;
+ q.z = q.z / mod2;
+
+ return q;
+}
+
+
+/*把四元数转换为旋转矩阵*/
+Matrix3 QuaternionToMatrix(Quaternion q)
+{
+ Matrix3 mMatrix;
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ mMatrix.m[0][0] = 1 - 2*y*y -2*z*z;
+ mMatrix.m[0][1] = 2*x*y + 2*w*z;
+ mMatrix.m[0][2] = 2*x*y - 2*w*y;
+
+ mMatrix.m[1][0] = 2*x*y - 2*w*z;
+ mMatrix.m[1][1] = 1 - 2*x*x -2*z*z;
+ mMatrix.m[1][2] = 2*y*z + 2*w*x;
+
+ mMatrix.m[2][0] = 2*x*z + 2*w*z;
+ mMatrix.m[2][1] = 2*y*z - 2*w*x;
+ mMatrix.m[2][2] = 1 - 2*x*x -2*y*y;
+ return mMatrix;
+}
+
+/* 给定旋转矩阵以及向量,返回旋转后的向量*/
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec)
+{
+ MVector3 mResult;
+ int j;
+ for(j=0;j<3;j++)
+ {
+ mResult.v[j] = mMatrix.m[j][0]*vec.v[0] +
+ mMatrix.m[j][1]*vec.v[1] +
+ mMatrix.m[j][2]*vec.v[2];
+ }
+ return mResult;
+}
+
+
+
+
+/*************************************************************************
+
+* 描 述 : 把标准笛卡尔坐标系下的四元数转换到欧拉角显示。
+ 这里的变换公式为物体-惯性四元数转换到欧拉角
+
+**************************************************************************/
+EulerAngles MathQuaternionToEulerAngles(Quaternion q)
+{
+ EulerAngles e;
+ /*标准笛卡尔坐标系中,我们认为绕z轴为Yaw,绕x轴为Roll,绕y轴为Pitch*/
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(z*x-w*y))* (180.0f /PI);
+ e.Yaw = atan2(y*x + w*z,0.5f - y*y - z*z)* (180.0f /PI);
+ e.Roll = atan2(y*z + w*x,0.5f - y*y - x*x)* (180.0f /PI);
+
+ return e;
+}
+/*************************************************************************
+
+* 描 述 : 把D3D坐标系下的四元数转换到欧拉角显示。
+ 这里的变换公式为物体-惯性四元数转换到欧拉角
+
+**************************************************************************/
+EulerAngles D3DQuaternionToEulerAngles(Quaternion q)
+{
+ EulerAngles e;
+ /*Pitch 在D3D坐标系中被认为是绕x轴旋转,Roll绕z旋转,Yaw是绕y旋转*/
+ double w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(y*z-w*x))* (180.0f /PI);
+ e.Yaw = atan2(x*z + w*y,0.5f - x*x - y*y)* (180.0f /PI);
+ e.Roll = atan2(x*y + w*z,0.5f - x*x - z*z)* (180.0f /PI);
+
+ return e;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/quaternion.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/quaternion.h
new file mode 100644
index 0000000..b0236f3
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/quaternion.h
@@ -0,0 +1,136 @@
+#ifndef _QUATERNION_H_
+#define _QUATERNION_H_
+
+
+typedef struct _Quaternion
+{
+ float w,x,y,z;
+}Quaternion;
+
+
+typedef struct _Vector3
+{
+ float x,y,z;
+}Vector3;
+
+typedef struct _EulerAngles{
+ float Yaw;
+ float Roll;
+ float Pitch;
+}EulerAngles;
+
+typedef struct _MVector3
+{
+ float v[3];
+}MVector3;
+
+
+typedef struct _Matrix3
+{
+ float m[3][3];
+}Matrix3;
+
+
+
+#ifdef __cplusplus
+extern "C"{
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v);
+
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,Quaternion q2);
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1);
+
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1);
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1);
+
+void DisplayQuaternion(Quaternion q);
+
+Quaternion EulerAnglesToQuaternion(EulerAngles e);
+
+//EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer);
+
+void DisplayEulerAngles(EulerAngles e);
+
+//void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll);
+
+EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll);
+
+/*判断两个四元数是否相等,相等返回ture,否则返回false*/
+bool QuaternionEqual(Quaternion q1,Quaternion q2);
+
+
+Vector3 SetVector3(float x,float y,float z);
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz);
+
+
+Matrix3 QuaternionToMatrix(Quaternion q);
+
+
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec);
+
+EulerAngles MathQuaternionToEulerAngles(Quaternion q);
+
+
+
+}
+
+#else
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v);
+
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,Quaternion q2);
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1);
+
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1);
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1);
+
+void DisplayQuaternion(Quaternion q);
+
+Quaternion EulerAnglesToQuaternion(EulerAngles e);
+
+//EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer);
+
+void DisplayEulerAngles(EulerAngles e);
+
+void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll);
+
+//EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll);
+
+/*判断两个四元数是否相等,相等返回ture,否则返回false*/
+//bool QuaternionEqual(Quaternion q1,Quaternion q2);
+
+
+Vector3 SetVector3(float x,float y,float z);
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz);
+
+
+Matrix3 QuaternionToMatrix(Quaternion q);
+
+
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec);
+
+EulerAngles MathQuaternionToEulerAngles(Quaternion q);
+
+
+#endif
+
+
+
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/sensor.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/sensor.h
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/usbport.h b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/usbport.h
new file mode 100644
index 0000000..59498d3
--- /dev/null
+++ b/4.Software/GeekIMU Manager GUI 1.2/GeekIMUDriver 1.2/Src/usbport.h
@@ -0,0 +1,40 @@
+#include
+#include
+#include "hidsdi.h"
+#include "hidclass.h"
+#include "hidpddi.h"
+#include "hidport.h"
+#include "SetupAPI.h"
+#include
+#include "malloc.h"
+
+#pragma comment(lib,"setupapi.lib")
+#pragma comment(lib,"hid.lib")
+#pragma comment(lib,"comctl32.lib")
+
+#ifndef BULKUSBH_INC
+#define BULKUSBH_INC
+
+#define BULKUSB_IOCTL_INDEX 0x0000
+
+#define IOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \
+0x0000, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_RESET_DEVICE CTL_CODE(FILE_DEVICE_UNKNOWN, \
+0x0001, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN,
+0x0002, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+extern HANDLE open_file(char *filename);
+extern int GetUsbPath(char *path);
+extern int WriteUsb(HANDLE hUsb, char *Outbuff, int len);
+extern int ReadUsb(HANDLE hUsb, BYTE inbuff[], DWORD &nBytesRead, int nToRead);
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/LibHID.log b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/LibHID.log
new file mode 100644
index 0000000..613625f
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/LibHID.log
@@ -0,0 +1,44 @@
+锘 SensorImpl.cpp
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(127,48): warning C4305: 鈥滃垵濮嬪寲鈥: 浠庘渄ouble鈥濆埌鈥渇loat鈥濇埅鏂
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(59,22): warning C4101: 鈥淢agZ1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(59,8): warning C4101: 鈥淢agX1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(63,44): warning C4101: 鈥渕x1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(67,14): warning C4101: 鈥渜2鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(67,11): warning C4101: 鈥渜1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(67,17): warning C4101: 鈥渜3鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(63,49): warning C4101: 鈥渕y1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(63,54): warning C4101: 鈥渕z1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(67,8): warning C4101: 鈥渜0鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(59,15): warning C4101: 鈥淢agY1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(310,15): warning C4305: 鈥=鈥: 浠庘渄ouble鈥濆埌鈥渇loat鈥濇埅鏂
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(422,37): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(423,50): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\SensorImpl.cpp(424,51): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+ main.cpp
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\PipeHMD.h(119,6): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\PipeHMD.h(140,6): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(106,25): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(107,25): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(108,25): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(109,24): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(110,24): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(111,24): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(114,13): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(119,65): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(120,65): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(121,65): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(122,22): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(123,22): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(124,22): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(127,20): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(151,19): warning C4101: 鈥測1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(151,16): warning C4101: 鈥渪1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(151,22): warning C4101: 鈥渮1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(619,9): warning C4101: 鈥渨rite_length鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(843,22): warning C4305: 鈥滃垵濮嬪寲鈥: 浠庘渄ouble鈥濆埌鈥渇loat鈥濇埅鏂
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(1298,12): warning C4101: 鈥渕ag_str_tmp鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(1922,9): warning C4101: 鈥渃heckhandle鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+ 姝e湪鐢熸垚浠g爜...
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Src\main.cpp(2015): warning C4715: 鈥淢agCali鈥: 涓嶆槸鎵鏈夌殑鎺т欢璺緞閮借繑鍥炲
+ USB_Win32_HIDDevice.c
+ LibHID.vcxproj -> C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Bin_Win32\Debug\libdm.dll
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt
new file mode 100644
index 0000000..f732d7e
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt
@@ -0,0 +1 @@
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Bin_Win32\Debug\libdm.dll
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/MagCalibrate.obj b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/MagCalibrate.obj
new file mode 100644
index 0000000..6af756d
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/MagCalibrate.obj differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/PipeHMD.obj b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/PipeHMD.obj
new file mode 100644
index 0000000..565ce41
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/PipeHMD.obj differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/SensorImpl.obj b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/SensorImpl.obj
new file mode 100644
index 0000000..9042693
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/SensorImpl.obj differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/USB_Win32_HIDDevice.obj b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/USB_Win32_HIDDevice.obj
new file mode 100644
index 0000000..60e19c5
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/USB_Win32_HIDDevice.obj differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.Build.CppClean.log b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.Build.CppClean.log
new file mode 100644
index 0000000..59a6801
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.Build.CppClean.log
@@ -0,0 +1,20 @@
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\vc142.pdb
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\vc142.idb
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\sensorimpl.obj
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\quaternion.obj
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\pipehmd.obj
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\main.obj
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\magcalibrate.obj
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\usb_win32_hiddevice.obj
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.lib
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.exp
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.ilk
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.dll
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.pdb
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.tlog\cl.command.1.tlog
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.tlog\cl.read.1.tlog
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.tlog\cl.write.1.tlog
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.tlog\libdm.write.1u.tlog
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.tlog\link.command.1.tlog
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.tlog\link.read.1.tlog
+c:\users\administrator\documents\tencent files\719901725\filerecv\2017-10-30 230812_dm妯″潡涓婁綅鏈烘牎鍑嗚蒋浠秜1.1\dmmtcalibrationtools\dmmtcalibrationtools\bin_win32\debug\libdm.tlog\link.write.1.tlog
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.dll b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.dll
new file mode 100644
index 0000000..747dc3f
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.dll differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.dll.recipe b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.dll.recipe
new file mode 100644
index 0000000..9613bce
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.dll.recipe
@@ -0,0 +1,11 @@
+锘
+
+
+
+ C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Bin_Win32\Debug\libdm.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.exp b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.exp
new file mode 100644
index 0000000..d1db313
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.exp differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.ilk b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.ilk
new file mode 100644
index 0000000..fb76ba1
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.ilk differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.lib b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.lib
new file mode 100644
index 0000000..9df3fe2
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.lib differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.pdb b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.pdb
new file mode 100644
index 0000000..f28e155
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.pdb differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog
new file mode 100644
index 0000000..bbbdc38
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog
new file mode 100644
index 0000000..cbd1acd
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog
new file mode 100644
index 0000000..fb306e9
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate
new file mode 100644
index 0000000..fd3cf5c
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:VCServicingVersionMFC=14.29.30136:VCServicingVersionCrtHeaders=14.29.30136:TargetPlatformVersion=10.0.20348.0:
+Debug|Win32|C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Projects\|
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog
new file mode 100644
index 0000000..00abb6e
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog
new file mode 100644
index 0000000..6f51bf1
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog
new file mode 100644
index 0000000..933f1ac
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog
new file mode 100644
index 0000000..e24ebe6
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/main.obj b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/main.obj
new file mode 100644
index 0000000..2ba76df
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/main.obj differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/quaternion.obj b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/quaternion.obj
new file mode 100644
index 0000000..b7ca900
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/quaternion.obj differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/vc142.idb b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/vc142.idb
new file mode 100644
index 0000000..0ddb034
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/vc142.idb differ
diff --git a/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/vc142.pdb b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/vc142.pdb
new file mode 100644
index 0000000..94ae52a
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Bin_Win32/Debug/vc142.pdb differ
diff --git a/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.sln b/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.sln
new file mode 100644
index 0000000..bb30ef4
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.sln
@@ -0,0 +1,26 @@
+锘
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibHID", "LibHID.vcxproj", "{37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|Win32.Build.0 = Debug|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|x64.ActiveCfg = Debug|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|x64.Build.0 = Debug|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|Win32.ActiveCfg = Release|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|Win32.Build.0 = Release|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|x64.ActiveCfg = Release|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.suo b/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.suo
new file mode 100644
index 0000000..0defe56
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.suo differ
diff --git a/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.v12.suo b/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.v12.suo
new file mode 100644
index 0000000..4d992ee
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Projects/DMMTCalibrationTools.v12.suo differ
diff --git a/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj b/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj
new file mode 100644
index 0000000..f860b40
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj
@@ -0,0 +1,145 @@
+锘
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}
+ LibHID
+ libdm
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v142
+ MultiByte
+
+
+ Application
+ true
+ v142
+ MultiByte
+
+
+ DynamicLibrary
+ false
+ v142
+ true
+ MultiByte
+
+
+ Application
+ false
+ v142
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\Bin_Win32\Debug\
+ ..\Bin_Win32\Debug\
+
+
+ ..\Bin\x64\Debug\
+ ..\Bin\x64\Debug\
+
+
+
+ Level3
+ Disabled
+ $(SolutionDir)..\Src;%(AdditionalIncludeDirectories)
+
+
+ true
+ AsInvoker
+
+
+
+
+ Level3
+ Disabled
+
+
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+
+
+ true
+ true
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+
+
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj.filters b/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj.filters
new file mode 100644
index 0000000..a0b15b2
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj.filters
@@ -0,0 +1,63 @@
+锘
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠
+
+
+
+
+ 澶存枃浠
+
+
+ 澶存枃浠
+
+
+ 澶存枃浠
+
+
+ 澶存枃浠
+
+
+ 澶存枃浠
+
+
+ 澶存枃浠
+
+
+ 澶存枃浠
+
+
+ 澶存枃浠
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj.user b/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj.user
new file mode 100644
index 0000000..a375ae3
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Projects/LibHID.vcxproj.user
@@ -0,0 +1,4 @@
+锘
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Projects/LibUsbHid.v12.suo b/4.Software/GeekIMUDriver 1.0/Projects/LibUsbHid.v12.suo
new file mode 100644
index 0000000..055f3a4
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Projects/LibUsbHid.v12.suo differ
diff --git a/4.Software/GeekIMUDriver 1.0/Src/DMCaliAPI.h b/4.Software/GeekIMUDriver 1.0/Src/DMCaliAPI.h
new file mode 100644
index 0000000..6d5e3b7
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/DMCaliAPI.h
@@ -0,0 +1,72 @@
+
+#ifndef _DMCALILAPI_H_
+#define _DMCALIAPI_H_
+#include
+
+
+#ifdef __cplusplus
+extern "C"{
+
+ // typedef struct _Quaternion
+ // {
+ // float w, x, y, z;
+ // }Quaternion;
+ //
+ //
+ // typedef struct _Vector3
+ // {
+ // float x, y, z;
+ // }Vector3;
+
+// struct _MagCaliParam
+// {
+// float xOffset;
+// float yOffset;
+// float zOffset;
+// float xScale;
+// float yScale;
+// float zScale;
+// };
+// typedef _MagCaliParam MagCaliParam;
+//
+// typedef struct _MVector3
+// {
+// float v[3];
+// }MVector3;
+
+ /* 控制器初始化函数 */
+ __declspec(dllexport) int Init(char* );
+
+ __declspec(dllexport) int CheckDevice(void);
+
+ __declspec(dllexport) int GyroCali(void);
+
+ __declspec(dllexport) Vector3 GetGyroCali(void);
+
+ _declspec (dllexport) MagCaliParam GetMagCali();
+
+ __declspec(dllexport) int MagCali(void);
+
+ __declspec(dllexport) int FinishMagCali(void);
+
+ __declspec(dllexport) int SetMagCali(float x, float y, float z, float x0, float y0, float z0);
+
+ __declspec(dllexport) MagCaliParam CalculateMagParam();
+
+ __declspec(dllexport) Vector3 GetPoint(void);
+
+ __declspec(dllexport) Vector3 GetEulerianAngle(void);
+
+ __declspec(dllexport) int Correction(void);
+
+ __declspec(dllexport) Quaternion GetQuaternion(void);
+
+}
+#else
+
+#endif
+
+#endif
+
+
+
diff --git a/4.Software/GeekIMUDriver 1.0/Src/DM_Sensor.h b/4.Software/GeekIMUDriver 1.0/Src/DM_Sensor.h
new file mode 100644
index 0000000..b0be5d8
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/DM_Sensor.h
@@ -0,0 +1,19 @@
+#ifndef _DM_SENSOR_H_
+#define _DM_SENSOR_H_
+
+/**********************************************************************************
+* 函数名 : UnpackSensor
+* 描述 : Oculus按照一定的算法压缩陀螺仪数据,这里最数据进行解包,可以参考:
+ http://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend
+ 文档进行处理。
+* 输入 : 要输入数据的指针
+* 输出 : 输出陀螺仪x、y、z三轴的数据
+***********************************************************************************/
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+
+void GetDK2_SensorData(unsigned char usb_input_buffer[]);
+
+void AHRSupdate(double gx, double gy, double gz, double ax, double ay, double az, double mx, double my, double mz,int Dtime);
+
+#endif
diff --git a/4.Software/GeekIMUDriver 1.0/Src/DM_Sensor_type.h b/4.Software/GeekIMUDriver 1.0/Src/DM_Sensor_type.h
new file mode 100644
index 0000000..1bc0f00
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/DM_Sensor_type.h
@@ -0,0 +1,21 @@
+#ifndef _DM_SENSOR_TYPE_H_
+#define _DM_SENSOR_TYPE_H_
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct EulaAngle_
+{
+ double Yaw;
+ double Pitch;
+ double Roll;
+}DM_EulaAngle;
+
+
+typedef struct DMVector3f_
+{
+ float x, y, z;
+} DMVector3f;
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/MagCalibrate.cpp b/4.Software/GeekIMUDriver 1.0/Src/MagCalibrate.cpp
new file mode 100644
index 0000000..5985bcf
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/MagCalibrate.cpp
@@ -0,0 +1,23 @@
+
+#include
+#include
+
+//extern FILE *fpdata;
+
+//void GetControllerSensor(unsigned char usb_input_buffer[])
+//{
+// float MagX,MagY,MagZ;
+//
+// float* fv = (float*)&usb_input_buffer[1];
+//
+// MagX = fv[0];
+// MagY = fv[1];
+// MagZ = fv[2];
+//
+// if(fpdata!=NULL)
+// {
+// fprintf(fpdata,"%d %d %d\n",MagX,MagY,MagZ);
+// }
+// printf("mx = %d my= %d mz= %d\n",MagX,MagY,MagZ);
+//
+//}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/MagCalibrate.h b/4.Software/GeekIMUDriver 1.0/Src/MagCalibrate.h
new file mode 100644
index 0000000..b1665b0
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/MagCalibrate.h
@@ -0,0 +1,6 @@
+#ifndef _MAG_CALIBRATE_H_
+#define _MAG_CALIBRATE_H_
+
+
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/MyCls.h b/4.Software/GeekIMUDriver 1.0/Src/MyCls.h
new file mode 100644
index 0000000..3319814
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/MyCls.h
@@ -0,0 +1,43 @@
+#include
+void MyCls(HANDLE hConsole)
+{
+ COORD coordScreen = { 0, 0 };//设置清屏后光标返回的屏幕左上角坐标
+ BOOL bSuccess;
+ DWORD cCharsWritten;
+ CONSOLE_SCREEN_BUFFER_INFO csbi;//保存缓冲区信息
+
+ DWORD dwConSize;//当前缓冲区可容纳的字符数
+
+ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);//获得缓冲区信息
+ //PERR(bSuccess, "GetConsoleScreenBufferInfo");
+ dwConSize = csbi.dwSize.X * csbi.dwSize.Y;//缓冲区容纳字符数目
+
+ //用空格填充缓冲区
+ bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR)' ', dwConSize, coordScreen, &cCharsWritten);
+ //PERR(bSuccess, "FillConsoleOutputCharacter");
+
+ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);//获得缓冲区信息
+ //PERR(bSuccess, "ConsoleScreenBufferInfo");
+
+ //填充缓冲区属性
+ bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
+ //PERR(bSuccess, "FillConsoleOutputAttribute");
+
+ //光标返回屏幕左上角坐标
+ bSuccess = SetConsoleCursorPosition(hConsole, coordScreen);
+ //printf("ok");
+ //PERR(bSuccess, "SetConsoleCursorPosition");
+ return;
+}
+inline void back2zero(void)
+{
+ static HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ static COORD coordScreen = { 0, 0 };
+ SetConsoleCursorPosition(hStdOut, coordScreen);
+}
+inline void clrscr(void)
+{
+ HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ MyCls(hStdOut);
+ return;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/OVR_CAPI.h b/4.Software/GeekIMUDriver 1.0/Src/OVR_CAPI.h
new file mode 100644
index 0000000..431c403
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/OVR_CAPI.h
@@ -0,0 +1,868 @@
+/************************************************************************************
+
+Filename : OVR_CAPI.h
+Content : C Interface to Oculus sensors and rendering.
+Created : November 23, 2013
+Authors : Michael Antonov
+
+Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved.
+
+Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
+you may not use the Oculus VR Rift SDK except in compliance with the License,
+which is provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+http://www.oculusvr.com/licenses/LICENSE-3.1
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+************************************************************************************/
+#ifndef OVR_CAPI_h
+#define OVR_CAPI_h
+
+#include
+
+
+typedef char ovrBool;
+
+//-----------------------------------------------------------------------------------
+// ***** OVR_EXPORT definition
+
+#if !defined(OVR_EXPORT)
+#if defined(WIN32)
+#define OVR_EXPORT __declspec(dllexport)
+#else
+#define OVR_EXPORT
+#endif
+#endif
+
+//-----------------------------------------------------------------------------------
+
+typedef struct SensorPureData_
+{
+ long AccelX, AccelY, AccelZ;
+ long GyroX, GyroY, GyroZ;
+ short MagX, MagY, MagZ;
+}SensorPureData;
+
+// ***** Simple Math Structures
+
+// 2D integer
+typedef struct ovrVector2i_
+{
+ int x, y;
+} ovrVector2i;
+typedef struct ovrSizei_
+{
+ int w, h;
+} ovrSizei;
+typedef struct ovrRecti_
+{
+ ovrVector2i Pos;
+ ovrSizei Size;
+} ovrRecti;
+
+// 3D
+typedef struct ovrQuatf_
+{
+ float x, y, z, w;
+} ovrQuatf;
+typedef struct ovrVector2f_
+{
+ float x, y;
+} ovrVector2f;
+typedef struct ovrVector3f_
+{
+ float x, y, z;
+} ovrVector3f;
+typedef struct ovrMatrix4f_
+{
+ float M[4][4];
+} ovrMatrix4f;
+// Position and orientation together.
+typedef struct ovrPosef_
+{
+ ovrQuatf Orientation;
+ ovrVector3f Position;
+} ovrPosef;
+
+// Full pose (rigid body) configuration with first and second derivatives.
+typedef struct ovrPoseStatef_
+{
+ ovrPosef Pose;
+ ovrVector3f AngularVelocity;
+ ovrVector3f LinearVelocity;
+ ovrVector3f AngularAcceleration;
+ ovrVector3f LinearAcceleration;
+ double TimeInSeconds; // Absolute time of this state sample.
+} ovrPoseStatef;
+
+// Field Of View (FOV) in tangent of the angle units.
+// As an example, for a standard 90 degree vertical FOV, we would
+// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.
+typedef struct ovrFovPort_
+{
+ float UpTan;
+ float DownTan;
+ float LeftTan;
+ float RightTan;
+} ovrFovPort;
+
+
+//-----------------------------------------------------------------------------------
+// ***** HMD Types
+
+// Enumerates all HMD types that we support.
+typedef enum
+{
+ ovrHmd_None = 0,
+ ovrHmd_DK1 = 3,
+ ovrHmd_DKHD = 4,
+ ovrHmd_CrystalCoveProto = 5,
+ ovrHmd_DK2 = 6,
+ ovrHmd_Other // Some HMD other then the one in the enumeration.
+} ovrHmdType;
+
+// HMD capability bits reported by device.
+//
+typedef enum
+{
+ // Read-only flags.
+ ovrHmdCap_Present = 0x0001, // This HMD exists (as opposed to being unplugged).
+ ovrHmdCap_Available = 0x0002, // HMD and is sensor is available for use
+ // (if not owned by another app).
+
+ // These flags are intended for use with the new driver display mode.
+ /*
+ ovrHmdCap_ExtendDesktop = 0x0004, // Read only, means display driver is in compatibility mode.
+
+ ovrHmdCap_DisplayOff = 0x0040, // Turns off Oculus HMD screen and output.
+ ovrHmdCap_NoMirrorToWindow = 0x2000, // Disables mirrowing of HMD output to the window;
+ // may improve rendering performance slightly.
+ */
+
+ // Modifiable flags (through ovrHmd_SetEnabledCaps).
+ ovrHmdCap_LowPersistence = 0x0080, // Supports low persistence mode.
+ ovrHmdCap_LatencyTest = 0x0100, // Supports pixel reading for continuous latency testing.
+ ovrHmdCap_DynamicPrediction = 0x0200, // Adjust prediction dynamically based on DK2 Latency.
+ // Support rendering without VSync for debugging
+ ovrHmdCap_NoVSync = 0x1000,
+ ovrHmdCap_NoRestore = 0x4000,
+
+ // These bits can be modified by ovrHmd_SetEnabledCaps.
+ ovrHmdCap_Writable_Mask = 0x1380
+} ovrHmdCaps;
+
+
+// Sensor capability bits reported by device.
+// Used with ovrHmd_StartSensor.
+typedef enum
+{
+ ovrSensorCap_Orientation = 0x0010, // Supports orientation tracking (IMU).
+ ovrSensorCap_YawCorrection = 0x0020, // Supports yaw correction through magnetometer or other means.
+ ovrSensorCap_Position = 0x0040, // Supports positional tracking.
+
+} ovrSensorCaps;
+
+// Distortion capability bits reported by device.
+// Used with ovrHmd_ConfigureRendering and ovrHmd_CreateDistortionMesh.
+typedef enum
+{
+ ovrDistortionCap_Chromatic = 0x01, // Supports chromatic aberration correction.
+ ovrDistortionCap_TimeWarp = 0x02, // Supports timewarp.
+ ovrDistortionCap_Vignette = 0x08 // Supports vignetting around the edges of the view.
+} ovrDistortionCaps;
+
+
+// Specifies which eye is being used for rendering.
+// This type explicitly does not include a third "NoStereo" option, as such is
+// not required for an HMD-centered API.
+typedef enum
+{
+ ovrEye_Left = 0,
+ ovrEye_Right = 1,
+ ovrEye_Count = 2
+} ovrEyeType;
+
+
+// Handle to HMD; returned by ovrHmd_Create.
+typedef struct ovrHmdStruct* ovrHmd;
+
+// This is a complete descriptor of the HMD.
+typedef struct ovrHmdDesc_
+{
+ ovrHmd Handle; // Handle of this HMD.
+ ovrHmdType Type;
+
+ // Name string describing the product: "Oculus Rift DK1", etc.
+ const char* ProductName;
+ const char* Manufacturer;
+
+ // Capability bits described by ovrHmdCaps.
+ unsigned int HmdCaps;
+ // Capability bits described by ovrSensorCaps.
+ unsigned int SensorCaps;
+ // Capability bits described by ovrDistortionCaps.
+ unsigned int DistortionCaps;
+
+ // Resolution of the entire HMD screen (for both eyes) in pixels.
+ ovrSizei Resolution;
+ // Where monitor window should be on screen or (0,0).
+ ovrVector2i WindowsPos;
+
+ // These define the recommended and maximum optical FOVs for the HMD.
+ ovrFovPort DefaultEyeFov[ovrEye_Count];
+ ovrFovPort MaxEyeFov[ovrEye_Count];
+
+ // Preferred eye rendering order for best performance.
+ // Can help reduce latency on sideways-scanned screens.
+ ovrEyeType EyeRenderOrder[ovrEye_Count];
+
+ // Display that HMD should present on.
+ // TBD: It may be good to remove this information relying on WidowPos instead.
+ // Ultimately, we may need to come up with a more convenient alternative,
+ // such as a API-specific functions that return adapter, ot something that will
+ // work with our monitor driver.
+
+ // Windows: "\\\\.\\DISPLAY3", etc. Can be used in EnumDisplaySettings/CreateDC.
+ const char* DisplayDeviceName;
+ // MacOS
+ int DisplayId;
+} ovrHmdDesc;
+
+// Describes the type of positional tracking being done.
+/*
+typedef enum
+{
+ovrPose_None,
+ovrPose_HeadModel,
+ovrPose_Positional
+} ovrPoseType;
+*/
+
+
+// Bit flags describing the current status of sensor tracking.
+typedef enum
+{
+ ovrStatus_OrientationTracked = 0x0001, // Orientation is currently tracked (connected and in use).
+ ovrStatus_PositionTracked = 0x0002, // Position is currently tracked (FALSE if out of range).
+ ovrStatus_PositionConnected = 0x0020, // Position tracking HW is connected.
+ ovrStatus_HmdConnected = 0x0080 // HMD Display is available & connected.
+} ovrStatusBits;
+
+
+// State of the sensor at a given absolute time.
+typedef struct ovrSensorState_
+{
+ // Predicted pose configuration at requested absolute time.
+ // One can determine the time difference between predicted and actual
+ // readings by comparing ovrPoseState.TimeInSeconds.
+ ovrPoseStatef Predicted;
+ // Actual recorded pose configuration based on the sensor sample at a
+ // moment closest to the requested time.
+ ovrPoseStatef Recorded;
+
+ // Sensor temperature reading, in degrees Celsius, as sample time.
+ float Temperature;
+ // Sensor status described by ovrStatusBits.
+ unsigned int StatusFlags;
+} ovrSensorState;
+
+// For now.
+// TBD: Decide if this becomes a part of HMDDesc
+typedef struct ovrSensorDesc_
+{
+ // HID Vendor and ProductId of the device.
+ short VendorId;
+ short ProductId;
+ // Sensor (and display) serial number.
+ char SerialNumber[24];
+} ovrSensorDesc;
+
+
+
+// Frame data reported by ovrHmd_BeginFrameTiming().
+typedef struct ovrFrameTiming_
+{
+ // The amount of time that has passed since the previous frame returned
+ // BeginFrameSeconds value, usable for movement scaling.
+ // This will be clamped to no more than 0.1 seconds to prevent
+ // excessive movement after pauses for loading or initialization.
+ float DeltaSeconds;
+
+ // It is generally expected that the following hold:
+ // ThisFrameSeconds < TimewarpPointSeconds < NextFrameSeconds <
+ // EyeScanoutSeconds[EyeOrder[0]] <= ScanoutMidpointSeconds <= EyeScanoutSeconds[EyeOrder[1]]
+
+ // Absolute time value of when rendering of this frame began or is expected to
+ // begin; generally equal to NextFrameSeconds of the previous frame. Can be used
+ // for animation timing.
+ double ThisFrameSeconds;
+ // Absolute point when IMU expects to be sampled for this frame.
+ double TimewarpPointSeconds;
+ // Absolute time when frame Present + GPU Flush will finish, and the next frame starts.
+ double NextFrameSeconds;
+
+ // Time when when half of the screen will be scanned out. Can be passes as a prediction
+ // value to ovrHmd_GetSensorState() go get general orientation.
+ double ScanoutMidpointSeconds;
+ // Timing points when each eye will be scanned out to display. Used for rendering each eye.
+ double EyeScanoutSeconds[2];
+
+} ovrFrameTiming;
+
+
+
+// Rendering information for each eye, computed by either ovrHmd_ConfigureRendering().
+// or ovrHmd_GetRenderDesc() based on the specified Fov.
+// Note that the rendering viewport is not included here as it can be
+// specified separately and modified per frame though:
+// (a) calling ovrHmd_GetRenderScaleAndOffset with game-rendered api,
+// or (b) passing different values in ovrTexture in case of SDK-rendered distortion.
+typedef struct ovrEyeRenderDesc_
+{
+ ovrEyeType Eye;
+ ovrFovPort Fov;
+ ovrRecti DistortedViewport; // Distortion viewport
+ ovrVector2f PixelsPerTanAngleAtCenter; // How many display pixels will fit in tan(angle) = 1.
+ ovrVector3f ViewAdjust; // Translation to be applied to view matrix.
+} ovrEyeRenderDesc;
+
+
+//-----------------------------------------------------------------------------------
+// ***** Platform-independent Rendering Configuration
+
+// These types are used to hide platform-specific details when passing
+// render device, OS and texture data to the APIs.
+//
+// The benefit of having these wrappers vs. platform-specific API functions is
+// that they allow game glue code to be portable. A typical example is an
+// engine that has multiple back ends, say GL and D3D. Portable code that calls
+// these back ends may also use LibOVR. To do this, back ends can be modified
+// to return portable types such as ovrTexture and ovrRenderAPIConfig.
+
+typedef enum
+{
+ ovrRenderAPI_None,
+ ovrRenderAPI_OpenGL,
+ ovrRenderAPI_Android_GLES, // May include extra native window pointers, etc.
+ ovrRenderAPI_D3D9,
+ ovrRenderAPI_D3D10,
+ ovrRenderAPI_D3D11,
+ ovrRenderAPI_Count
+} ovrRenderAPIType;
+
+// Platform-independent part of rendering API-configuration data.
+// It is a part of ovrRenderAPIConfig, passed to ovrHmd_Configure.
+typedef struct ovrRenderAPIConfigHeader_
+{
+ ovrRenderAPIType API;
+ ovrSizei RTSize;
+ int Multisample;
+} ovrRenderAPIConfigHeader;
+
+typedef struct ovrRenderAPIConfig_
+{
+ ovrRenderAPIConfigHeader Header;
+ uintptr_t PlatformData[8];
+} ovrRenderAPIConfig;
+
+// Platform-independent part of eye texture descriptor.
+// It is a part of ovrTexture, passed to ovrHmd_EndFrame.
+// - If RenderViewport is all zeros, will be used.
+typedef struct ovrTextureHeader_
+{
+ ovrRenderAPIType API;
+ ovrSizei TextureSize;
+ ovrRecti RenderViewport; // Pixel viewport in texture that holds eye image.
+} ovrTextureHeader;
+
+typedef struct ovrTexture_
+{
+ ovrTextureHeader Header;
+ uintptr_t PlatformData[8];
+} ovrTexture;
+
+
+// -----------------------------------------------------------------------------------
+// ***** API Interfaces
+
+// Basic steps to use the API:
+//
+// Setup:
+// 1. ovrInitialize();
+// 2. ovrHMD hmd = ovrHmd_Create(0); ovrHmd_GetDesc(hmd, &hmdDesc);
+// 3. Use hmdDesc and ovrHmd_GetFovTextureSize() to determine graphics configuration.
+// 4. Call ovrHmd_StartSensor() to configure and initialize tracking.
+// 5. Call ovrHmd_ConfigureRendering() to setup graphics for SDK rendering,
+// which is the preferred approach.
+// Please refer to "Game-Side Rendering" below if you prefer to do that instead.
+// 5. Allocate textures as needed.
+//
+// Game Loop:
+// 6. Call ovrHmd_BeginFrame() to get frame timing and orientation information.
+// 7. Render each eye in between ovrHmd_BeginEyeRender and ovrHmd_EndEyeRender calls,
+// providing the result texture to the API.
+// 8. Call ovrHmd_EndFrame() to render distorted textures to the back buffer
+// and present them on the Hmd.
+//
+// Shutdown:
+// 9. ovrHmd_Destroy(hmd)
+// 10. ovr_Shutdown()
+//
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ // Library init/shutdown, must be called around all other OVR code.
+ // No other functions calls are allowed before ovr_Initialize succeeds or after ovr_Shutdown.
+ OVR_EXPORT ovrBool ovr_Initialize();
+ OVR_EXPORT void ovr_Shutdown();
+
+
+ // Detects or re-detects HMDs and reports the total number detected.
+ // Users can get information about each HMD by calling ovrHmd_Create with an index.
+ OVR_EXPORT int ovrHmd_Detect();
+
+
+ // Creates a handle to an HMD and optionally fills in data about it.
+ // Index can [0 .. ovrHmd_Detect()-1]; index mappings can cange after each ovrHmd_Detect call.
+ // If not null, returned handle must be freed with ovrHmd_Destroy.
+ OVR_EXPORT ovrHmd ovrHmd_Create(int index);
+ OVR_EXPORT void ovrHmd_Destroy(ovrHmd hmd);
+
+ // Creates a "fake" HMD used for debugging only. This is not tied to specific hardware,
+ // but may be used to debug some of the related rendering.
+ OVR_EXPORT ovrHmd ovrHmd_CreateDebug(ovrHmdType type);
+
+
+ // Returns last error for HMD state. Returns null for no error.
+ // String is valid until next call or GetLastError or HMD is destroyed.
+ // Pass null hmd to get global error (for create, etc).
+ OVR_EXPORT const char* ovrHmd_GetLastError(ovrHmd hmd);
+
+
+ //-------------------------------------------------------------------------------------
+
+ // Returns capability bits that are enabled at this time; described by ovrHmdCaps.
+ // Note that this value is different font ovrHmdDesc::HmdCaps, which describes what
+ // capabilities are available.
+ OVR_EXPORT unsigned int ovrHmd_GetEnabledCaps(ovrHmd hmd);
+
+ // Modifies capability bits described by ovrHmdCaps that can be modified,
+ // such as ovrHmd_LowPersistance.
+ OVR_EXPORT void ovrHmd_SetEnabledCaps(ovrHmd hmd, unsigned int hmdCaps);
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Sensor Interface
+
+ // All sensor interface functions are thread-safe, allowing sensor state to be sampled
+ // from different threads.
+ // Starts sensor sampling, enabling specified capabilities, described by ovrSensorCaps.
+ // - supportedSensorCaps specifies support that is requested. The function will succeed
+ // even if these caps are not available (i.e. sensor or camera is unplugged). Support
+ // will automatically be enabled if such device is plugged in later. Software should
+ // check ovrSensorState.StatusFlags for real-time status.
+ // - requiredSensorCaps specify sensor capabilities required at the time of the call.
+ // If they are not available, the function will fail. Pass 0 if only specifying
+ // supportedSensorCaps.
+ OVR_EXPORT ovrBool ovrHmd_StartSensor(ovrHmd hmd, unsigned int supportedSensorCaps,
+ unsigned int requiredSensorCaps);
+ // Stops sensor sampling, shutting down internal resources.
+ OVR_EXPORT void ovrHmd_StopSensor(ovrHmd hmd);
+ // Resets sensor orientation.
+ OVR_EXPORT void ovrHmd_ResetSensor(ovrHmd hmd);
+
+ // Returns sensor state reading based on the specified absolute system time.
+ // Pass absTime value of 0.0 to request the most recent sensor reading; in this case
+ // both PredictedPose and SamplePose will have the same value.
+ // ovrHmd_GetEyePredictedSensorState relies on this internally.
+ // This may also be used for more refined timing of FrontBuffer rendering logic, etc.
+ OVR_EXPORT ovrSensorState ovrHmd_GetSensorState(ovrHmd hmd, double absTime);
+
+ // Returns information about a sensor.
+ // Only valid after StartSensor.
+ OVR_EXPORT ovrBool ovrHmd_GetSensorDesc(ovrHmd hmd, ovrSensorDesc* descOut);
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Graphics Setup
+
+ // Fills in description about HMD; this is the same as filled in by ovrHmd_Create.
+ OVR_EXPORT void ovrHmd_GetDesc(ovrHmd hmd, ovrHmdDesc* desc);
+
+ // Calculates texture size recommended for rendering one eye within HMD, given FOV cone.
+ // Higher FOV will generally require larger textures to maintain quality.
+ // - pixelsPerDisplayPixel specifies that number of render target pixels per display
+ // pixel at center of distortion; 1.0 is the default value. Lower values
+ // can improve performance.
+ OVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmd, ovrEyeType eye, ovrFovPort fov,
+ float pixelsPerDisplayPixel);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Rendering API Thread Safety
+
+ // All of rendering APIs, inclusing Configure and frame functions are *NOT
+ // Thread Safe*. It is ok to use ConfigureRendering on one thread and handle
+ // frames on another thread, but explicit synchronization must be done since
+ // functions that depend on configured state are not reentrant.
+ //
+ // As an extra requirement, any of the following calls must be done on
+ // the render thread, which is the same thread that calls ovrHmd_BeginFrame
+ // or ovrHmd_BeginFrameTiming.
+ // - ovrHmd_EndFrame
+ // - ovrHmd_BeginEyeRender
+ // - ovrHmd_EndEyeRender
+ // - ovrHmd_GetFramePointTime
+ // - ovrHmd_GetEyePose
+ // - ovrHmd_GetEyeTimewarpMatrices
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** SDK-Rendering Functions
+
+ // These functions support rendering of distortion by the SDK through direct
+ // access to the underlying rendering HW, such as D3D or GL.
+ // This is the recommended approach, as it allows for better support or future
+ // Oculus hardware and a range of low-level optimizations.
+
+
+ // Configures rendering; fills in computed render parameters.
+ // This function can be called multiple times to change rendering settings.
+ // The users pass in two eye view descriptors that are used to
+ // generate complete rendering information for each eye in eyeRenderDescOut[2].
+ //
+ // - apiConfig provides D3D/OpenGL specific parameters. Pass null
+ // to shutdown rendering and release all resources.
+ // - distortionCaps describe distortion settings that will be applied.
+ //
+ OVR_EXPORT ovrBool ovrHmd_ConfigureRendering(ovrHmd hmd,
+ const ovrRenderAPIConfig* apiConfig,
+ unsigned int distortionCaps,
+ const ovrFovPort eyeFovIn[2],
+ ovrEyeRenderDesc eyeRenderDescOut[2]);
+
+
+ // Begins a frame, returning timing and orientation information useful for simulation.
+ // This should be called in the beginning of game rendering loop (on render thread).
+ // This function relies on ovrHmd_BeginFrameTiming for some of its functionality.
+ // Pass 0 for frame index if not using GetFrameTiming.
+ OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrame(ovrHmd hmd, unsigned int frameIndex);
+
+ // Ends frame, rendering textures to frame buffer. This may perform distortion and scaling
+ // internally, assuming is it not delegated to another thread.
+ // Must be called on the same thread as BeginFrame. Calls ovrHmd_BeginEndTiming internally.
+ // *** This Function will to Present/SwapBuffers and potentially wait for GPU Sync ***.
+ OVR_EXPORT void ovrHmd_EndFrame(ovrHmd hmd);
+
+
+ // Marks beginning of eye rendering. Must be called on the same thread as BeginFrame.
+ // This function uses ovrHmd_GetEyePose to predict sensor state that should be
+ // used rendering the specified eye.
+ // This combines current absolute time with prediction that is appropriate for this HMD.
+ // It is ok to call ovrHmd_BeginEyeRender() on both eyes before calling ovrHmd_EndEyeRender.
+ // If rendering one eye at a time, it is best to render eye specified by
+ // HmdDesc.EyeRenderOrder[0] first.
+ OVR_EXPORT ovrPosef ovrHmd_BeginEyeRender(ovrHmd hmd, ovrEyeType eye);
+
+ // Marks the end of eye rendering and submits the eye texture for display after it is ready.
+ // Rendering viewport within the texture can change per frame if necessary.
+ // Specified texture may be presented immediately or wait until ovrHmd_EndFrame based
+ // on the implementation. The API performs distortion and scaling internally.
+ // 'renderPose' will typically be the value returned from ovrHmd_BeginEyeRender, but can
+ // be different if a different pose was used for rendering.
+ OVR_EXPORT void ovrHmd_EndEyeRender(ovrHmd hmd, ovrEyeType eye,
+ ovrPosef renderPose, ovrTexture* eyeTexture);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Game-Side Rendering Functions
+
+ // These functions provide distortion data and render timing support necessary to allow
+ // game rendering of distortion. Game-side rendering involves the following steps:
+ //
+ // 1. Setup ovrEyeDesc based on desired texture size and Fov.
+ // Call ovrHmd_GetRenderDesc to get the necessary rendering parameters for each eye.
+ //
+ // 2. Use ovrHmd_CreateDistortionMesh to generate distortion mesh.
+ //
+ // 3. Use ovrHmd_BeginFrameTiming, ovrHmd_GetEyePose and ovrHmd_BeginFrameTiming
+ // in the rendering loop to obtain timing and predicted view orientation for
+ // each eye.
+ // - If relying on timewarp, use ovr_WaitTillTime after rendering+flush, followed
+ // by ovrHmd_GetEyeTimewarpMatrices to obtain timewarp matrices used
+ // in distortion pixel shader to reduce latency.
+ //
+
+ // Computes distortion viewport, view adjust and other rendering for the specified
+ // eye. This can be used instead of ovrHmd_ConfigureRendering to help setup rendering on
+ // the game side.
+ OVR_EXPORT ovrEyeRenderDesc ovrHmd_GetRenderDesc(ovrHmd hmd,
+ ovrEyeType eyeType, ovrFovPort fov);
+
+
+ // Describes a vertex used for distortion; this is intended to be converted into
+ // the engine-specific format.
+ // Some fields may be unused based on ovrDistortionCaps selected. TexG and TexB, for example,
+ // are not used if chromatic correction is not requested.
+ typedef struct ovrDistortionVertex_
+ {
+ ovrVector2f Pos;
+ float TimeWarpFactor; // Lerp factor between time-warp matrices. Can be encoded in Pos.z.
+ float VignetteFactor; // Vignette fade factor. Can be encoded in Pos.w.
+ ovrVector2f TexR;
+ ovrVector2f TexG;
+ ovrVector2f TexB;
+ } ovrDistortionVertex;
+
+ // Describes a full set of distortion mesh data, filled in by ovrHmd_CreateDistortionMesh.
+ // Contents of this data structure, if not null, should be freed by ovrHmd_DestroyDistortionMesh.
+ typedef struct ovrDistortionMesh_
+ {
+ ovrDistortionVertex* pVertexData;
+ unsigned long* pIndexData;
+ unsigned int VertexCount;
+ unsigned int IndexCount;
+ } ovrDistortionMesh;
+
+ // Generate distortion mesh per eye.
+ // Distortion capabilities will depend on 'distortionCaps' flags; user should rely on
+ // appropriate shaders based on their settings.
+ // Distortion mesh data will be allocated and stored into the ovrDistortionMesh data structure,
+ // which should be explicitly freed with ovrHmd_DestroyDistortionMesh.
+ // Users should call ovrHmd_GetRenderScaleAndOffset to get uvScale and Offset values for rendering.
+ // The function shouldn't fail unless theres is a configuration or memory error, in which case
+ // ovrDistortionMesh values will be set to null.
+ OVR_EXPORT ovrBool ovrHmd_CreateDistortionMesh(ovrHmd hmd,
+ ovrEyeType eyeType, ovrFovPort fov,
+ unsigned int distortionCaps,
+ ovrDistortionMesh *meshData);
+
+ // Frees distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements
+ // are set to null and zeroes after the call.
+ OVR_EXPORT void ovrHmd_DestroyDistortionMesh(ovrDistortionMesh* meshData);
+
+ // Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or
+ // viewport changes after the fact. This can be used to adjust render size every frame, if desired.
+ OVR_EXPORT void ovrHmd_GetRenderScaleAndOffset(ovrFovPort fov,
+ ovrSizei textureSize, ovrRecti renderViewport,
+ ovrVector2f uvScaleOffsetOut[2]);
+
+
+ // Thread-safe timing function for the main thread. Caller should increment frameIndex
+ // with every frame and pass the index to RenderThread for processing.
+ OVR_EXPORT ovrFrameTiming ovrHmd_GetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+ // Called at the beginning of the frame on the Render Thread.
+ // Pass frameIndex == 0 if ovrHmd_GetFrameTiming isn't being used. Otherwise,
+ // pass the same frame index as was used for GetFrameTiming on the main thread.
+ OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+ // Marks the end of game-rendered frame, tracking the necessary timing information. This
+ // function must be called immediately after Present/SwapBuffers + GPU sync. GPU sync is important
+ // before this call to reduce latency and ensure proper timing.
+ OVR_EXPORT void ovrHmd_EndFrameTiming(ovrHmd hmd);
+
+ // Initializes and resets frame time tracking. This is typically not necessary, but
+ // is helpful if game changes vsync state or video mode. vsync is assumed to be on if this
+ // isn't called. Resets internal frame index to the specified number.
+ OVR_EXPORT void ovrHmd_ResetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+
+ // Predicts and returns Pose that should be used rendering the specified eye.
+ // Must be called between ovrHmd_BeginFrameTiming & ovrHmd_EndFrameTiming.
+ OVR_EXPORT ovrPosef ovrHmd_GetEyePose(ovrHmd hmd, ovrEyeType eye);
+
+ // Computes timewarp matrices used by distortion mesh shader, these are used to adjust
+ // for orientation change since the last call to ovrHmd_GetEyePose for this eye.
+ // The ovrDistortionVertex::TimeWarpFactor is used to blend between the matrices,
+ // usually representing two different sides of the screen.
+ // Must be called on the same thread as ovrHmd_BeginFrameTiming.
+ OVR_EXPORT void ovrHmd_GetEyeTimewarpMatrices(ovrHmd hmd, ovrEyeType eye,
+ ovrPosef renderPose, ovrMatrix4f twmOut[2]);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Stateless math setup functions
+
+ // Used to generate projection from ovrEyeDesc::Fov.
+ OVR_EXPORT ovrMatrix4f ovrMatrix4f_Projection(ovrFovPort fov,
+ float znear, float zfar, ovrBool rightHanded);
+
+ // Used for 2D rendering, Y is down
+ // orthoScale = 1.0f / pixelsPerTanAngleAtCenter
+ // orthoDistance = distance from camera, such as 0.8m
+ OVR_EXPORT ovrMatrix4f ovrMatrix4f_OrthoSubProjection(ovrMatrix4f projection, ovrVector2f orthoScale,
+ float orthoDistance, float eyeViewAdjustX);
+
+ // Returns global, absolute high-resolution time in seconds. This is the same
+ // value as used in sensor messages.
+ OVR_EXPORT double ovr_GetTimeInSeconds();
+
+ // Waits until the specified absolute time.
+ OVR_EXPORT double ovr_WaitTillTime(double absTime);
+
+
+
+ // -----------------------------------------------------------------------------------
+ // ***** Latency Test interface
+
+ // Does latency test processing and returns 'TRUE' if specified rgb color should
+ // be used to clear the screen.
+ OVR_EXPORT ovrBool ovrHmd_ProcessLatencyTest(ovrHmd hmd, unsigned char rgbColorOut[3]);
+
+ // Returns non-null string once with latency test result, when it is available.
+ // Buffer is valid until next call.
+ OVR_EXPORT const char* ovrHmd_GetLatencyTestResult(ovrHmd hmd);
+
+ // Returns latency for HMDs that support internal latency testing via the
+ // pixel-read back method (-1 for invalid or N/A)
+ OVR_EXPORT double ovrHmd_GetMeasuredLatencyTest2(ovrHmd hmd);
+
+
+ // -----------------------------------------------------------------------------------
+ // ***** Property Access
+
+ // NOTICE: This is experimental part of API that is likely to go away or change.
+
+ // These allow accessing different properties of the HMD and profile.
+ // Some of the properties may go away with profile/HMD versions, so software should
+ // use defaults and/or proper fallbacks.
+ //
+
+ // For now, access profile entries; this will change.
+#if !defined(OVR_KEY_USER)
+
+#define OVR_KEY_USER "User"
+#define OVR_KEY_NAME "Name"
+#define OVR_KEY_GENDER "Gender"
+#define OVR_KEY_PLAYER_HEIGHT "PlayerHeight"
+#define OVR_KEY_EYE_HEIGHT "EyeHeight"
+#define OVR_KEY_IPD "IPD"
+#define OVR_KEY_NECK_TO_EYE_HORIZONTAL "NeckEyeHori"
+#define OVR_KEY_NECK_TO_EYE_VERTICAL "NeckEyeVert"
+
+#define OVR_DEFAULT_GENDER "Male"
+#define OVR_DEFAULT_PLAYER_HEIGHT 1.778f
+#define OVR_DEFAULT_EYE_HEIGHT 1.675f
+#define OVR_DEFAULT_IPD 0.064f
+#define OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL 0.12f
+#define OVR_DEFAULT_NECK_TO_EYE_VERTICAL 0.12f
+#endif
+
+
+ // Get float property. Returns first element if property is a float array.
+ // Returns defaultValue if property doesn't exist.
+ OVR_EXPORT float ovrHmd_GetFloat(ovrHmd hmd, const char* propertyName, float defaultVal);
+
+ // Modify float property; false if property doesn't exist or is readonly.
+ OVR_EXPORT ovrBool ovrHmd_SetFloat(ovrHmd hmd, const char* propertyName, float value);
+
+
+ // Get float[] property. Returns the number of elements filled in, 0 if property doesn't exist.
+ // Maximum of arraySize elements will be written.
+ OVR_EXPORT unsigned int ovrHmd_GetFloatArray(ovrHmd hmd, const char* propertyName,
+ float values[], unsigned int arraySize);
+
+ // Modify float[] property; false if property doesn't exist or is readonly.
+ OVR_EXPORT ovrBool ovrHmd_SetFloatArray(ovrHmd hmd, const char* propertyName,
+ float values[], unsigned int arraySize);
+
+ // Get string property. Returns first element if property is a string array.
+ // Returns defaultValue if property doesn't exist.
+ // String memory is guaranteed to exist until next call to GetString or GetStringArray, or HMD is destroyed.
+ OVR_EXPORT const char* ovrHmd_GetString(ovrHmd hmd, const char* propertyName,
+ const char* defaultVal);
+
+ // Returns array size of a property, 0 if property doesn't exist.
+ // Can be used to check existence of a property.
+ OVR_EXPORT unsigned int ovrHmd_GetArraySize(ovrHmd hmd, const char* propertyName);
+
+
+ //OVR_EXPORT void DMKeepAlive(void);
+
+ /*
+ ** 调用这个函数判断设备设备插入状态是否改变
+ ** 如果返回1则表示发生变化
+ ** 返回0则表示未发生变换
+ */
+ OVR_EXPORT int DM_IsConnectionChanged(void);
+
+ /*
+ ** 调用这个函数判断设备是否插入该函数只返回当前设备连接状态不做任何操作
+ ** 如果返回1则表示设备已经插入
+ ** 返回0则表示已经拔出
+ */
+ OVR_EXPORT int DM_IsConnected(void);
+
+ /*
+ ** 调用这个函数执行陀螺仪校准命令,每调用一次,驱动层会向Hmd发送陀螺仪校准命令
+ ** 如果返回1则表示驱动层发送命令成功,SetFeatureReport成功
+ ** 返回0则表示发送失败 SetFeatureReport失败
+ ** 返回2表示驱动层错误: 说明USB HID句柄未初始化成功,指针为空。表示设备未插入或者驱动层未正常初始化
+ */
+ OVR_EXPORT int DM_CalibrateGyro(void);
+
+ /*
+ ** 调用这个函数执行进入DFU命令,每调用一次,驱动层会向Hmd发送进入DFU升级命令
+ ** 如果返回1则表示驱动层发送命令成功,SetFeatureReport成功
+ ** 返回0则表示发送失败 SetFeatureReport失败
+ ** 返回2表示驱动层错误: 说明USB HID句柄未初始化成功,指针为空。表示设备未插入或者驱动层未正常初始化
+ ** 注意发送DFU命令后,Hmd会立即进入DFU模式,USB会和当前驱动断开,除非再次以正常模式进行连接,否则该函数
+ ** 无法正常调用。
+ */
+ OVR_EXPORT int DM_EnterDFUMode(void);
+
+
+ /*
+ ** 调用该函数,发送命令设置Hmd的显示模式,如果为TRUE,Hmd则进入分屏模式(双屏模式),默认设置为FALSE,单屏模式显示
+ ** 返回0表示USB的SetFeatureReport失败,返回2表示:头显断开或者是初始化错误。返回1表示成功
+ */
+ OVR_EXPORT int DM_IsDoubleScreen(bool state);
+
+ /*
+ * 调用该函数设置屏幕背光亮度,返回1表示成功。返回-1表示亮度范围错误。亮度范围0
+#include
+#include
+#include
+#include "PipeHMD.h"
+#include "OVR_CAPI.h"
+#include
+
+//extern void TimeLog(const char* str);
+// {
+// time_t t = time(0);
+// char tmp[100];
+// strftime(tmp, sizeof(tmp), "%a %b %d %Y %X - PipeTest Client VR", localtime(&t));
+// char cmd[1024];
+// //sprintf_s(cmd, "echo %s %s >>d:hmd.txt ", tmp, str);
+// //system(cmd);
+// sprintf_s(cmd, "echo %s %s >>d:pipetest.txt ", tmp, str);
+// system(cmd);
+// }
+// void TimeLog(const char* str)
+// {
+// time_t t = time(0);
+// char tmp[100];
+// strftime(tmp, sizeof(tmp), "%a %b %d %Y %X - PipeTest Client CTL", localtime(&t));
+// char cmd[1024];
+// //sprintf_s(cmd, "echo %s %s >>d:hmd.txt ", tmp, str);
+// //system(cmd);
+// sprintf_s(cmd, "echo %s %s >>d:pipetest.txt ", tmp, str);
+// system(cmd);
+// }
+using namespace std;
+namespace DMPipe
+{
+ PipeHMD::PipeHMD(string sname) :m_hPipe(INVALID_HANDLE_VALUE)
+ {
+ this->name = sname;
+ }
+ PipeHMD::~PipeHMD()
+ {
+ PipeHMD::Free();
+ }
+ BOOL PipeHMD::IsOpen()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_IS_OPEN;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ ovrSensorState PipeHMD::GetSensorData()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ ovrSensorState * result = (ovrSensorState *)&reciveBuf[0];
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_GET_DATA;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(ovrSensorState));
+ return result[0];
+ }
+ SensorPureData PipeHMD::GetPureSensorData()
+ {
+ memset(reciveBuf, 0, sizeof(BOOL));
+ SensorPureData * result = (SensorPureData *)&reciveBuf[0];
+ return result[0];
+ }
+ BOOL PipeHMD::EnterDFUMode()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_ENTER_DFU_MODE;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ BOOL PipeHMD::Calibration()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_CALIBRATION;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ void PipeHMD::SetName(string sname)
+ {
+ this->name = sname;
+ }
+}
+
diff --git a/4.Software/GeekIMUDriver 1.0/Src/PipeHMD.h b/4.Software/GeekIMUDriver 1.0/Src/PipeHMD.h
new file mode 100644
index 0000000..68b801f
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/PipeHMD.h
@@ -0,0 +1,151 @@
+#ifndef _PIPE_H_
+#define _PIPE_H_
+
+#pragma once
+
+#include
+#include
+#include "OVR_CAPI.h"
+using namespace std;
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_DATA 2
+#define COMMAND_DEVICE_CALIBRATION 3
+#define COMMAND_DEVICE_GET_PURE_DATA 4
+#define COMMAND_DEVICE_ENTER_DFU_MODE 11
+
+#define ENTER_DFU_MODE_SUCCESS 1
+#define ENTER_DFU_MODE_FAILED 0
+#define CALIBRATION_SUCCESS 1
+#define CALIBRATION_FAILED 0
+
+namespace DMPipe{
+ class PipeHMD
+ {
+ public:
+ PipeHMD() :m_hPipe(INVALID_HANDLE_VALUE){}
+ ~PipeHMD();
+ PipeHMD(std::string sname);
+ BOOL IsOpen();
+ ovrSensorState GetSensorData();
+ SensorPureData GetPureSensorData();
+ BOOL EnterDFUMode();
+ BOOL Calibration();
+ inline LPCTSTR GetName()
+ {
+ return name.c_str();
+ }
+ void SetName(std::string sname);
+ private:
+ std::string name;
+ unsigned char reciveBuf[512];
+ unsigned char writeBuf[512];
+ DWORD readLenth;
+ DWORD writeLenth;
+ HANDLE m_hPipe;
+ BOOL isConnection;
+ inline void Init()
+ {
+ for (;;)
+ {
+ m_hPipe = CreateFile(
+ GetName(), // pipe name
+ GENERIC_READ | // read and write access
+ GENERIC_WRITE,
+ 0, // no sharing
+ NULL, // default security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // default attributes
+ NULL); // no template file
+
+ // Break if the pipe handle is valid.
+
+ if (m_hPipe != INVALID_HANDLE_VALUE)
+ {
+ isConnection = TRUE;
+ return;
+ }
+ // Exit if an error other than ERROR_PIPE_BUSY occurs.
+
+ if (GetLastError() != ERROR_PIPE_BUSY)
+ {
+ //char buf[255] = { 0 };
+ //printf(TEXT("Could not open pipe. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ return;
+ }
+
+ // All pipe instances are busy, so wait for 1 milliseconds.
+
+ if (!WaitNamedPipe(GetName(), 1))
+ {
+ //TimeLog("Could not open pipe: 1 millisecond wait timed out.");
+ return;
+ }
+ }
+
+ }
+ inline void Free()
+ {
+ if (m_hPipe == INVALID_HANDLE_VALUE)
+ {
+ isConnection = FALSE;
+ return;
+ }
+ else
+ {
+ if (CloseHandle(m_hPipe))
+ {
+ m_hPipe = INVALID_HANDLE_VALUE;
+ isConnection = FALSE;
+ }
+ }
+ }
+ inline void PipeProcess(DWORD sizeofrecive)
+ {
+ this->Init();
+ if (isConnection)
+ {
+ BOOL fSuccess = FALSE;
+ fSuccess = WriteFile(
+ m_hPipe, // pipe handle
+ writeBuf, // message
+ sizeof(unsigned int) * 3, // message length
+ &writeLenth, // bytes written
+ NULL); // not overlapped
+
+ if (!fSuccess)
+ {
+ char buf[255] = { 0 };
+ sprintf(buf, TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ goto freepipe;
+ }
+ //printf("\nMessage sent to server, receiving reply as follows:\n");
+ do
+ {
+ // Read from the pipe.
+ fSuccess = ReadFile(
+ m_hPipe, // pipe handle
+ reciveBuf, // buffer to receive reply
+ sizeofrecive, // size of buffer
+ &readLenth, // number of bytes read
+ NULL); // not overlapped
+ if (!fSuccess && GetLastError() != ERROR_MORE_DATA)
+ break;
+ } while (!fSuccess); // repeat loop if ERROR_MORE_DATA
+
+ if (!fSuccess)
+ {
+ char buf[255] = { 0 };
+ sprintf(buf, TEXT("ReadFile from pipe failed. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ goto freepipe;
+ }
+ freepipe:
+ this->Free();
+ }
+ }
+ };
+
+}
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/SensorImpl.cpp b/4.Software/GeekIMUDriver 1.0/Src/SensorImpl.cpp
new file mode 100644
index 0000000..5b4ea4f
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/SensorImpl.cpp
@@ -0,0 +1,638 @@
+#include "windows.h"
+#include "SensorImpl.h"
+#include "stdio.h"
+#include "quaternion.h"
+#include "math.h"
+#include "UsbHid_CAPI.h"
+#include "MyCls.h"
+extern "C" FILE* fpdata;
+Quaternion GlobalQ;
+BOOL GlobalQ_Updating;
+float LocX,LocY,LocZ;
+float Yaw,Pitch,Roll;
+extern FILE* Getfpdata();
+extern int global_calibration_flag;
+extern int global_Show;
+UINT8 global_key[4] = { 0 };
+float gxc=0, gyc=0, gzc=0;
+int gyro_cali_count = 0;
+#define GYRO_CALIBRATION_SAMPLE_NUMBER 3000
+float gx0=0, gy0=0, gz0=0;
+BOOL GlobalMag_Updating = false;
+Vector3 GlobalMag = {0};
+static bool HmdStandByState;
+
+void MagFilter(float *mx,float *my,float *mz,float sita);
+void GyroComputeDrift(float *gx, float *gy, float *gz);
+
+
+void LowPassFilterYaw(float *z, float alpha);
+
+bool IsHmdIntoStandBy(float *Pitch, float *Roll, float dTime);
+
+
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z)
+{
+
+ struct {INT32 x:21;} s;
+
+ *x = s.x = (buffer[0] << 13) | (buffer[1] << 5) | ((buffer[2] & 0xF8) >> 3);
+ *y = s.x = ((buffer[2] & 0x07) << 18) | (buffer[3] << 10) | (buffer[4] << 2) |
+ ((buffer[5] & 0xC0) >> 6);
+ *z = s.x = ((buffer[5] & 0x3F) << 15) | (buffer[6] << 7) | (buffer[7] >> 1);
+}
+Vector3 DM_GetMag()
+{
+ Vector3 v = { 0 };
+ static Vector3 VLast = { 0 };
+ if (!GlobalMag_Updating)
+ {
+ VLast = GlobalMag;
+ }
+ v = VLast;
+ return v;
+}
+void GetControllerSensor(unsigned char usb_input_buffer[])
+{
+ static UINT8 updatecnt = 0;
+ INT16 MagX,MagY,MagZ;
+ INT16 MagX1, MagY1, MagZ1;
+ long GX,GY,GZ;
+ long AX,AY,AZ;
+ UINT NowTime;
+ float ax, ay, az, gx, gy, gz, mx, my, mz, mx1, my1, mz1;;
+ static float mxlast=0,mylast=0,mzlast=0;
+ static int Dtime = 0;
+ static UINT LastTime = 0;
+ float q0,q1,q2,q3;
+
+
+
+ NowTime = *(UINT16* )(usb_input_buffer+2);
+ if(LastTime != 0)
+ {
+ if(NowTime >= LastTime)
+ {
+ Dtime = NowTime - LastTime;
+ LastTime = NowTime;
+ }else
+ {
+ Dtime = (65535 - LastTime) + NowTime;
+ //printf("NowTime = %d LastTime = %d Dtime = %d\n",NowTime,LastTime,Dtime);
+ LastTime = NowTime;
+ }
+
+ }else
+ {
+ Dtime = 1;
+ LastTime = NowTime;
+ }
+ if (global_Show==5)
+ {
+ //clrscr();
+ back2zero();
+ printf("Hex数据\n\n");
+ for (int i = 0; i < 64; i++)
+ {
+ if ((i%16)==0)
+ {
+ printf("\n");
+ }
+ //if (global_debug)
+ printf("%2x ", usb_input_buffer[i]);
+
+ }
+ printf("\n");
+ }
+ //if(Dtime>3)printf("NowTime = %d LastTime = %d Dtime = %d\n",NowTime,LastTime,Dtime);
+// MagX1 = *(INT16 *)(usb_input_buffer + 46);
+// MagY1 = *(INT16 *)(usb_input_buffer + 48);
+// MagZ1 = *(INT16 *)(usb_input_buffer + 50);
+
+ MagX = *(INT16 *)(usb_input_buffer + 56);
+ MagY = *(INT16 *)(usb_input_buffer + 58);
+ MagZ = *(INT16 *)(usb_input_buffer + 60);
+
+ UnpackSensor(usb_input_buffer+8, &AX,&AY,&AZ);
+ UnpackSensor(usb_input_buffer+16, &GX,&GY,&GZ);
+
+
+ ax = (float)0.0001*AX;
+ ay = (float)0.0001*AY;
+ az = (float)0.0001*AZ;
+
+ gx = (float)0.0001*GX;
+ gy = (float)0.0001*GY;
+ gz = (float)0.0001*GZ;
+ float x = 16.4 * 180 / 3.14159265358979323846F;
+
+ if (global_Show == 1)
+ {
+ printf("gx = %f,gy = %f gz =%f\n", gx*x, gy*x, gz*x);
+ }
+ GyroComputeDrift(&gx, &gy, &gz);
+ if (global_calibration_flag == 1)
+ {
+ if (gyro_cali_count > GYRO_CALIBRATION_SAMPLE_NUMBER)
+ {
+ gyro_cali_count = 0;
+ gxc = gyc = gzc = 0;
+ }
+ gyro_cali_count++;
+ gxc += gx*x;
+ gyc += gy*x;
+ gzc += gz*x;
+ if (gyro_cali_count == GYRO_CALIBRATION_SAMPLE_NUMBER)
+ {
+ gx0 = gxc / gyro_cali_count;
+ gy0 = gyc / gyro_cali_count;
+ gz0 = gzc / gyro_cali_count;
+ gyro_cali_count++;
+ global_calibration_flag = 0;
+ printf("%f %f %f\n", gx0, gy0, gz0);
+ }
+ }
+
+// q0 = *(float *)(usb_input_buffer+24);
+// q1 = *(float *)(usb_input_buffer+28);
+// q2 = *(float *)(usb_input_buffer+32);
+ // q3 = *(float *)(usb_input_buffer+36);
+// q0 = *(float *)(usb_input_buffer + 32);
+// q1 = *(float *)(usb_input_buffer + 36);
+// q2 = *(float *)(usb_input_buffer + 40);
+// q3 = *(float *)(usb_input_buffer + 44);
+ global_key[0] = usb_input_buffer[24];
+ //global_key[0] = usb_input_buffer[25];
+ //global_key[0] = usb_input_buffer[26];
+ global_key[3] = usb_input_buffer[27];
+// GlobalQ_Updating = TRUE;
+// GlobalQ.w = q0;
+// GlobalQ.x = q2;
+// GlobalQ.y = q3;
+// GlobalQ.z = q1;
+// GlobalQ_Updating = FALSE;
+// Pitch = asin(-2.0f*(q3*q1 - q0*q2))* (180.0f / 3.141592f); /*轴进行四元数到欧拉角的转换 */
+// Yaw = atan2(q2*q1 + q0*q3, 0.5f - q2*q2 - q3*q3)* (180.0f / 3.141592f);
+// Roll = atan2(q2*q3 + q0*q1, 0.5f - q2*q2 - q1*q1)* (180.0f / 3.141592f);
+//
+// if (global_Show == 4)
+// printf("Yaw = %f,Pitch = %f Roll =%f\n", Yaw, Pitch, Roll);
+
+ mx = (float)MagX / 16;
+ my = (float)MagY / 16;
+ mz = (float)MagZ / 16;
+ if (global_calibration_flag==3)
+ {
+ GlobalMag_Updating = true;
+ mx = (float)MagX;
+ my = (float)MagY;
+ mz = (float)MagZ;
+// mx1 = (float)MagX1;
+// my1 = (float)MagY1;
+// mz1 = (float)MagZ1;
+ GlobalMag.x = (float)MagX;
+ GlobalMag.y = (float)MagY;
+ GlobalMag.z = (float)MagZ;
+ GlobalMag_Updating = false;
+ }
+// mx = (float)MagX;
+// my = (float)MagY;
+// mz = (float)MagZ;
+
+
+ //Pitch = asin(-2.0f*(q3*q1-q0*q2))* (180.0f /3.141592f); /*轴进行四元数到欧拉角的转换 */
+ //Yaw = atan2(q2*q1 + q0*q3,0.5f - q2*q2 - q3*q3)* (180.0f /3.141592f);
+ //Roll = atan2(q2*q3 + q0*q1,0.5f - q2*q2 - q1*q1)* (180.0f /3.141592f);
+ //
+
+ //printf("Yaw = %f,Pitch = %f Roll =%f\n",Yaw,Pitch,Roll);
+
+if(mxlast == 0&&mylast == 0&&mylast == 0)
+ {
+ mxlast = mx;
+ mylast = my;
+ mzlast = mz;
+
+ MagFilter(&mx, &my, &mz, 0.95f);
+ for (int i = 0; i < 200; i++)
+ AHRSupdate(0, 0, 0, az, ax, ay, mz, mx, my, 1, Dtime * 400);
+ }
+ else
+ {
+ updatecnt++;
+ if (updatecnt > 10)
+ updatecnt = 0;
+ if (mx == mxlast&&my == my&&mz == mzlast && updatecnt < 10)
+ {
+ AHRSupdate(gz,gx,gy,az,ax,ay,mz,mx,my,1,Dtime);
+ //printf("数据完全相同...\n");
+ }
+ else
+ {
+ mxlast = mx;
+ mylast = my;
+ mzlast = mz;
+// if (global_Show == 3)
+// printf("mx = %f my= %f mz= %f\n", mx, my, mz);
+// if (global_calibration_flag == 3)
+// {
+//
+// if (Getfpdata() != NULL)
+// {
+// fprintf(Getfpdata(), "%f %f %f\n", mx, my, mz);
+// Sleep(5);
+// }
+// }
+ MagFilter(&mx,&my,&mz,0.95f);
+
+// printf("mx = %f my= %f mz= %f\n", mx, my, mz);
+// if (Getfpdata()!=NULL)
+// {
+// fprintf(Getfpdata(), "%f %f %f\n", mx, my, mz);
+// }
+ AHRSupdate(gz,gx,gy,az,ax,ay,mz,mx,my,1,Dtime);
+
+
+ }
+ }
+
+ //printf("mx = %f my= %f mz= %f\n",mx,my,mz);
+
+
+
+}
+
+
+/**********************************************************************************************************
+* Function Name : AHRSupdate
+* 输入 : 三轴加速度计、陀螺仪、磁力计的值
+* 描述 :加速度计、陀螺仪、磁力计融合得到的欧拉角
+
+ 1)这个算法基于标准笛卡尔右手坐标系,z轴朝上,x轴朝人,y轴朝右
+ 2)传感器的方向需要变换到和改算法定义的坐标轴相同。
+
+* 修改 :2016/11/5 : 根据磁力计采样率比较低的特点,设置了2种模式:1、融合磁力计 2、不融合磁力计
+ 2016/11/6 :改进了四元数更新算法,原来的四元数更新算法会导致累计误差。
+ 2016/11/9 : 规定了本算法运行的坐标轴,重写了四元数到欧拉角变换的代码。
+***********************************************************************************************************/
+
+
+float q0 = 1, q1 = 0, q2 = 0, q3 = 0;
+float exInt = 0, eyInt = 0, ezInt = 0; /*缩放积分误差 */
+#define Kp 2.5f /*加速度计和磁力计对陀螺仪的比例修正参数 */
+#define Ki 0.005f /*加速度计和磁力计对陀螺仪的积分修正参数 */
+#define Kd 0.0f
+static int AHRS_Init = 0;
+void ResetAHRS(){ AHRS_Init = 0; q0 = 1; q1 = 0; q2 = 0; q3 = 0; }
+void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz, char useMag, int Dtime)
+{
+ /*原算法的定义*/
+ float norm, halfT;
+ float hx, hy, hz, bz, by;
+ float vx, vy, vz, wx, wy, wz;
+ float ex, ey, ez;
+ float qw, qx, qy, qz;
+ float AccelAjust, MagAjust;
+ /*方便之后的程序使用,减少计算时间*/
+ float q0q0 = q0*q0; float q0q1 = q0*q1;
+ float q0q2 = q0*q2; float q0q3 = q0*q3;
+ float q1q1 = q1*q1; float q1q2 = q1*q2;
+ float q1q3 = q1*q3; float q2q2 = q2*q2;
+ float q2q3 = q2*q3; float q3q3 = q3*q3;
+ if (AHRS_Init > 200)
+ {
+ halfT = 0.0005f*Dtime; /*得到每次姿态更新的周期的一半t = (1/SampleFrq) * 0.5 */
+ }
+ else
+ {
+ if (useMag == 1)
+ {
+ halfT = 0.1;
+ gx = gy = gz = 0;
+ AHRS_Init++;
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ norm = invSqrt(ax*ax + ay*ay + az*az); /*把加速度计向量转换为单位向量*/
+
+ if ((1.0f / norm) > 1.6 || (1.0f / norm) < 0.4){
+ AccelAjust = 0;
+ MagAjust = 1.2f;
+
+ }
+ else{
+ AccelAjust = 1.0f;
+ MagAjust = 1.0f;
+ }
+ // printf("加速度过大...\n");
+ // getchar();
+
+ ax = ax * norm;
+ ay = ay * norm;
+ az = az * norm; /*把磁力计向量转换为单位向量 */
+ norm = invSqrt(mx*mx + my*my + mz*mz);
+ mx = mx * norm;
+ my = my * norm;
+ mz = mz * norm;
+
+
+ hx = 2.0f*(mx*(0.5f - q2q2 - q3q3) + my*(q1q2 - q0q3) + mz*(q1q3 + q0q2)); /*把(mx,my,mz)转换到地理坐标系的(hx,hy,hz),利用H = Q^-1 * M */
+ hy = 2.0f*(mx*(q1q2 + q0q3) + my*(0.5f - q1q1 - q3q3) + mz*(q2q3 - q0q1));
+ hz = 2.0f*(mx*(q1q3 - q0q2) + my*(q2q3 + q0q1) + mz*(0.5f - q1q1 - q2q2));
+
+ /*计的数值为(bx,by,0),所以我们不关注hx的数值 */
+ // bx = sqrtf((hx*hx) + (hy*hy)); /*使磁力计正交化*/
+ by = sqrtf((hx*hx) + (hy*hy));
+ bz = hz;
+
+ /*v代表的是把地理坐标系的加速度(0,0,1g)转换到机体坐标系的加 */
+ vx = 2.0f*(q1q3 - q0q2); /*速度计(ax,ay,az),其实就是用R*(0,0,1),R为旋转矩阵,此矩阵可 */
+ vy = 2 * (q0q1 + q2q3); /*由四元数转换得到 */
+ vz = q0q0 - q1q1 - q2q2 + q3q3;
+
+ wx = 2.0f*(by*(q1q2 + q0q3) + bz*(q1q3 - q0q2)); /*把正交化的H即B从地理坐标系转换到飞行器坐标系,利用W = Q * B */
+ wy = 2.0f*(by*(0.5f - q1q1 - q3q3) + bz*(q0q1 + q2q3)); /*这里认为bx = 0 */
+ wz = 2.0f*(by*(q2q3 - q0q1) + bz*(0.5f - q1q1 - q2q2));
+
+
+
+ /*如果使用磁力计,则融合磁力计*/
+ if (useMag != 0)
+ { /*用当前姿态向量和加速度的姿态向量做叉乘,乘积越小说明两个向量方向越相同*/
+ ex = AccelAjust*(ay*vz - az*vy) + MagAjust*(my*wz - mz*wy);
+ ey = AccelAjust*(az*vx - ax*vz) + MagAjust*(mz*wx - mx*wz);
+ ez = AccelAjust*(ax*vy - ay*vx) + MagAjust*(mx*wy - my*wx);
+ }
+ else
+ {
+
+ ex = AccelAjust*(ay*vz - az*vy);
+ ey = AccelAjust*(az*vx - ax*vz); /*因为加速度计没有校准,ez不靠谱*/
+ ez = AccelAjust*(ax*vy - ay*vx);
+ ez = 0;
+ }
+
+ if (ex != 0.0f && ey != 0.0f && ez != 0.0f)
+ {
+ /*这里使用了PID调节的方式,对角速度修正,Ki 是积分修正,Kp是直接修正 */
+ exInt = exInt + ex*Ki * halfT; /*对误差进行积分 */
+ eyInt = eyInt + ey*Ki * halfT;
+ ezInt = ezInt + ez*Ki * halfT;
+ gx = gx + Kp*(1 + Kd*fabsf(ex))*ex + exInt; /*使用比例和积分综合对陀螺仪进行修正,由于存在积分修正,所以才能确保回 */
+ gy = gy + Kp*(1 + Kd*fabsf(ey))*ey + eyInt; /*到期望回到的位置 */
+ gz = gz + Kp*(1 + Kd*fabsf(ez))*ez + ezInt;
+ }
+
+
+ qw = (-q1*gx - q2*gy - q3*gz)*halfT; /*利用一阶龙格库塔法对四元数进行更新*/
+ qx = (q0*gx + q2*gz - q3*gy)*halfT;
+ qy = (q0*gy - q1*gz + q3*gx)*halfT;
+ qz = (q0*gz + q1*gy - q2*gx)*halfT;
+
+ q0 = q0 + qw;
+ q1 = q1 + qx;
+ q2 = q2 + qy;
+ q3 = q3 + qz;
+
+ //QuaternionFilter(&q1,&q2,&q3,0.98f);
+
+ //LowPassFilterYaw(&q3,0.98);
+
+ norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3); /*对四元数进行规范化,即四元数模为1*/
+
+ q0 = q0 * norm; //w
+ q1 = q1 * norm; //x
+ q2 = q2 * norm; //y
+ q3 = q3 * norm; //z
+ /*对原变换公式进行重写,避免了以前坐标轴混乱的问题,按照标准数学右手坐标*/
+// Pitch = asin(-2.0f*(q3*q1 - q0*q2))* (180.0f / 3.141592f); /*轴进行四元数到欧拉角的转换 */
+// Yaw = atan2(q2*q1 + q0*q3, 0.5f - q2*q2 - q3*q3)* (180.0f / 3.141592f);
+// Roll = atan2(q2*q3 + q0*q1, 0.5f - q2*q2 - q1*q1)* (180.0f / 3.141592f);
+
+// /*对原变换公式进行重写,避免了以前坐标轴混乱的问题,按照标准y上x右z人*/
+// Pitch = asin(-2.0f*(q2*q3 - q0*q1))* (180.0f / 3.141592f); /*轴进行四元数到欧拉角的转换 */
+// Yaw = atan2(q1*q3 + q0*q2, 0.5f - q1*q1 - q2*q2)* (180.0f / 3.141592f);
+// Roll = atan2(q1*q2 + q0*q3, 0.5f - q1*q1 - q3*q3)* (180.0f / 3.141592f);
+
+ /*对原变换公式进行重写,避免了以前坐标轴混乱的问题,按照标准y上z右x前*/
+ Pitch = asin(-2.0f*(q2*q1 - q0*q3))* (180.0f / 3.141592f); /*轴进行四元数到欧拉角的转换 */
+ Yaw = atan2(q3*q1 + q0*q2, 0.5f - q3*q3 - q2*q2)* (180.0f / 3.141592f);
+ Roll = atan2(q3*q2 + q0*q1, 0.5f - q3*q3 - q1*q1)* (180.0f / 3.141592f);
+
+ LowPassFilterYaw(&Yaw, 0.9f);
+
+// if (global_Show == 4)
+// printf("Yaw = %f,Pitch = %f Roll =%f\n", Yaw, Pitch, Roll);
+ if (AHRS_Init > 200)
+ {
+ GlobalQ_Updating = TRUE;
+ GlobalQ.w = q0;
+ GlobalQ.x = q2;
+ GlobalQ.y = q3;
+ GlobalQ.z = q1;
+ GlobalQ_Updating = FALSE;
+ }
+
+
+ IsHmdIntoStandBy(&Pitch, &Roll, 1.0f);
+}
+
+
+void MagFilter(float *mx, float *my, float *mz, float sita)
+{
+ static float xlast = 0, ylast = 0, zlast = 0;
+ if (xlast == 0 && ylast == 0 && ylast == 0)
+ {
+ xlast = *mx;
+ ylast = *my;
+ zlast = *mz;
+ }
+ else
+ {
+ xlast = sita*xlast + (1 - sita)*(*mx);
+ ylast = sita*ylast + (1 - sita)*(*my);
+ zlast = sita*zlast + (1 - sita)*(*mz);
+ }
+}
+
+
+/*******************************************************************************
+* Function Name : invSqrt
+* Description : 快速计算 1/Sqrt(x),源自雷神3,神奇的0x5f3759df
+* 输入 : x
+* 输出 :1/sqrt(x)
+*******************************************************************************/
+float invSqrt(float x)
+{
+ float halfx = 0.5f * x;
+ float y = x;
+ long i = *(long*)&y;
+ i = 0x5f3759df - (i >> 1);
+ y = *(float*)&i;
+ y = y * (1.5f - (halfx * y * y));
+ return y;
+}
+
+
+void GyroComputeDrift(float *gx, float *gy, float *gz)
+{
+ static float GxOffect = 0.0f, GyOffect = 0.0f, GzOffect = 0.0f;
+ static float GxOffectTmp = 0.0f, GyOffectTmp = 0.0f, GzOffectTmp = 0.0f;
+ static float GxTmp = 0.0f, GyTmp = 0.0f, GzTmp = 0.0f;
+ static int count = 0;
+
+ *gx = *gx - GxOffect;
+ *gy = *gy - GyOffect;
+ *gz = *gz - GzOffect;
+
+ if (HmdStandByState == true){
+ GxTmp = GxTmp + *gx;
+ GyTmp = GyTmp + *gy;
+ GzTmp = GzTmp + *gz;
+ count++;
+ if (count == 3000){
+ //printf("陀螺仪校准完成\n");
+
+ GxOffectTmp = GxTmp / count;
+ GyOffectTmp = GyTmp / count;
+ GzOffectTmp = GzTmp / count;
+
+ GxOffect = GxOffect + GxOffectTmp;
+ GyOffect = GyOffect + GyOffectTmp;
+ GzOffect = GzOffect + GzOffectTmp;
+
+ GxTmp = 0.0f;
+ GyTmp = 0.0f;
+ GzTmp = 0.0f;
+ count = 0;
+ }
+ }
+ else{
+ count = 0;
+ GxTmp = 0.0f;
+ GyTmp = 0.0f;
+ GzTmp = 0.0f;
+ }
+
+}
+
+void LowPassFilterYaw(float *z, float alpha)
+{
+ static float lastz = 0;
+ if (lastz == 0)
+ {
+ lastz = *z;
+ }
+ else
+ {
+ *z = alpha*lastz + (1 - alpha)*(*z);
+ lastz = *z;
+ }
+
+}
+
+
+
+bool IsHmdIntoStandBy(float *Pitch, float *Roll, float dTime)
+{
+ static float LastPitch = 0.0f, LastRoll = 0.0f;
+ static float LastGyroX = 0.0f, LastGyroY = 0.0f;
+ static int count = 0;
+ float GyroX = 0.0f, GyroY = 0.0f, alpha = 0.98f;
+
+
+ /* 初始化静态变量 */
+ if (LastPitch == 0.0f&&LastRoll == 0.0f){
+ LastPitch = *Pitch;
+ LastRoll = *Roll;
+ }
+ /*对Pitch和Roll微分,求Gx和Gy */
+ GyroX = fabsf(*Roll - LastRoll) / dTime;
+ GyroY = fabsf(*Pitch - LastPitch) / dTime;
+ /*初始化静态变量*/
+ if (LastGyroX == 0.0f&&LastGyroY == 0.0f){
+ LastGyroX = GyroX;
+ LastGyroY = GyroY;
+ }
+ /*进行一个滑动窗口滤波降低偶然误差*/
+ GyroX = alpha*LastGyroX + (1 - alpha)*GyroX;
+ GyroY = alpha*LastGyroY + (1 - alpha)*GyroY;
+
+ if (GyroX < 0.0015f&&GyroY < 0.0015f){
+ count++;
+ if (count == 3000){
+ count = 0;
+ HmdStandByState = true;
+ //printf("头显进入休眠\n");
+ }
+ }
+ else{
+ count = 0;
+ HmdStandByState = false;
+ }
+ /* 更新静态变量 */
+ LastRoll = *Roll;
+ LastPitch = *Pitch;
+ LastGyroX = GyroX;
+ LastGyroY = GyroY;
+
+ return HmdStandByState;
+}
+
+float DM_GetYaw(void)
+{
+ return Yaw;
+}
+
+float DM_GetPitch(void)
+{
+ return Pitch;
+}
+float DM_GetRoll(void)
+{
+ return Roll;
+}
+Quaternion CQ_DM = { 1, 0, 0, 0 };
+bool DM_Corrected = false;
+Quaternion CorrectQuaterinonYaw(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+int DM_Correct(void)
+{
+ Quaternion q = { GlobalQ.w, 0, GlobalQ.y, 0 };
+ CQ_DM = CorrectQuaterinonYaw(q);
+ DM_Corrected = true;
+ return DM_Corrected ? 1 : 0;
+}
+
+Quaternion DM_GetPoseQuat(void)
+{
+ static Quaternion QLast = { 1.0f, 0.0f, 0.0f, 0.0f };
+ if (!GlobalQ_Updating)
+ {
+ QLast.w = GlobalQ.w;
+ QLast.x = GlobalQ.x;
+ QLast.y = GlobalQ.y;
+ QLast.z = GlobalQ.z;
+ }
+ if (DM_Corrected)
+ {
+ return QuaternionMulti(QLast, CQ_DM);
+ }
+ else
+ return QLast;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/SensorImpl.h b/4.Software/GeekIMUDriver 1.0/Src/SensorImpl.h
new file mode 100644
index 0000000..d7039e0
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/SensorImpl.h
@@ -0,0 +1,71 @@
+#ifndef _SENSORIMPL_H_
+#define _SENSORIMPL_H_
+#include "quaternion.h"
+
+#ifdef __cplusplus
+extern "C"{
+ Quaternion DM_GetPoseQuat(void);
+
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+void GetControllerSensor(unsigned char usb_input_buffer[]);
+
+ float GetLocX(void);
+
+ float GetLocY(void);
+
+ float GetLocZ(void);
+
+//__declspec(dllexport) float GetLocX1(void);
+//
+//__declspec(dllexport) float GetLocY1(void);
+//
+//__declspec(dllexport) float GetLocZ1(void);
+
+
+/*
+* 描述 : 获取偏航角Yaw
+*/
+ float DM_GetYaw(void);
+/*
+* 描述 :获取俯仰角Pitch
+*/
+ float DM_GetPitch(void);
+/*
+* 描述 :获取滚转角Roll
+*/
+ float DM_GetRoll(void);
+
+
+
+float invSqrt(float x) ;
+
+void ResetAHRS();
+
+void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz,char useMag,int Dtime);
+
+Vector3 DM_GetMag();
+
+int DM_Correct(void);
+
+}
+#else
+
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+void GetControllerSensor(unsigned char usb_input_buffer[]);
+
+__declspec(dllexport) float GetLocX(void);
+
+__declspec(dllexport) float GetLocY(void);
+
+__declspec(dllexport) float GetLocZ(void);
+
+#endif
+
+
+
+#endif
+
+
+
diff --git a/4.Software/GeekIMUDriver 1.0/Src/USB_Win32_HIDDevice.c b/4.Software/GeekIMUDriver 1.0/Src/USB_Win32_HIDDevice.c
new file mode 100644
index 0000000..03dfa57
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/USB_Win32_HIDDevice.c
@@ -0,0 +1,246 @@
+/***************************************************************************
+* 描 述: USBHID设备驱动代码
+* 作 者: 詹力
+* 时 间: 2016/10/29
+***************************************************************************/
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "USB_Win32_HIDDevice.h"
+#include "MagCalibrate.h"
+#include "SensorImpl.h"
+
+#pragma comment(lib,"setupapi.lib")
+#pragma comment(lib, "hid.lib")
+
+unsigned char usb_output_buffer[65];
+unsigned char usb_input_buffer[256];
+unsigned char usb_feature_report_buffer[256];
+
+unsigned char buffer[255];
+/* 主函数,程序的入口 */
+
+HANDLE dematrix_usb_handle = INVALID_HANDLE_VALUE;
+HDEVINFO device_info_set;
+GUID HidGuid;
+SP_DEVICE_INTERFACE_DATA device_interface_data;
+HIDP_CAPS dematrix_device_capabilities;
+
+HANDLE DM_HID_Read_HANDLE;
+HANDLE DM_HID_Write_HANDLE;
+
+int i=5;
+BOOL device_is_found;
+OVERLAPPED usb_read_over_lapped;
+PSP_DEVICE_INTERFACE_DETAIL_DATA pData;
+
+
+BOOL HIDFindDeviceFromVendor(USHORT PID,USHORT VID,CHAR *Path)
+{
+ HANDLE DM_USB_HANDLE;
+ HIDD_ATTRIBUTES Dev_Attr;
+
+ Dev_Attr.Size = sizeof(Dev_Attr);
+
+ DM_USB_HANDLE = CreateFileA(Path, (DWORD)NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, (DWORD)NULL, NULL);
+ if(DM_USB_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ if (HidD_GetAttributes(DM_USB_HANDLE, &Dev_Attr) == FALSE) return FALSE;
+
+ HidD_GetNumInputBuffers(DM_USB_HANDLE, &i);
+ //printf("BufferSize[%d]\n",i);
+ dematrix_usb_get_capabilities(DM_USB_HANDLE);
+ //printf("Cap.out.length[%d]\n", dematrix_device_capabilities.OutputReportByteLength);
+ //printf("(PID=%x,VID=%x,VersionTest=%x)\n", Dev_Attr.ProductID, Dev_Attr.VendorID, Dev_Attr.VersionNumber);
+ if (Dev_Attr.ProductID == PID && Dev_Attr.VendorID == VID)
+ {
+ //printf("(PID=%x,VID=%x,VersionTest=%x)\n", Dev_Attr.ProductID, Dev_Attr.VendorID, Dev_Attr.VersionNumber);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+
+BOOL InitPathFromInterfaceData(HDEVINFO hdevInfoSet, SP_DEVICE_INTERFACE_DATA* pidata)
+{
+ DWORD detailSize = 0;
+ BOOL Result;
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet,pidata, NULL, (DWORD)NULL, &detailSize, NULL);
+
+ pData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(detailSize);
+ if (pData == NULL){
+ printf("内存不足!\n");
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ return FALSE;
+ }
+ pData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, pData, detailSize, NULL, NULL);
+ if(Result==TRUE)
+ {
+ //printf("Path = %s\n",(char *)(pData->DevicePath));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*给定USB设备,对USB设备进行枚举,如果PID和VID都符合,就打开USB设备并创建句柄*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID)
+{
+ HDEVINFO hdevInfoSet;
+ SP_DEVICE_INTERFACE_DATA interfaceData;
+
+
+ int deviceIndex = 0;
+ interfaceData.cbSize = sizeof(interfaceData);
+
+ /* 先取得GUID */
+ HidD_GetHidGuid(&HidGuid);
+
+ hdevInfoSet = SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);
+
+ if (hdevInfoSet == INVALID_HANDLE_VALUE) return FALSE;
+
+ for(deviceIndex = 0;
+ SetupDiEnumDeviceInterfaces(hdevInfoSet, NULL, &HidGuid, deviceIndex, &interfaceData);
+ deviceIndex++)
+ {
+ //printf("index = %d\n",deviceIndex);
+
+ if (!InitPathFromInterfaceData(hdevInfoSet, &interfaceData))
+ continue;
+ // 下面的函数需要路径
+ if(HIDFindDeviceFromVendor(PID,VID,(CHAR*)(pData->DevicePath)))
+ {
+ //printf("Path = %s\n",(char *)(pData->DevicePath));
+
+ DM_HID_Read_HANDLE = CreateFileA((char *)(pData->DevicePath), (DWORD)GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
+ FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+ DM_HID_Write_HANDLE = CreateFileA((char *)(pData->DevicePath), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
+
+
+ device_is_found = TRUE;
+ SetEvent(usb_read_over_lapped.hEvent);
+ printf("打开设备成功!\n");
+ break;
+ }else
+ continue;
+ }
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+
+ if(device_is_found==TRUE)return TRUE;
+ else
+ return FALSE;
+}
+
+void USB_HID_Init()
+{
+ //初始化读报告时用的Overlapped结构体
+ //偏移量设置为0
+ usb_read_over_lapped.Offset = 0;
+ usb_read_over_lapped.OffsetHigh = 0;
+ //创建一个事件,提供给ReadFile使用,当ReadFile完成时,
+ //会设置该事件为触发状态。
+ usb_read_over_lapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ start_thread(dematrix_usb_private_read_thread, NULL);
+}
+
+
+
+int globalpacklen = 0;
+DWORD dematrix_usb_private_read_thread(LPVOID param)
+{
+ DWORD length;
+
+ //该线程是个死循环,直到程序退出时,它才退出
+ while (1)
+ {
+ //设置事件为无效状态
+ ResetEvent(usb_read_over_lapped.hEvent);
+
+ //如果设备已经找到
+ if (device_is_found == TRUE)
+ {
+
+ if (DM_HID_Read_HANDLE == INVALID_HANDLE_VALUE) {
+ printf("无效的读报告句柄,可能是打开设备时失败");
+ }
+ else {
+
+ CancelIo(DM_HID_Read_HANDLE);
+ // DKHD2这里使用62,DK2一定要使用64,否则无法读取数据
+ ReadFile(DM_HID_Read_HANDLE, usb_input_buffer,globalpacklen, NULL, &usb_read_over_lapped);
+ }
+
+ //等待事件触发
+ WaitForSingleObject(usb_read_over_lapped.hEvent, INFINITE);
+
+ //如果等待过程中设备被拔出,也会导致事件触发,但此时MyDevFound
+ //被设置为假,因此在这里判断MyDevFound为假的话就进入下一轮循环。
+ if (device_is_found == FALSE) continue;
+
+ //如果设备没有被拔下,则是ReadFile函数正常操作完成。
+ //通过GetOverlappedResult函数来获取实际读取到的字节数。
+ GetOverlappedResult(DM_HID_Read_HANDLE, &usb_read_over_lapped, &length, TRUE);
+
+ //如果字节数不为0,则将读到的数据显示到信息框中
+ if (length != 0)
+ {
+ int useful_length = usb_input_buffer[1];
+
+ GetControllerSensor(usb_input_buffer);
+ }
+ }
+ else {
+ //阻塞线程,直到下次事件被触发
+ WaitForSingleObject(usb_read_over_lapped.hEvent, INFINITE);
+ }
+ }
+ return 0;
+}
+
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle)
+{
+ PHIDP_PREPARSED_DATA PreparsedData;
+
+ if (hid_usb_handle == NULL) return;
+
+ HidD_GetPreparsedData(hid_usb_handle, &PreparsedData);
+
+ HidP_GetCaps(PreparsedData, &dematrix_device_capabilities);
+
+ HidD_FreePreparsedData(PreparsedData);
+}
+
+DWORD start_thread(void *function_address, void *param)
+{
+ DWORD temp;
+#ifdef _WIN32
+ HANDLE hThread;
+ hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)function_address, param, 0, &temp);
+ if (hThread != NULL) return (DWORD)hThread;
+ else return 0x00;
+#else
+#ifdef linux
+ pthread_t hThread;
+ int Result;
+ Result = pthread_create(&hThread, NULL, (void *)function_address, param);
+ if (Result != NULL) return Result;
+ else return -NULL;
+#endif
+#endif
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/USB_Win32_HIDDevice.h b/4.Software/GeekIMUDriver 1.0/Src/USB_Win32_HIDDevice.h
new file mode 100644
index 0000000..b38f61b
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/USB_Win32_HIDDevice.h
@@ -0,0 +1,50 @@
+#ifndef DM_Win32_HIDDevice_h_
+#define DM_Win32_HIDDevice_h_
+
+
+typedef struct _HID_HANDLE{
+ HANDLE HID_Read_HANDLE;
+ HANDLE HID_Write_HANDLE;
+}UsbHidHandle;
+
+#ifdef __cplusplus
+extern "C"{
+
+
+ /*给定USB设备的PID和VID,对USB设备进行枚举*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID);
+
+/*对USB HID 进行一些初始化操作,初始化一些必要的变量*/
+void USB_HID_Init();
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+DWORD start_thread(void *function_address, void *param);
+
+
+}
+
+#else
+
+ /*给定USB设备的PID和VID,对USB设备进行枚举*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID);
+
+/*对USB HID 进行一些初始化操作,初始化一些必要的变量*/
+void USB_HID_Init();
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+DWORD start_thread(void *function_address, void *param);
+
+#endif
+
+
+
+
+#endif
diff --git a/4.Software/GeekIMUDriver 1.0/Src/UsbHid_CAPI.h b/4.Software/GeekIMUDriver 1.0/Src/UsbHid_CAPI.h
new file mode 100644
index 0000000..e8b2bb6
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/UsbHid_CAPI.h
@@ -0,0 +1,16 @@
+#ifndef _UsbHid_CAPI_H_
+#define _UsbHid_CAPI_H_
+
+#ifdef __cplusplus
+extern "C"{
+
+__declspec(dllexport) int Init_Hmd(void);
+
+}
+#else
+
+__declspec(dllexport) int Init_Hmd(void);
+
+#endif
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/dematrix_usb.h b/4.Software/GeekIMUDriver 1.0/Src/dematrix_usb.h
new file mode 100644
index 0000000..d4983ce
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/dematrix_usb.h
@@ -0,0 +1,41 @@
+#ifndef _DEMATRIX_USB_H_
+#define _DEMATRIX_USB_H_
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/*返回1则找到设备,返回0 表示未找到设备*/
+_declspec(dllexport) int Init_Hmd(void);
+
+
+
+void dematrix_usb_init();
+
+BOOL HIDFindDeviceFromVendor(USHORT PID,USHORT VID,CHAR *Path);
+BOOL DM_HIDDeviceEnumerate(void);
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+int DK2_GetFeatureReport(HANDLE hid_usb_handle);
+int DK2_GetDisplayInfo(HANDLE hid_usb_handle,FILE *fp);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+
+
+
+
+
+#endif
diff --git a/4.Software/GeekIMUDriver 1.0/Src/hid.lib b/4.Software/GeekIMUDriver 1.0/Src/hid.lib
new file mode 100644
index 0000000..0040fcc
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.0/Src/hid.lib differ
diff --git a/4.Software/GeekIMUDriver 1.0/Src/main.cpp b/4.Software/GeekIMUDriver 1.0/Src/main.cpp
new file mode 100644
index 0000000..a6846f3
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/main.cpp
@@ -0,0 +1,2058 @@
+#include
+#include
+#include
+#include
+#include "USB_Win32_HIDDevice.h"
+#include "MagCalibrate.h"
+#include "SensorImpl.h"
+#include "DMCaliAPI.h"
+#include "UsbHid_CAPI.h"
+#include "quaternion.h"
+
+#include
+#include "hidsdi.h"
+#include
+
+#include
+
+#include "PipeHMD.h"
+
+#include
+#include
+#include
+#include
+#include
+#include "openvr_driver.h"
+#include "OVR_CAPI.h"
+int global_calibration_flag = 0;//0none 1 gyro 2 acc 3 mag
+int global_Show = 0;//0 hide 1 gyro 2acc 3mag 4angle 5Hex
+
+std::string sCurrent_Device_str("null");
+std::string strGlobalDevicePath("null");
+extern "C" int globalpacklen;
+
+extern "C" BOOL device_is_found;
+extern "C" PSP_DEVICE_INTERFACE_DETAIL_DATA pData;
+extern "C" HANDLE DM_HID_Read_HANDLE;
+extern "C" HANDLE DM_HID_Write_HANDLE;
+extern float gx0, gy0, gz0;
+extern "C" OVERLAPPED usb_read_over_lapped;
+
+int global_pipeserver = 0;
+//extern Quaternion Qcorr;
+bool global_debug = false;
+
+#include
+
+#include
+
+
+struct MagData
+{
+ float x;
+ float y;
+ float z;
+};
+// typedef struct _MagCaliParam
+// {
+// float xOffset;
+// float yOffset;
+// float zOffset;
+// float xScale;
+// float yScale;
+// float zScale;
+// }MagCaliParam;
+MagCaliParam CalculateMagCalibrationParams(MagData _mdata[], int dataSize)
+{
+ MagCaliParam param, lastparam;
+ //int dataSize = sizeof(_mdata);
+ //cout << << endl;
+ srand((unsigned)time(NULL));
+ // printf("%f\n", (rand() / (RAND_MAX+1.0)));
+ // printf("%f\n", (rand() / (RAND_MAX + 1.0)));
+ // printf("%f\n", (rand() / (RAND_MAX + 1.0)));
+ // printf("%f\n", (rand() / (RAND_MAX + 1.0)));
+ // printf("%f\n", (rand() / (RAND_MAX + 1.0)));
+ // printf("%f\n", (rand() / (RAND_MAX + 1.0)));
+ // printf("%f\n", (rand() / (RAND_MAX + 1.0)));
+ float xmin = _mdata[0].x;
+ float ymin = _mdata[0].y;
+ float zmin = _mdata[0].z;
+ float xmax = _mdata[0].x;
+ float ymax = _mdata[0].y;
+ float zmax = _mdata[0].z;
+ float err, errnew;
+ //cout << _mdata[1].x << " " << _mdata[1].y << " " << _mdata[1].z << endl;
+ // for (int i = 0; i < 10; i++)
+ // {
+ // cout << _mdata[i].x << " " << _mdata[i].y << " " << _mdata[i].z << endl;
+ // }
+ for (int i = 0; i < dataSize; i++)
+ {
+ if (xmax < _mdata[i].x)
+ xmax = _mdata[i].x;
+ if (ymax < _mdata[i].y)
+ ymax = _mdata[i].y;
+ if (zmax < _mdata[i].z)
+ zmax = _mdata[i].z;
+ if (xmin > _mdata[i].x)
+ xmin = _mdata[i].x;
+ if (ymin > _mdata[i].y)
+ ymin = _mdata[i].y;
+ if (zmin > _mdata[i].z)
+ zmin = _mdata[i].z;
+ }
+ //printf("%f %f \n%f %f \n%f %f \n", xmin, xmax, ymin, ymax, zmin, zmax);
+ lastparam.xOffset = 0.5*(xmax + xmin);
+ lastparam.yOffset = 0.5*(ymax + ymin);
+ lastparam.zOffset = 0.5*(zmax + zmin);
+ lastparam.xScale = 0.5*abs(xmax - xmin);
+ lastparam.yScale = 0.5*abs(ymax - ymin);
+ lastparam.zScale = 0.5*abs(zmax - zmin);
+ err = 0;
+ for (int i = 0; i < dataSize; i++)
+ err = err + fabs(pow((_mdata[i].x - lastparam.xOffset), 2) / pow(lastparam.xScale, 2) + pow((_mdata[i].y - lastparam.yOffset), 2) / pow(lastparam.yScale, 2) + pow((_mdata[i].z - lastparam.zOffset), 2) / pow(lastparam.zScale, 2) - 1);
+ //printf("xc = %f yc = %f zc = %f, a = %f b = %f c= %f,初始化InitErr = %f\n", lastparam.xOffset, lastparam.yOffset, lastparam.zOffset, lastparam.xScale, lastparam.yScale, lastparam.zScale, err);
+ int starttime = clock();
+ for (int j = 0; j < 5000; j++)
+ {
+ param.xOffset = lastparam.xOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.yOffset = lastparam.yOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.zOffset = lastparam.zOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.xScale = fabs(lastparam.xScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ param.yScale = fabs(lastparam.yScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ param.zScale = fabs(lastparam.zScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ errnew = 0;
+ for (int i = 0; i < dataSize; i++)
+ errnew = errnew + fabs(pow((_mdata[i].x - param.xOffset), 2) / pow(param.xScale, 2) + pow((_mdata[i].y - param.yOffset), 2) / pow(param.yScale, 2) + pow((_mdata[i].z - param.zOffset), 2) / pow(param.zScale, 2) - 1);
+ if (errnew < err)
+ {
+ lastparam.xOffset = param.xOffset;
+ lastparam.yOffset = param.yOffset;
+ lastparam.zOffset = param.zOffset;
+ lastparam.xScale = param.xScale;
+ lastparam.yScale = param.yScale;
+ lastparam.zScale = param.zScale;
+ err = errnew;
+ }
+ }
+ param.xScale = 200 / param.xScale;
+ param.yScale = 200 / param.yScale;
+ param.zScale = 200 / param.zScale;
+ int durtime = clock() - starttime;
+ printf("%f, %f, %f, %f, %f, %f, %f\n cost:%dms\n", param.xOffset, param.yOffset, param.zOffset, param.xScale, param.yScale, param.zScale, err, durtime);
+
+ return param;
+}
+MagCaliParam GetMagDataFormFile()
+{
+ int maxdatasize = 4000;
+ std::ifstream fin("data.txt");
+ float x, y, z,x1,y1,z1;
+ int i = 0;
+ MagData mdata[4000];
+ //MagData mdata1[4000];
+ while (fin) {
+ fin >> x >> y >> z ;
+ fin.get(); // 加入这行,避免最后一行输出两次
+ mdata[i].x = x;
+ mdata[i].y = y;
+ mdata[i].z = z;
+// mdata1[i].x = x1;
+// mdata1[i].y = y1;
+// mdata1[i].z = z1;
+ i++;
+
+ if (i == maxdatasize)
+ break;
+ }
+ //cout << mdata[i].x << " " << mdata[i].y << " " << mdata[i].z << " " << mdata1[i].x << " " << mdata1[i].y << " " << mdata1[i].z << endl;
+ //cout << "sizeof(mdata)" << i << "/" << sizeof(mdata) / sizeof(MagData) << endl;
+ // for (i = 0; i < 10; i++)
+ // {
+ // cout <<"["<>d:ArmCalibrate.txt ", "0", str);
+// system(cmd);
+ //p = CalculateMagCalibrationParams(mdata1, i);
+// sprintf_s(str, "%f, %f, %f, %f, %f, %f ", p.xOffset, p.yOffset, p.zOffset, p.xScale, p.yScale, p.zScale);
+// sprintf_s(cmd, "echo %s %s >>d:ArmCalibrate.txt ", "1", str);
+// system(cmd);
+ return p;
+ //printf("%f %f %f %f %f %f\n", p.xOffset, p.xScale, p.yOffset, p.yScale, p.zOffset, p.zScale);
+}
+
+
+int Init_Hmd(void)
+{
+
+ USB_HID_Init();
+
+ if (DM_HIDDeviceEnumerate(0x0002, 0x2833))
+ {
+ printf("成功找到USB设备\n");
+ return 1;
+ }
+ else
+ {
+ printf("未找到USB设备\n");
+ return 0;
+ }
+
+}
+
+/*调用说明*/
+
+
+FILE *fpdata;
+
+#define BUFSIZE 512
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_LEFT_POSE 2
+#define COMMAND_GET_RIGHT_POSE 3
+#define COMMAND_GET_LEFT_BAT 10
+#define COMMAND_GET_RIGHT_BAT 11
+
+#define COMMAND_SET_RUMBLE 20
+
+
+#define LEFT_HAND 0
+#define RIGHT_HAND 1
+
+
+
+
+#define BUFSIZE 512
+
+
+
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_DATA 2
+#define COMMAND_DEVICE_CALIBRATION 3
+#define COMMAND_DEVICE_GET_PURE_DATA 4
+#define COMMAND_DEVICE_ENTER_DFU_MODE 11
+
+#define ENTER_DFU_MODE_SUCCESS 1
+#define ENTER_DFU_MODE_FAILED 0
+#define CALIBRATION_SUCCESS 1
+#define CALIBRATION_FAILED 0
+
+
+#define FEATURE_OFFSET_SET_GYRO 1
+#define FEATURE_OFFSET_SET_ACC 2
+#define FEATURE_OFFSET_SET_MAG 3
+#define FEATURE_OFFSET_SET_LED 4
+#define FEATURE_OFFSET_GET_GYRO 0x11
+#define FEATURE_OFFSET_GET_ACC 0x12
+#define FEATURE_OFFSET_GET_MAG 0x13
+
+
+
+#define LED_COLOR_BLACK 0x00
+#define LED_COLOR_WHITE 0x07
+#define LED_COLOR_RED 0x04
+#define LED_COLOR_GREEN 0x02
+#define LED_COLOR_BLUE 0x01
+#define LED_COLOR_CYAN 0x03
+#define LED_COLOR_MAGENTA 0x06
+#define LED_COLOR_YELLOW 0x05
+
+UINT8 LED_COLOR_LIST[8] = {LED_COLOR_BLACK,LED_COLOR_WHITE,LED_COLOR_RED,LED_COLOR_GREEN,
+LED_COLOR_BLUE,LED_COLOR_CYAN,LED_COLOR_MAGENTA,LED_COLOR_YELLOW,};
+
+Quaternion CQGamePad = { 1, 0, 0, 0 };
+Quaternion CQHMD = { 1, 0, 0, 0 };
+
+
+
+
+
+
+#define FEATURE_OFFSET_SIZE 52//3+1+4*12
+
+DWORD WINAPI InstanceThread(LPVOID);
+VOID GetAnswerToRequest(LPCSTR, LPCSTR, LPDWORD);
+BOOL CreatePipeSecurity(PSECURITY_ATTRIBUTES *ppSa)
+{
+ BOOL fSucceeded = TRUE;
+ DWORD dwError = ERROR_SUCCESS;
+
+ PSECURITY_DESCRIPTOR pSd = NULL;
+ PSECURITY_ATTRIBUTES pSa = NULL;
+
+ // Define the SDDL for the security descriptor.
+ LPCSTR szSDDL = "D:" // Discretionary ACL
+ "(A;OICI;GRGW;;;AU)" // Allow read/write to authenticated users
+ "(A;OICI;GA;;;BA)"; // Allow full control to administrators
+
+ if (!ConvertStringSecurityDescriptorToSecurityDescriptor(szSDDL,
+ SDDL_REVISION_1, &pSd, NULL))
+ {
+ fSucceeded = FALSE;
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+ // Allocate the memory of SECURITY_ATTRIBUTES.
+ pSa = (PSECURITY_ATTRIBUTES)LocalAlloc(LPTR, sizeof(*pSa));
+ if (pSa == NULL)
+ {
+ fSucceeded = FALSE;
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+ pSa->nLength = sizeof(*pSa);
+ pSa->lpSecurityDescriptor = pSd;
+ pSa->bInheritHandle = FALSE;
+
+ *ppSa = pSa;
+
+Cleanup:
+ // Clean up the allocated resources if something is wrong.
+ if (!fSucceeded)
+ {
+ if (pSd)
+ {
+ LocalFree(pSd);
+ pSd = NULL;
+ }
+ if (pSa)
+ {
+ LocalFree(pSa);
+ pSa = NULL;
+ }
+
+ SetLastError(dwError);
+ }
+
+ return fSucceeded;
+}
+void FreePipeSecurity(PSECURITY_ATTRIBUTES pSa)
+{
+ if (pSa)
+ {
+ if (pSa->lpSecurityDescriptor)
+ {
+ LocalFree(pSa->lpSecurityDescriptor);
+ }
+ LocalFree(pSa);
+ }
+}
+int pipeservermain(VOID)
+{
+ if (global_pipeserver != 1)
+ {
+ return 0;
+ }
+ global_pipeserver = 2;
+
+ BOOL fConnected = FALSE;
+ DWORD dwThreadId = 0;
+ HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL;
+ //LPCSTR lpszPipename = TEXT("\\\\.\\pipe\\Dematrix_SteamVR");
+ LPCSTR lpszPipename = TEXT("\\\\.\\pipe\\Dematrix_CTL");
+ PSECURITY_ATTRIBUTES pSa;
+ if (!CreatePipeSecurity(&pSa))
+ {
+ printf("CreatePipeSecurity pSa FALSE\n");
+ FreePipeSecurity(pSa);
+ return 0;
+ }
+ // The main loop creates an instance of the named pipe and
+ // then waits for a client to connect to it. When the client
+ // connects, a thread is created to handle communications
+ // with that client, and this loop is free to wait for the
+ // next client connect request. It is an infinite loop.
+
+ for (;;)
+ {
+ if (global_pipeserver == -1)
+ {
+ global_pipeserver = 0;
+ break;
+ }
+ //_tprintf(TEXT("\nPipe Server: Main thread awaiting client connection on %s\n"), lpszPipename);
+ hPipe = CreateNamedPipe(
+ lpszPipename, // pipe name
+ PIPE_ACCESS_DUPLEX, // read/write access
+ PIPE_TYPE_MESSAGE | // message type pipe
+ PIPE_READMODE_MESSAGE | // message-read mode
+ PIPE_WAIT, // blocking mode
+ PIPE_UNLIMITED_INSTANCES, // max. instances
+ BUFSIZE, // output buffer size
+ BUFSIZE, // input buffer size
+ 0, // client time-out
+ pSa); // default security attribute
+
+ if (hPipe == INVALID_HANDLE_VALUE)
+ {
+ _tprintf(TEXT("CreateNamedPipe failed, GLE=%d.\n"), GetLastError());
+ return -1;
+ }
+
+ // Wait for the client to connect; if it succeeds,
+ // the function returns a nonzero value. If the function
+ // returns zero, GetLastError returns ERROR_PIPE_CONNECTED.
+
+ fConnected = ConnectNamedPipe(hPipe, NULL) ?
+ TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
+
+ if (fConnected)
+ {
+ //printf("Client connected, creating a processing thread.\n");
+
+ // Create a thread for this client.
+ hThread = CreateThread(
+ NULL, // no security attribute
+ 0, // default stack size
+ InstanceThread, // thread proc
+ (LPVOID)hPipe, // thread parameter
+ 0, // not suspended
+ &dwThreadId); // returns thread ID
+
+ if (hThread == NULL)
+ {
+ _tprintf(TEXT("CreateThread failed, GLE=%d.\n"), GetLastError());
+ return -1;
+ }
+ else CloseHandle(hThread);
+ }
+ else
+ // The client could not connect, so close the pipe.
+ CloseHandle(hPipe);
+ }
+ printf("管道服务器终止....\n");
+ return 0;
+}
+
+DWORD WINAPI InstanceThread(LPVOID lpvParam)
+// This routine is a thread processing function to read from and reply to a client
+// via the open pipe connection passed from the main loop. Note this allows
+// the main loop to continue executing, potentially creating more threads of
+// of this procedure to run concurrently, depending on the number of incoming
+// client connections.
+{
+ HANDLE hHeap = GetProcessHeap();
+ CHAR* pchRequest = (CHAR*)HeapAlloc(hHeap, 0, BUFSIZE*sizeof(CHAR));
+ CHAR* pchReply = (CHAR*)HeapAlloc(hHeap, 0, BUFSIZE*sizeof(CHAR));
+
+ DWORD cbBytesRead = 0, cbReplyBytes = 0, cbWritten = 0;
+ BOOL fSuccess = FALSE;
+ HANDLE hPipe = NULL;
+
+ // Do some extra error checking since the app will keep running even if this
+ // thread fails.
+
+ if (lpvParam == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL value in lpvParam.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchReply != NULL) HeapFree(hHeap, 0, pchReply);
+ if (pchRequest != NULL) HeapFree(hHeap, 0, pchRequest);
+ return (DWORD)-1;
+ }
+
+ if (pchRequest == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL heap allocation.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchReply != NULL) HeapFree(hHeap, 0, pchReply);
+ return (DWORD)-1;
+ }
+
+ if (pchReply == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL heap allocation.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchRequest != NULL) HeapFree(hHeap, 0, pchRequest);
+ return (DWORD)-1;
+ }
+
+ // Print verbose messages. In production code, this should be for debugging only.
+ //printf("InstanceThread created, receiving and processing messages.\n");
+
+ // The thread's parameter is a handle to a pipe object instance.
+
+ hPipe = (HANDLE)lpvParam;
+
+ // Loop until done reading
+ while (1)
+ {
+ // Read client requests from the pipe. This simplistic code only allows messages
+ // up to BUFSIZE characters in length.
+ fSuccess = ReadFile(
+ hPipe, // handle to pipe
+ pchRequest, // buffer to receive data
+ BUFSIZE*sizeof(TCHAR), // size of buffer
+ &cbBytesRead, // number of bytes read
+ NULL); // not overlapped I/O
+
+ if (!fSuccess || cbBytesRead == 0)
+ {
+ if (GetLastError() == ERROR_BROKEN_PIPE)
+ {
+ //_tprintf(TEXT("InstanceThread: client disconnected.\n"), GetLastError());
+ }
+ else
+ {
+ _tprintf(TEXT("InstanceThread ReadFile failed, GLE=%d.\n"), GetLastError());
+ }
+ break;
+ }
+
+ // Process the incoming message.
+ GetAnswerToRequest(pchRequest, pchReply, &cbReplyBytes);
+
+ // Write the reply to the pipe.
+ fSuccess = WriteFile(
+ hPipe, // handle to pipe
+ pchReply, // buffer to write from
+ cbReplyBytes, // number of bytes to write
+ &cbWritten, // number of bytes written
+ NULL); // not overlapped I/O
+
+ if (!fSuccess || cbReplyBytes != cbWritten)
+ {
+ _tprintf(TEXT("InstanceThread WriteFile failed, GLE=%d.\n"), GetLastError());
+ break;
+ }
+ }
+
+ // Flush the pipe to allow the client to read the pipe's contents
+ // before disconnecting. Then disconnect the pipe, and close the
+ // handle to this pipe instance.
+
+ FlushFileBuffers(hPipe);
+ DisconnectNamedPipe(hPipe);
+ CloseHandle(hPipe);
+
+ HeapFree(hHeap, 0, pchRequest);
+ HeapFree(hHeap, 0, pchReply);
+
+ //printf("InstanceThread exitting.\n");
+ return 1;
+}
+
+void ProcessHMDData(void *read_buffer, void* write_buffer, LPDWORD pchBytes){
+ unsigned char* writeBuffer = (unsigned char*)write_buffer;
+ BOOL status = FALSE;
+ unsigned int *int_value;
+ int_value = (unsigned int *)read_buffer;
+
+ memset(writeBuffer, 0, 512);
+ switch (int_value[0]){
+ case COMMAND_DEVICE_IS_OPEN:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ case COMMAND_GET_DATA:{
+ ovrSensorState *result = (ovrSensorState*)&writeBuffer[0];
+ Quaternion q = DM_GetPoseQuat();
+ result[0].Recorded.Pose.Orientation.w = q.w;
+ result[0].Recorded.Pose.Orientation.x = q.x;
+ result[0].Recorded.Pose.Orientation.y = q.y;
+ result[0].Recorded.Pose.Orientation.z = q.z;
+ *pchBytes = sizeof(ovrSensorState);
+ break;
+ }
+ case COMMAND_DEVICE_CALIBRATION:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ // case COMMAND_DEVICE_GET_PURE_DATA:{
+ // float *result = (float*)&writeBuffer[0];
+ // result[0] = usbDEV.fBatteryLevel[LEFT_HAND];
+ // if (!device_is_found)
+ // {
+ // result[0] = 0.0f;
+ // }
+ // *pchBytes = sizeof(float);
+ // break;
+ // }
+ case COMMAND_DEVICE_ENTER_DFU_MODE:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ }
+}
+extern UINT8 global_key[4];
+
+float global_ctlposition[3] = {0,0,0};
+void ProcessCtlData(void *read_buffer, void* write_buffer, LPDWORD pchBytes){
+ unsigned char* writeBuffer = (unsigned char*)write_buffer;
+ BOOL status = FALSE;
+ unsigned int *int_value;
+ int_value = (unsigned int *)read_buffer;
+
+ memset(writeBuffer, 0, 512);
+ switch (int_value[0]){
+ case COMMAND_DEVICE_IS_OPEN:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ DWORD write_length;
+ *result = device_is_found;
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ case COMMAND_GET_LEFT_POSE:{
+ vr::DriverPose_t *result = (vr::DriverPose_t*)&writeBuffer[0];
+ //Quaternion q = DM_GetQ();
+ result[0].qRotation.w = 1;
+ result[0].qRotation.x = 0;
+ result[0].qRotation.y = 0;
+ result[0].qRotation.z = 0;
+ *pchBytes = sizeof(vr::DriverPose_t);
+ break;
+ }
+ case COMMAND_GET_RIGHT_POSE:{
+ vr::DriverPose_t *result = (vr::DriverPose_t*)&writeBuffer[0];
+ Quaternion q = QuaternionMulti(DM_GetPoseQuat(),CQGamePad);
+ result[0].qRotation.w = q.w;
+ result[0].qRotation.x = q.x;
+ result[0].qRotation.y = q.y;
+ result[0].qRotation.z = q.z;
+ result[0].vecPosition[0]=global_ctlposition[0];
+ result[0].vecPosition[1]=global_ctlposition[1];
+ result[0].vecPosition[2]=global_ctlposition[2];
+ unsigned char *aAxis = (unsigned char *)&result[0].vecVelocity[3];
+ aAxis[0] = global_key[0]<<1;//unsigned char K[4] ;//依次为 8个按键数据(8bit依次△,▽,RB,◎(轴按下), Y,B,A,X ),x轴,y轴,和trig
+ //aAxis[1] = usbDEV.K[hand][1];
+ //aAxis[2] = usbDEV.K[hand][2];
+ aAxis[3] = global_key[3];//我偷懒用这传的按键状态......你说不需要vecVelocity的嘛....
+ *pchBytes = sizeof(vr::DriverPose_t);
+ break;
+ }
+ case COMMAND_GET_LEFT_BAT:{
+ float *result = (float*)&writeBuffer[0];
+ result[0] = 0;
+ if (!device_is_found)
+ {
+ result[0] = 0.0f;
+ }
+ *pchBytes = sizeof(float);
+ break;
+ }
+ case COMMAND_GET_RIGHT_BAT:{
+ float *result = (float*)&writeBuffer[0];
+ result[0] = 0.7f;
+ if (!device_is_found)
+ {
+ result[0] = 0.0f;
+ }
+ *pchBytes = sizeof(float);
+ break;
+ }
+ case COMMAND_SET_RUMBLE:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ *result = true;// TriggerHaptic(*(unsigned int*)a_command.data / 255, 50);
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ }
+}
+
+VOID GetAnswerToRequest(LPCSTR pchRequest,
+ LPCSTR pchReply,
+ LPDWORD pchBytes)
+{
+ // This routine is a simple function to print the client request to the console
+ // and populate the reply buffer with a default data string. This is where you
+ // would put the actual client request processing code that runs in the context
+ // of an instance thread. Keep in mind the main thread will continue to wait for
+ // and receive other client connections while the instance thread is working.
+ ProcessCtlData((void*)pchRequest, (void*)pchReply, pchBytes);
+}
+FILE* Getfpdata()
+{
+ return fpdata;
+}
+
+Quaternion CorrectQuaterinonY(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+Quaternion CorrectQuaterinon(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+
+void ShowHelp()
+{
+ printf("============================HELP===========================\n");
+ printf("h - 显示帮助\n");
+ printf("c - 检查设备连接\n");
+ printf("d - 进入DFU模式\n");
+ printf("l - LED 颜色设置\n");
+ printf("t - 校准陀螺仪\n");
+// printf(" - b - 取消校准\n");
+// printf(" - s - 显示陀螺仪数据\n");
+// printf(" - - b - 返回\n");
+ printf("p - 启动管道服务器\n");
+// printf(" - r - 启动管道服务器\n");
+// printf(" - s - 关闭管道服务器\n");
+ printf("g - 进入陀螺仪校准\n");
+// printf(" - s - 显示陀螺仪数据\n");
+// printf(" - - b - 返回\n");
+// printf(" - c - 校准数据\n");
+// printf(" - r - 重置为0\n");
+// printf(" - g - 获取当前陀螺仪计校准参数\n");
+// printf(" - b - 返回\n");
+ printf("m - 进入磁力校准\n");
+// printf(" - g - 获取当前磁力计校准参数\n");
+// printf(" - s - 写入默认磁力计参数\n");
+// printf(" - c - 开始获取磁力计数据并写入data.txt\n");
+// printf(" - - f - 数据获取完成 需要输入新的校准参数\n");
+// printf(" - - c - 取消校准\n");
+// printf(" - - q - 退出校准\n");
+ printf("a - 显示欧拉角数据\n");
+// printf(" - b - 返回\n");
+ printf("o - 显示原始数据\n");
+// printf(" - b - 返回\n");
+ printf("M - 移动虚拟位置\n");
+ printf(" c校准方向 b返回 空格归零 \n");
+ printf(" ws ad qe按照手柄方向移动虚拟位置 \n");
+ printf(" WS AD QE按照头盔方向移动虚拟位置 \n");
+ printf("============================帮助===========================\n");
+}
+
+
+int main()
+{
+// printf("DMGamePad调试工具 2016-12-13 02:11:20\n");
+// /**
+// * 初始化USB_HID
+// * 相关初始化变量
+// * 启动读取线程
+// **/globalpacklen = 64;
+// USB_HID_Init();
+// find_device:
+// /*查找PID=0x0001,VID为0x2833的USB设备*/
+// //while (!DM_HIDDeviceEnumerate(0x5750, 0x0483))
+// while (!DM_HIDDeviceEnumerate(0x0002, 0x2833))
+// {
+// printf("找不到0x0001, 0x2833 USB设备!\n");
+// Sleep(1000);
+// // if (_getche()=='q')
+// // {
+// // return 0;
+// // }
+// }
+ Init("VID_2833&PID_0002");
+ //system("cls");
+ ShowHelp();
+ DMPipe::PipeHMD p("\\\\.\\Pipe\\Dematrix_SteamVR");
+
+// UINT8 MAG_Info[FEATURE_OFFSET_SIZE] = { 0x0b };
+// UINT8 MAG_Set[FEATURE_OFFSET_SIZE] = { 0x0b};
+
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+
+ while (1)
+ {
+ //printf(">>");
+ *offset_set_dev = *offset_get_dev = 0;
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ memset(offset_set_data, 0, FEATURE_OFFSET_SIZE - 4);
+ char s;
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'c')//检查设备是否有效
+ {
+ if (CheckDevice()==0)
+ {
+ printf("设备已连接...\n");
+ }
+ else
+ {
+ printf("设备断开连接...\n");
+ device_is_found = FALSE;
+ Sleep(1000);
+ //goto find_device;
+ }
+ }
+ else if (s == 'h')
+ {
+ ShowHelp();
+ }
+ else if (s == 'a')
+ {
+ global_Show = 4;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s == 'M')
+ {
+ int _flag = 1;
+ float step = 0.005;
+ //clrscr();
+ //global_Show = 4;
+ while (_flag!=0)
+ {
+ printf(">>"); s = _getch(); printf("\n");
+ MVector3 tmppos = {0,0,0};
+ Quaternion qhmd = { 1, 0, 0, 0 };
+ if (s == 'b')
+ {
+ _flag = 0;
+ }
+ else if (s == ' ')
+ {
+ global_ctlposition[0] = 0;
+ global_ctlposition[1] = 0;
+ global_ctlposition[2] = 0;
+ }
+ else if (s == 'r')
+ {
+ CQHMD = {1,0,0,0};
+ CQGamePad = { 1, 0, 0, 0 };
+ }
+ else if (s == 'c')
+ {
+
+ if (p.IsOpen())
+ {
+ ovrSensorState ss = p.GetSensorData();
+ qhmd = { ss.Recorded.Pose.Orientation.w, 0, ss.Recorded.Pose.Orientation.y, 0 };
+ CQHMD = CorrectQuaterinonY(qhmd);
+ CQGamePad = QuaternionMulti(CorrectQuaterinonY(DM_GetPoseQuat()), qhmd);
+ printf("Success!\n");
+ }
+
+ }
+ else if ((s == 'w') || (s == 'W'))
+ {
+ tmppos = { 0, 0, -1 };//向前 -z方向
+ }
+ else if ((s == 's') || (s == 'S'))
+ {
+ tmppos = { 0, 0, 1 };//向后 z方向
+ }
+ else if ((s == 'a') || (s == 'A'))
+ {
+ tmppos = { 0, 0, -1 };//向左 -x方向
+ }
+ else if ((s == 'd') || (s == 'D'))
+ {
+ tmppos = { 0, 0, 1 };//向右 x方向
+ }
+ else if ((s == 'q') || (s == 'Q'))
+ {
+ global_ctlposition[1] -= step;
+ }
+ else if ((s == 'e') || (s == 'E'))
+ {
+ global_ctlposition[1] += step;
+ }
+ Quaternion cq;// = CorrectQuaterinonY(DM_GetQ());
+ if ((s == 'W') || (s == 'A') || (s == 'S') || (s == 'D'))
+ {
+ if (p.IsOpen())
+ {
+ ovrSensorState ss = p.GetSensorData();
+ qhmd = { ss.Recorded.Pose.Orientation.w, ss.Recorded.Pose.Orientation.x, ss.Recorded.Pose.Orientation.y, ss.Recorded.Pose.Orientation.z };
+ CQHMD = CorrectQuaterinonY(qhmd);
+ }
+ cq = CQHMD;
+ }
+ else if ((s == 'w') || (s == 'a') || (s == 's') || (s == 'd'))
+ {
+ cq = QuaternionMulti(CorrectQuaterinonY(DM_GetPoseQuat()), CQGamePad);
+ }
+
+ if ((s == 'a') || (s == 'd') || (s == 'A') || (s == 'D'))
+ {
+ cq = QuaternionMulti(cq, CreateQuaternion(-90, { 0, 1, 0 }));
+ }
+
+ Matrix3 rm3 = QuaternionToMatrix(cq);
+ MVector3 posv3 = ComputeRotate(rm3, tmppos);
+ global_ctlposition[2] += posv3.v[2] * step;
+ global_ctlposition[0] += posv3.v[0] * step;
+ printf("POS:%f %f %f\n", global_ctlposition[0], global_ctlposition[1], global_ctlposition[2]);
+ }
+ }
+ else if (s == 'o')//原始数据
+ {
+ system("cls");
+ global_Show = 5;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s=='l')
+ {
+ printf("\nLED 颜色设置\n");
+ printf("K - BLACK\n");
+ printf("W - WHITE\n");
+ printf("R - RED\n");
+ printf("G - GREEN\n");
+ printf("B - BLUE\n");
+ printf("C - CYAN\n");
+ printf("M - MAGENTA\n");
+ printf("Y - YELLOW\n");
+ printf("L - LOOP\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s=='L'||s=='l')
+ {
+ for (int i = 0; i < 8; i++)
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[i];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ Sleep(250);
+ }
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[5];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ }
+ else
+ {
+ char colorlist[8]{'K', 'W', 'R', 'G', 'B', 'C', 'M', 'Y'};
+ for (int i = 0; i < 8; i++)
+ {
+ if (colorlist[i] == s || colorlist[i] == (s - 32))//大小写
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[i];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("Color Set\n");
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ else
+ {
+ printf("FAILED\n");
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (s == 'g')
+ {
+ printf("\n上位机陀螺仪校准\n");
+ printf(" - s - 显示陀螺仪数据\n");
+ printf(" - - b - 返回\n");
+ printf(" - c - 校准数据\n");
+ printf(" - r - 重置为0\n");
+ printf(" - g - 获取当前陀螺仪计校准参数\n");
+ printf(" - b - 返回\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'c')
+ {
+ //printf("上位机校准尚未实现\n");
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 GYRO_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ GYRO_Cali_Last[3] = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, GYRO_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ float gyrodefault[3] = { 0.0f, 0.0f, 0.0f};
+ memcpy(offset_set_data, gyrodefault, sizeof(float) * 3);
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ global_Show = 1;
+ global_calibration_flag = 1;
+ while (global_calibration_flag == 1)//开始获取gyro数据
+ {
+
+ }
+ global_Show = 0;
+ Sleep(500);
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ float gyronew[3] = { -gx0,-gz0,-gy0 };//逆向坐标转换
+ memcpy(offset_set_data, gyronew, sizeof(float) * 3);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Set[i]);
+ }
+ printf("\n");
+ printf("SetGyroOffset\n");
+ }
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ //显示数据
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ }
+ else if (s == 'g')//获取陀螺仪零偏数据
+ {
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("GetGyro\n");
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+ }
+ printf("\n");
+ //显示数据
+ //float* f= (float*)(FEATURE_OFFSET_Get + 6);
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ",offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ else if (s=='r')
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ float gyronew[3] = { 0, 0, 0 };
+ memcpy(offset_set_data, gyronew, sizeof(float) * 3);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("ResetGyroOffset\n");
+ }
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ", offset_set_data[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 's')
+ {
+ global_Show = 1;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s == 'b')
+ {
+
+ }
+ }
+ else if (s == 't')
+ {
+ printf("\n下位机陀螺仪校准\n请静置头显 \n 按任意键开始校准陀螺仪\n");
+ printf(" - b - 取消校准\n");
+ printf(" - s - 显示陀螺仪数据\n");
+ printf(" - - b - 返回\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ printf("校准取消\n");
+ }
+ else if (s == 's')
+ {
+ global_Show = 1;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else
+ {
+ Sleep(1000);
+ UINT8 gyrocali[5] = { 0x08, 0x00, 0x00, 0x10, 0x26 };
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, gyrocali, 5))
+ {
+ printf("正在校准陀螺仪...请保持头盔静置!\n");
+ Sleep(5000);
+ printf("校准陀螺仪成功\n");
+ }
+ else
+ {
+ printf("校准陀螺仪失败\n");
+ }
+ }
+ }
+ else if (s == 'd')
+ {
+ printf("enter dfu\n");
+ UINT8 dfu[5] = { 0x08, 0x00, 0x00, 0x10, 0x25 };
+ HidD_SetFeature(DM_HID_Read_HANDLE, dfu, 5);
+ }
+ else if (s == 'i')
+ {
+ printf("chipid\n");
+ UINT8 chipid[15] = { 0x0A };
+ HidD_GetFeature(DM_HID_Read_HANDLE, chipid, 15);
+ for (int i = 0; i < 15; i++)
+ {
+ if(global_debug) printf("%2x ", chipid[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 'm')
+ {
+ printf("\n磁力校准\n");
+ printf(" - l - 计算2data.txt");
+ printf(" - r - 重置为默认值\n");
+ printf(" - g - 获取当前磁力计校准参数\n");
+ printf(" - s - 写入默认磁力计参数\n");
+ printf(" - c - 开始获取磁力计数据并写入data.txt\n");
+ printf(" - - f - 数据获取完成 需要输入新的校准参数\n");
+ printf(" - - c - 取消校准\n");
+ printf(" - - q - 退出校准\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s=='l')
+ {
+ GetMagDataFormFile();
+ }
+ else if (s == 's')
+ {
+ printf("setreport\n");
+ float magcali[6] = { -2.018673f, -2.303837f, 1.989453f, 4.899964f, 4.839235f, 5.541566f };
+ memcpy(offset_set_data, magcali, sizeof(float) * 6);
+
+
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Set[i]);
+ }
+ if (HidD_SetFeature(DM_HID_Read_HANDLE,FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("success\n");
+ }
+ }
+ else if (s == 'r')
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("ResetMagOffset\n");
+ }
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_set_data[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 'g')
+ {
+// printf("GetMag\n");
+//
+// for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+// {
+// if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+// }
+// printf("\nin float\n");
+// for (int i = 0; i < 6; i++)
+// {
+// printf("%f ", offset_get_data[i]);
+// }
+// printf("\n");
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+ }
+ printf("\nin float\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ else if (s == 'c')
+ {
+ global_calibration_flag = 3;
+ if (global_calibration_flag == 3)//MagConfig
+ {
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 MAG_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ MAG_Cali_Last[3] = FEATURE_OFFSET_GET_MAG;
+ //if (HidD_GetFeature(DM_HID_Read_HANDLE, MAG_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ *offset_set_dev= FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ //if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ remove("data.txt");
+ fopen_s(&fpdata, "data.txt", "w");//打开一个空文件以进行写入。如果该文件存在,其内容将被销毁。
+
+ if (fpdata != NULL)
+ {
+ global_Show = 3;
+ printf("文件初始化成功!\n");
+ //Sleep(100);
+
+ }
+ else
+ {
+ printf("文件初始化失败!\n");
+ global_calibration_flag = 0;
+ }
+ while (global_calibration_flag == 3)//开始获取Mag数据
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'f' || s == 'c' || s == 'q')//结束/取消/退出
+ {
+ break;
+ }
+ }
+ }
+ global_Show = 0;
+ }
+ global_calibration_flag = 0;
+ if (fpdata != NULL)
+ {
+ CancelIo(fpdata);
+ fclose(fpdata);
+ }
+
+ if (s == 'f')//Finished
+ {
+ printf("写入文件数据结束,等待计算参数后输入:\n");
+ char mag_str_tmp[20];
+ float mag_new_cali[6];
+ system("pause");
+ MagCaliParam magcalitmp = GetMagDataFormFile();
+ mag_new_cali[0] = magcalitmp.xOffset;
+ mag_new_cali[1] = magcalitmp.yOffset;
+ mag_new_cali[2] = magcalitmp.zOffset;
+ mag_new_cali[3] = magcalitmp.xScale;
+ mag_new_cali[4] = magcalitmp.yScale;
+ mag_new_cali[5] = magcalitmp.zScale;
+// for (int i = 0; i < 6; i++)
+// {
+// printf("输入第%d个参数:", i + 1);
+// std::cin >> mag_str_tmp;
+// mag_new_cali[i] = atof(mag_str_tmp);
+// }
+ memcpy(offset_set_data, mag_new_cali, sizeof(float) * 6);
+ }
+ else
+ {
+ if (s == 'c')
+ printf("校准取消");
+ memcpy(FEATURE_OFFSET_Set, MAG_Cali_Last, FEATURE_OFFSET_SIZE);
+ }
+ printf("\n");
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ if (s == 'c')
+ printf("参数写入成功\n");
+ }
+ //最后读取一遍
+ printf("Get\n");
+ Sleep(100);
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("当前校准参数:\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+
+ }
+ }
+
+
+ }
+ else if (s == 'p')
+ {
+
+ printf("管道服务器\n");
+ printf(" - r - 启动管道服务器\n");
+ printf(" - s - 关闭管道服务器\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'r')
+ {
+ if (global_pipeserver == 0)
+ {
+ global_pipeserver = 1;
+ printf("启动管道服务器.....\n");
+ start_thread(pipeservermain, NULL);
+ }
+ else
+ {
+ printf("管道服务器已经运行...\n");
+ }
+ }
+ else if (s == 's')
+ {
+ if (global_pipeserver == 0)
+ {
+ printf("管道服务器尚未开启...\n");
+ }
+ else
+ {
+ global_pipeserver = -1;
+ }
+ }
+
+ }
+ }
+
+
+
+
+ // else
+ // {
+ // printf("fp初始化失败!\n");
+ // printf("请检查exe同目录是否有MagCalibrate.txt...\n");
+ // getchar();
+ // return 0;
+ // }
+
+ printf("按任意按键开始校准...\n");
+ getchar();
+ printf("开始写入数据...\n");
+
+ while (1)
+ {
+
+ }
+
+
+
+}
+//win消息
+#include
+BOOL bIsRunning = TRUE;
+//transform
+#include
+#pragma region HID
+HDEVINFO device_info_set;
+
+SP_DEVICE_INTERFACE_DATA device_interface_data;
+HIDP_CAPS dematrix_device_capabilities;
+GUID HidGuid;
+BOOL InitPathFromInterfaceData(HDEVINFO hdevInfoSet, SP_DEVICE_INTERFACE_DATA* pidata)
+{
+ DWORD detailSize = 0;
+ BOOL Result;
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, NULL, (DWORD)NULL, &detailSize, NULL);
+
+ pData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(detailSize);
+ if (pData == NULL){
+ printf("内存不足!\n");
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ return FALSE;
+ }
+ pData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, pData, detailSize, NULL, NULL);
+ if (Result == TRUE)
+ {
+ //printf("Path = %s\n", (char *)(pData->DevicePath));
+ return TRUE;
+ }
+ return FALSE;
+}
+BOOL DM_HIDDeviceEnumerate(void)
+{
+
+ HDEVINFO hdevInfoSet;
+ SP_DEVICE_INTERFACE_DATA interfaceData;
+ int gamepadcount = 0;
+
+ int deviceIndex = 0;
+ interfaceData.cbSize = sizeof(interfaceData);
+
+ /* 先取得GUID */
+ HidD_GetHidGuid(&HidGuid);
+
+ hdevInfoSet = SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);
+
+ if (hdevInfoSet == INVALID_HANDLE_VALUE) return FALSE;
+
+ for (deviceIndex = 0;
+ SetupDiEnumDeviceInterfaces(hdevInfoSet, NULL, &HidGuid, deviceIndex, &interfaceData);
+ deviceIndex++)
+ {
+
+
+ if (!InitPathFromInterfaceData(hdevInfoSet, &interfaceData))
+ continue;
+ //printf("index = %d\n",deviceIndex);
+ string pathstr(pData->DevicePath);
+ transform(pathstr.begin(), pathstr.end(), pathstr.begin(), toupper);
+ std::size_t found = pathstr.find(strGlobalDevicePath);
+
+ if (found != std::string::npos)
+ {
+ // printf("Path = %s\n", pathstr.c_str());
+ sCurrent_Device_str = pathstr;
+ //printf("sCurrent_Device_str:\n %s\n", sCurrent_Device_str.c_str());
+ DM_HID_Read_HANDLE = CreateFileA((char *)(pData->DevicePath), (DWORD)GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
+ FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+ DM_HID_Write_HANDLE = CreateFileA((char *)(pData->DevicePath), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
+
+ if (DM_HID_Read_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ device_is_found = TRUE;
+ SetEvent(usb_read_over_lapped.hEvent);
+ printf("read打开设备成功!\n>>");
+ }
+ else
+ {
+ printf("read打开设备失败!\n>>");
+ }
+ if (DM_HID_Write_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ printf("write打开设备成功!\n>>");
+ }
+ else
+ {
+ printf("write打开设备失败!\n>>");
+ }
+
+ break;
+ }
+ else
+ continue;
+ }
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ if (device_is_found == TRUE)return TRUE;
+ else
+ return FALSE;
+}
+#pragma endregion
+#pragma region WindowsMessage
+
+HWND hMessageWindow;
+HDEVNOTIFY hDeviceNotify;
+
+bool MessageCallback(WORD messageType, const std::string& devicePath)
+{
+ bool rv = true;
+ if (messageType == DBT_DEVICEARRIVAL)
+ {
+
+ //rv = pNotificationClient->OnMessage(Notifier::DeviceAdded, devicePath);
+ if (!device_is_found)
+ {
+ printf("检测到新设备插入,正在初始化!\n>>");
+ DM_HIDDeviceEnumerate();
+ rv = device_is_found;
+ //TriggerHaptic(1, 50);
+ //TriggerHaptic(1, 100);
+ }
+ else
+ {
+ printf("检测到插入VID PID 相同的设备,但设备已经初始化!\n>>");
+ }
+ }
+ else if (messageType == DBT_DEVICEREMOVECOMPLETE)
+ {
+ //pNotificationClient->OnMessage(Notifier::DeviceRemoved, devicePath);
+ //printf("%s\n%s\n", devicePath.c_str(), sCurrent_Device_str.c_str());
+ if (device_is_found)
+ {
+ //found = devicePath.find(sCurrent_Device_str);
+ if (devicePath.find(sCurrent_Device_str) != std::string::npos)
+ {
+ ResetAHRS();
+ device_is_found = FALSE;
+ sCurrent_Device_str = "NULL";
+ if (DM_HID_Read_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(DM_HID_Read_HANDLE);
+ DM_HID_Read_HANDLE = INVALID_HANDLE_VALUE;
+ }
+ if (DM_HID_Write_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(DM_HID_Write_HANDLE);
+ DM_HID_Write_HANDLE = INVALID_HANDLE_VALUE;
+ }
+ printf("设备已拔出!\n>>");
+ }
+ else
+ {
+ printf("拔出了具有相同的vid pid但并不是已经打开的设备!\n>>");
+ }
+ }
+ }
+ else
+ {
+
+ }
+ return rv;
+}
+
+
+LRESULT CALLBACK WindowsMessageCallback(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_CREATE:
+ {
+ // Setup window user data with device status object pointer.
+ LPCREATESTRUCT create_struct = reinterpret_cast(lParam);
+ void *lpCreateParam = create_struct->lpCreateParams;
+ //DeviceStatus *pDeviceStatus = reinterpret_cast(lpCreateParam);
+ //printf("create\n");
+ bIsRunning = TRUE;
+ //SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast(pDeviceStatus));
+ }
+ return 0; // Return 0 for successfully handled WM_CREATE.
+
+ case WM_DEVICECHANGE:
+ {
+ WORD loword = LOWORD(wParam);
+
+ if (loword != DBT_DEVICEARRIVAL &&
+ loword != DBT_DEVICEREMOVECOMPLETE)
+ {
+ // Ignore messages other than device arrive and remove complete
+ // (we're not handling intermediate ones).
+ return TRUE; // Grant WM_DEVICECHANGE request.
+ }
+
+ DEV_BROADCAST_DEVICEINTERFACE* hdr;
+ hdr = (DEV_BROADCAST_DEVICEINTERFACE*)lParam;
+
+ if (hdr->dbcc_devicetype != DBT_DEVTYP_DEVICEINTERFACE)
+ {
+ // Ignore non interface device messages.
+ return TRUE; // Grant WM_DEVICECHANGE request.
+ }
+
+ //LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
+
+ //DeviceStatus* pDeviceStatus = (DeviceStatus*)userData;
+ string devicePath(hdr->dbcc_name);
+
+ if (/*pDeviceStatus->*/HidGuid == hdr->dbcc_classguid)
+ {
+ transform(devicePath.begin(), devicePath.end(), devicePath.begin(), toupper);
+ std::string str2(strGlobalDevicePath);
+ //printf("devicePath:%s\n", devicePath.c_str());
+ std::size_t found = devicePath.find(str2);
+ if (found != std::string::npos)
+ {
+ if (!MessageCallback(loword, devicePath))
+ {
+
+ }
+ break;
+ }
+ }
+ }
+ return TRUE; // Grant WM_DEVICECHANGE request.
+
+
+ case WM_CLOSE:
+ {
+ //LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ bIsRunning = FALSE;
+ DestroyWindow(hwnd);
+ }
+ return 0; // We processed the WM_CLOSE message.
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0; // We processed the WM_DESTROY message.
+ }
+
+ return DefWindowProc(hwnd, message, wParam, lParam);
+}
+
+
+bool WinProcInitialize()
+{
+ TCHAR special_name[] = TEXT("wnd_class_name_usbDMCali_JustFeng_2017");
+ WNDCLASS wndClass;
+ wndClass.style = CS_HREDRAW | CS_VREDRAW;
+ wndClass.lpfnWndProc = WindowsMessageCallback;
+ wndClass.cbClsExtra = 0;
+ wndClass.cbWndExtra = 0;
+ wndClass.hInstance = 0;
+ wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
+ wndClass.lpszMenuName = NULL;
+ wndClass.lpszClassName = special_name;
+
+ if (!RegisterClass(&wndClass))
+ {
+ printf("Failed to register window class.");
+ return false;
+ }
+
+ // We're going to create a 'message-only' window. This will be hidden, can't be enumerated etc.
+ // To do this we supply 'HWND_MESSAGE' as the hWndParent.
+ // http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
+ hMessageWindow = CreateWindow(special_name,
+ special_name,
+ WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ HWND_MESSAGE,
+ NULL,
+ 0,
+ NULL); // Pass this object via the CREATESTRUCT mechanism
+ // so that we can attach it to the window user data.
+
+ if (hMessageWindow == NULL)
+ {
+ printf("Failed to create window.");
+ return false;
+ }
+
+ // According to MS, topmost windows receive WM_DEVICECHANGE faster.
+ ::SetWindowPos(hMessageWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+ UpdateWindow(hMessageWindow);
+
+
+ // Register notification for additional HID messages.
+ HidD_GetHidGuid(&HidGuid);
+
+ DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
+
+ ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
+ notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+ notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+ //notificationFilter.dbcc_classguid = hidguid;
+
+ // We need DEVICE_NOTIFY_ALL_INTERFACE_CLASSES to detect
+ // HDMI plug/unplug events.
+ hDeviceNotify = RegisterDeviceNotification(
+ hMessageWindow,
+ ¬ificationFilter,
+ DEVICE_NOTIFY_ALL_INTERFACE_CLASSES | DEVICE_NOTIFY_WINDOW_HANDLE);
+
+ if (hDeviceNotify == NULL)
+ {
+ printf("Failed to register for device notifications.");
+ return false;
+ }
+
+ return true;
+}
+
+void ProcessMessages()
+{
+ //printf("MSG\n");
+ if (hMessageWindow == NULL)
+ printf("Need to call 'Initialize' before first use.");
+
+ MSG msg;
+
+ // Note WM_DEVICECHANGED messages are dispatched but not retrieved by PeekMessage.
+ // I think this is because they are pending, non-queued messages.
+ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+}
+
+#pragma endregion
+
+
+DWORD Thread_Win_MSG()
+{
+
+ if (!WinProcInitialize())
+ {
+ bIsRunning = FALSE;
+ }
+ while (bIsRunning)
+ {
+ Sleep(1);
+ ProcessMessages();
+
+ }
+ return 0;
+}
+
+
+
+#include "DMCaliAPI.h"
+
+
+
+ /* 控制器初始化函数 */
+ __declspec(dllexport) int Init(char* devpath)
+ {
+ USB_HID_Init();
+ strGlobalDevicePath = devpath;//"VID_2833&PID_0002";
+ globalpacklen = 64;
+ start_thread(Thread_Win_MSG, 0);
+ DM_HIDDeviceEnumerate();
+ return 1;
+ }
+
+
+ __declspec(dllexport) int CheckDevice(void)
+ {
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("设备已连接...\n");
+ }
+ else
+ {
+ printf("设备断开连接...\n");
+ device_is_found = FALSE;
+ }
+ return device_is_found?1:0;
+ }
+
+ __declspec(dllexport) int GyroCali(void)
+ {
+ if (device_is_found)
+ {
+ UINT8 gyrocali[5] = { 0x08, 0x00, 0x00, 0x10, 0x26 };
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, gyrocali, 5))
+ {
+ //printf("正在校准陀螺仪...请保持头盔静置!\n");
+ //Sleep(1000);
+ return 1;
+ //printf("校准陀螺仪成功\n");
+ }
+ }
+
+ return 0;
+
+
+ }
+ __declspec(dllexport) Vector3 GetGyroCali(void)
+ {
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ if (!device_is_found)
+ return v;
+
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+
+
+ *offset_set_dev = *offset_get_dev = 0;
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ memset(offset_set_data, 0, FEATURE_OFFSET_SIZE - 4);
+
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ v.x = offset_get_data[0];
+ v.y = offset_get_data[1];
+ v.z = offset_get_data[2];
+// for (int i = 0; i < 3; i++)
+// {
+// printf("%f ", offset_get_data[i]);
+//
+// }
+// return v;
+// printf("\n");
+ }
+ return v;
+ }
+
+ __declspec(dllexport) MagCaliParam GetMagCali()
+ {
+ MagCaliParam mcp;
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ mcp.xOffset = offset_get_data[0];
+ mcp.yOffset = offset_get_data[1];
+ mcp.zOffset = offset_get_data[2];
+ mcp.xScale = offset_get_data[3];
+ mcp.yScale = offset_get_data[4];
+ mcp.zScale = offset_get_data[5];
+
+ printf("当前校准参数:\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ return mcp;
+ }
+ __declspec(dllexport) int SetMagCali(float x, float y, float z, float x0, float y0, float z0)
+ {
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { x, y, z, x0, y0, z0 };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("SetMagOffset\n");
+ return 1;
+ }
+ return 0;
+ }
+ int Global_MagCali = 0;
+ __declspec(dllexport) int MagCali(void)
+ {
+ if (global_calibration_flag == 3)
+ {
+ return 0;
+ }
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ DWORD checkhandle;
+ global_calibration_flag = 3;
+ if (global_calibration_flag == 3)//MagConfig
+ {
+
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 MAG_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ MAG_Cali_Last[3] = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, MAG_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ // float magdefault[6] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
+ // memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ if (SetMagCali(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f))
+ //if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ //remove("data.txt");
+ //fopen_s(&fpdata, "data.txt", "w");//打开一个空文件以进行写入。如果该文件存在,其内容将被销毁。
+
+// if (fpdata != NULL)
+// {
+// global_Show = 3;
+// //printf("文件初始化成功!\n");
+// //Sleep(100);
+//
+// }
+// else
+// {
+// printf("文件初始化失败!\n");
+// global_calibration_flag = 0;
+// }
+ return 1;
+// while (global_calibration_flag == 3)//开始获取Mag数据
+// {
+// Sleep(1);
+// }
+ }
+ global_Show = 0;
+ }
+ global_calibration_flag = 0;
+// if (fpdata != NULL)
+// {
+// CancelIo(fpdata);
+// fclose(fpdata);
+// }
+ return 0;
+// if (false)//Finished
+// {
+// printf("写入文件数据结束,等待计算参数后输入:\n");
+// char mag_str_tmp[20];
+// float mag_new_cali[6];
+// system("pause");
+// MagCaliParam magcalitmp = GetMagDataFormFile();
+// mag_new_cali[0] = magcalitmp.xOffset;
+// mag_new_cali[1] = magcalitmp.yOffset;
+// mag_new_cali[2] = magcalitmp.zOffset;
+// mag_new_cali[3] = magcalitmp.xScale;
+// mag_new_cali[4] = magcalitmp.yScale;
+// mag_new_cali[5] = magcalitmp.zScale;
+//
+// memcpy(offset_set_data, mag_new_cali, sizeof(float) * 6);
+// }
+// else
+// {
+// if (s == 'c')
+// printf("校准取消");
+// memcpy(FEATURE_OFFSET_Set, MAG_Cali_Last, FEATURE_OFFSET_SIZE);
+// }
+// printf("\n");
+// *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+// if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+// {
+// if (s == 'c')
+// printf("参数写入成功\n");
+// }
+// //最后读取一遍
+// printf("Get\n");
+// Sleep(100);
+// *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+// HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+// *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+// if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+// {
+// printf("当前校准参数:\n");
+// for (int i = 0; i < 6; i++)
+// {
+// printf("%f ", offset_get_data[i]);
+// }
+// printf("\n");
+// }
+
+ }
+ }
+
+ __declspec(dllexport) int FinishMagCali(void)
+ {
+ global_calibration_flag = 0;
+ global_Show = 0;
+ return 1;
+ }
+ __declspec(dllexport) MagCaliParam CalculateMagParam()
+ {
+ return GetMagDataFormFile();
+ }
+ /* 获取左手信息 */
+ __declspec(dllexport) Vector3 GetPoint(void)
+ {
+ if (!device_is_found)
+ {
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ return v;
+ }
+ else
+ return DM_GetMag();
+ }
+ __declspec(dllexport) Vector3 GetEulerianAngle(void)
+ {
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ if (device_is_found)
+ {
+ v.z = DM_GetYaw();
+ v.x = DM_GetPitch();
+ v.y = DM_GetRoll();
+ }
+ return v;
+ }
+ __declspec(dllexport) int Correction(void)
+ {
+ return DM_Correct();
+ }
+ __declspec(dllexport) Quaternion GetQuaternion(void)
+ {
+ return DM_GetPoseQuat();
+ }
diff --git a/4.Software/GeekIMUDriver 1.0/Src/openvr_driver.h b/4.Software/GeekIMUDriver 1.0/Src/openvr_driver.h
new file mode 100644
index 0000000..ea7f8d1
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/openvr_driver.h
@@ -0,0 +1,1635 @@
+#pragma once
+
+// openvr_driver.h
+//========= Copyright Valve Corporation ============//
+// Dynamically generated file. Do not modify this file directly.
+
+#ifndef _OPENVR_DRIVER_API
+#define _OPENVR_DRIVER_API
+
+#include
+
+
+
+// vrtypes.h
+#ifndef _INCLUDE_VRTYPES_H
+#define _INCLUDE_VRTYPES_H
+
+namespace vr
+{
+
+#if defined(__linux__) || defined(__APPLE__)
+ // The 32-bit version of gcc has the alignment requirement for uint64 and double set to
+ // 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
+ // The 64-bit version of gcc has the alignment requirement for these types set to
+ // 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
+ // The 64-bit structure packing has to match the 32-bit structure packing for each platform.
+ #pragma pack( push, 4 )
+#else
+ #pragma pack( push, 8 )
+#endif
+
+typedef void* glSharedTextureHandle_t;
+typedef int32_t glInt_t;
+typedef uint32_t glUInt_t;
+
+// right-handed system
+// +y is up
+// +x is to the right
+// -z is going away from you
+// Distance unit is meters
+struct HmdMatrix34_t
+{
+ float m[3][4];
+};
+
+struct HmdMatrix44_t
+{
+ float m[4][4];
+};
+
+struct HmdVector3_t
+{
+ float v[3];
+};
+
+struct HmdVector4_t
+{
+ float v[4];
+};
+
+struct HmdVector3d_t
+{
+ double v[3];
+};
+
+struct HmdVector2_t
+{
+ float v[2];
+};
+
+struct HmdQuaternion_t
+{
+ double w, x, y, z;
+};
+
+struct HmdColor_t
+{
+ float r, g, b, a;
+};
+
+struct HmdQuad_t
+{
+ HmdVector3_t vCorners[ 4 ];
+};
+
+struct HmdRect2_t
+{
+ HmdVector2_t vTopLeft;
+ HmdVector2_t vBottomRight;
+};
+
+/** Used to return the post-distortion UVs for each color channel.
+* UVs range from 0 to 1 with 0,0 in the upper left corner of the
+* source render target. The 0,0 to 1,1 range covers a single eye. */
+struct DistortionCoordinates_t
+{
+ float rfRed[2];
+ float rfGreen[2];
+ float rfBlue[2];
+};
+
+enum EVREye
+{
+ Eye_Left = 0,
+ Eye_Right = 1
+};
+
+enum EGraphicsAPIConvention
+{
+ API_DirectX = 0, // Normalized Z goes from 0 at the viewer to 1 at the far clip plane
+ API_OpenGL = 1, // Normalized Z goes from 1 at the viewer to -1 at the far clip plane
+};
+
+enum EColorSpace
+{
+ ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants.
+ ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format).
+ ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm.
+};
+
+struct Texture_t
+{
+ void* handle; // Native d3d texture pointer or GL texture id.
+ EGraphicsAPIConvention eType;
+ EColorSpace eColorSpace;
+};
+
+enum ETrackingResult
+{
+ TrackingResult_Uninitialized = 1,
+
+ TrackingResult_Calibrating_InProgress = 100,
+ TrackingResult_Calibrating_OutOfRange = 101,
+
+ TrackingResult_Running_OK = 200,
+ TrackingResult_Running_OutOfRange = 201,
+};
+
+static const uint32_t k_unTrackingStringSize = 32;
+static const uint32_t k_unMaxDriverDebugResponseSize = 32768;
+
+/** Used to pass device IDs to API calls */
+typedef uint32_t TrackedDeviceIndex_t;
+static const uint32_t k_unTrackedDeviceIndex_Hmd = 0;
+static const uint32_t k_unMaxTrackedDeviceCount = 16;
+static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF;
+
+/** Describes what kind of object is being tracked at a given ID */
+enum ETrackedDeviceClass
+{
+ TrackedDeviceClass_Invalid = 0, // the ID was not valid.
+ TrackedDeviceClass_HMD = 1, // Head-Mounted Displays
+ TrackedDeviceClass_Controller = 2, // Tracked controllers
+ TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points
+
+ TrackedDeviceClass_Other = 1000,
+};
+
+
+/** Describes what specific role associated with a tracked device */
+enum ETrackedControllerRole
+{
+ TrackedControllerRole_Invalid = 0, // Invalid value for controller type
+ TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand
+ TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand
+};
+
+
+/** describes a single pose for a tracked object */
+struct TrackedDevicePose_t
+{
+ HmdMatrix34_t mDeviceToAbsoluteTracking;
+ HmdVector3_t vVelocity; // velocity in tracker space in m/s
+ HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?)
+ ETrackingResult eTrackingResult;
+ bool bPoseIsValid;
+
+ // This indicates that there is a device connected for this spot in the pose array.
+ // It could go from true to false if the user unplugs the device.
+ bool bDeviceIsConnected;
+};
+
+/** Identifies which style of tracking origin the application wants to use
+* for the poses it is requesting */
+enum ETrackingUniverseOrigin
+{
+ TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose
+ TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user
+ TrackingUniverseRawAndUncalibrated = 2, // Poses are provided in the coordinate system defined by the driver. You probably don't want this one.
+};
+
+
+/** Each entry in this enum represents a property that can be retrieved about a
+* tracked device. Many fields are only valid for one ETrackedDeviceClass. */
+enum ETrackedDeviceProperty
+{
+ // general properties that apply to all device classes
+ Prop_TrackingSystemName_String = 1000,
+ Prop_ModelNumber_String = 1001,
+ Prop_SerialNumber_String = 1002,
+ Prop_RenderModelName_String = 1003,
+ Prop_WillDriftInYaw_Bool = 1004,
+ Prop_ManufacturerName_String = 1005,
+ Prop_TrackingFirmwareVersion_String = 1006,
+ Prop_HardwareRevision_String = 1007,
+ Prop_AllWirelessDongleDescriptions_String = 1008,
+ Prop_ConnectedWirelessDongle_String = 1009,
+ Prop_DeviceIsWireless_Bool = 1010,
+ Prop_DeviceIsCharging_Bool = 1011,
+ Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full
+ Prop_StatusDisplayTransform_Matrix34 = 1013,
+ Prop_Firmware_UpdateAvailable_Bool = 1014,
+ Prop_Firmware_ManualUpdate_Bool = 1015,
+ Prop_Firmware_ManualUpdateURL_String = 1016,
+ Prop_HardwareRevision_Uint64 = 1017,
+ Prop_FirmwareVersion_Uint64 = 1018,
+ Prop_FPGAVersion_Uint64 = 1019,
+ Prop_VRCVersion_Uint64 = 1020,
+ Prop_RadioVersion_Uint64 = 1021,
+ Prop_DongleVersion_Uint64 = 1022,
+ Prop_BlockServerShutdown_Bool = 1023,
+ Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024,
+ Prop_ContainsProximitySensor_Bool = 1025,
+ Prop_DeviceProvidesBatteryStatus_Bool = 1026,
+ Prop_DeviceCanPowerOff_Bool = 1027,
+ Prop_Firmware_ProgrammingTarget_String = 1028,
+ Prop_DeviceClass_Int32 = 1029,
+ Prop_HasCamera_Bool = 1030,
+
+ // Properties that are unique to TrackedDeviceClass_HMD
+ Prop_ReportsTimeSinceVSync_Bool = 2000,
+ Prop_SecondsFromVsyncToPhotons_Float = 2001,
+ Prop_DisplayFrequency_Float = 2002,
+ Prop_UserIpdMeters_Float = 2003,
+ Prop_CurrentUniverseId_Uint64 = 2004,
+ Prop_PreviousUniverseId_Uint64 = 2005,
+ Prop_DisplayFirmwareVersion_Uint64 = 2006,
+ Prop_IsOnDesktop_Bool = 2007,
+ Prop_DisplayMCType_Int32 = 2008,
+ Prop_DisplayMCOffset_Float = 2009,
+ Prop_DisplayMCScale_Float = 2010,
+ Prop_EdidVendorID_Int32 = 2011,
+ Prop_DisplayMCImageLeft_String = 2012,
+ Prop_DisplayMCImageRight_String = 2013,
+ Prop_DisplayGCBlackClamp_Float = 2014,
+ Prop_EdidProductID_Int32 = 2015,
+ Prop_CameraToHeadTransform_Matrix34 = 2016,
+ Prop_DisplayGCType_Int32 = 2017,
+ Prop_DisplayGCOffset_Float = 2018,
+ Prop_DisplayGCScale_Float = 2019,
+ Prop_DisplayGCPrescale_Float = 2020,
+ Prop_DisplayGCImage_String = 2021,
+ Prop_LensCenterLeftU_Float = 2022,
+ Prop_LensCenterLeftV_Float = 2023,
+ Prop_LensCenterRightU_Float = 2024,
+ Prop_LensCenterRightV_Float = 2025,
+ Prop_UserHeadToEyeDepthMeters_Float = 2026,
+ Prop_CameraFirmwareVersion_Uint64 = 2027,
+ Prop_CameraFirmwareDescription_String = 2028,
+ Prop_DisplayFPGAVersion_Uint64 = 2029,
+ Prop_DisplayBootloaderVersion_Uint64 = 2030,
+ Prop_DisplayHardwareVersion_Uint64 = 2031,
+ Prop_AudioFirmwareVersion_Uint64 = 2032,
+ Prop_CameraCompatibilityMode_Int32 = 2033,
+
+ // Properties that are unique to TrackedDeviceClass_Controller
+ Prop_AttachedDeviceId_String = 3000,
+ Prop_SupportedButtons_Uint64 = 3001,
+ Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType
+ Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType
+ Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType
+ Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType
+ Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType
+
+ // Properties that are unique to TrackedDeviceClass_TrackingReference
+ Prop_FieldOfViewLeftDegrees_Float = 4000,
+ Prop_FieldOfViewRightDegrees_Float = 4001,
+ Prop_FieldOfViewTopDegrees_Float = 4002,
+ Prop_FieldOfViewBottomDegrees_Float = 4003,
+ Prop_TrackingRangeMinimumMeters_Float = 4004,
+ Prop_TrackingRangeMaximumMeters_Float = 4005,
+ Prop_ModeLabel_String = 4006,
+
+ // Vendors are free to expose private debug data in this reserved region
+ Prop_VendorSpecific_Reserved_Start = 10000,
+ Prop_VendorSpecific_Reserved_End = 10999,
+};
+
+/** No string property will ever be longer than this length */
+static const uint32_t k_unMaxPropertyStringSize = 32 * 1024;
+
+/** Used to return errors that occur when reading properties. */
+enum ETrackedPropertyError
+{
+ TrackedProp_Success = 0,
+ TrackedProp_WrongDataType = 1,
+ TrackedProp_WrongDeviceClass = 2,
+ TrackedProp_BufferTooSmall = 3,
+ TrackedProp_UnknownProperty = 4,
+ TrackedProp_InvalidDevice = 5,
+ TrackedProp_CouldNotContactServer = 6,
+ TrackedProp_ValueNotProvidedByDevice = 7,
+ TrackedProp_StringExceedsMaximumLength = 8,
+ TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later.
+};
+
+/** Allows the application to control what part of the provided texture will be used in the
+* frame buffer. */
+struct VRTextureBounds_t
+{
+ float uMin, vMin;
+ float uMax, vMax;
+};
+
+
+/** Allows the applicaiton to control how scene textures are used by the compositor when calling Submit. */
+enum EVRSubmitFlags
+{
+ // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied.
+ Submit_Default = 0x00,
+
+ // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear
+ // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by
+ // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit().
+ Submit_LensDistortionAlreadyApplied = 0x01,
+
+ // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag.
+ Submit_GlRenderBuffer = 0x02
+};
+
+
+/** Status of the overall system or tracked objects */
+enum EVRState
+{
+ VRState_Undefined = -1,
+ VRState_Off = 0,
+ VRState_Searching = 1,
+ VRState_Searching_Alert = 2,
+ VRState_Ready = 3,
+ VRState_Ready_Alert = 4,
+ VRState_NotReady = 5,
+};
+
+/** The types of events that could be posted (and what the parameters mean for each event type) */
+enum EVREventType
+{
+ VREvent_None = 0,
+
+ VREvent_TrackedDeviceActivated = 100,
+ VREvent_TrackedDeviceDeactivated = 101,
+ VREvent_TrackedDeviceUpdated = 102,
+ VREvent_TrackedDeviceUserInteractionStarted = 103,
+ VREvent_TrackedDeviceUserInteractionEnded = 104,
+ VREvent_IpdChanged = 105,
+ VREvent_EnterStandbyMode = 106,
+ VREvent_LeaveStandbyMode = 107,
+ VREvent_TrackedDeviceRoleChanged = 108,
+
+ VREvent_ButtonPress = 200, // data is controller
+ VREvent_ButtonUnpress = 201, // data is controller
+ VREvent_ButtonTouch = 202, // data is controller
+ VREvent_ButtonUntouch = 203, // data is controller
+
+ VREvent_MouseMove = 300, // data is mouse
+ VREvent_MouseButtonDown = 301, // data is mouse
+ VREvent_MouseButtonUp = 302, // data is mouse
+ VREvent_FocusEnter = 303, // data is overlay
+ VREvent_FocusLeave = 304, // data is overlay
+ VREvent_Scroll = 305, // data is mouse
+ VREvent_TouchPadMove = 306, // data is mouse
+
+ VREvent_InputFocusCaptured = 400, // data is process
+ VREvent_InputFocusReleased = 401, // data is process
+ VREvent_SceneFocusLost = 402, // data is process
+ VREvent_SceneFocusGained = 403, // data is process
+ VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor)
+ VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene
+
+ VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily
+ VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility
+
+ VREvent_OverlayShown = 500,
+ VREvent_OverlayHidden = 501,
+ VREvent_DashboardActivated = 502,
+ VREvent_DashboardDeactivated = 503,
+ VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay
+ VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay
+ VREvent_ResetDashboard = 506, // Send to the overlay manager
+ VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID
+ VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading
+ VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it
+ VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it
+ VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it
+ VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else
+ VREvent_OverlaySharedTextureChanged = 513,
+
+ VREvent_Notification_Shown = 600,
+ VREvent_Notification_Hidden = 601,
+ VREvent_Notification_BeginInteraction = 602,
+ VREvent_Notification_Destroyed = 603,
+
+ VREvent_Quit = 700, // data is process
+ VREvent_ProcessQuit = 701, // data is process
+ VREvent_QuitAborted_UserPrompt = 702, // data is process
+ VREvent_QuitAcknowledged = 703, // data is process
+
+ VREvent_ChaperoneDataHasChanged = 800,
+ VREvent_ChaperoneUniverseHasChanged = 801,
+ VREvent_ChaperoneTempDataHasChanged = 802,
+ VREvent_ChaperoneSettingsHaveChanged = 803,
+ VREvent_SeatedZeroPoseReset = 804,
+
+ VREvent_BackgroundSettingHasChanged = 850,
+ VREvent_CameraSettingsHaveChanged = 851,
+
+ VREvent_StatusUpdate = 900,
+
+ VREvent_MCImageUpdated = 1000,
+
+ VREvent_FirmwareUpdateStarted = 1100,
+ VREvent_FirmwareUpdateFinished = 1101,
+
+ VREvent_KeyboardClosed = 1200,
+ VREvent_KeyboardCharInput = 1201,
+ VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard
+
+ VREvent_ApplicationTransitionStarted = 1300,
+ VREvent_ApplicationTransitionAborted = 1301,
+ VREvent_ApplicationTransitionNewAppStarted = 1302,
+
+ VREvent_Compositor_MirrorWindowShown = 1400,
+ VREvent_Compositor_MirrorWindowHidden = 1401,
+ VREvent_Compositor_ChaperoneBoundsShown = 1410,
+ VREvent_Compositor_ChaperoneBoundsHidden = 1411,
+
+ VREvent_TrackedCamera_StartVideoStream = 1500,
+ VREvent_TrackedCamera_StopVideoStream = 1501,
+ VREvent_TrackedCamera_PauseVideoStream = 1502,
+ VREvent_TrackedCamera_ResumeVideoStream = 1503,
+
+ VREvent_PerformanceTest_EnableCapture = 1600,
+ VREvent_PerformanceTest_DisableCapture = 1601,
+ VREvent_PerformanceTest_FidelityLevel = 1602,
+
+ // Vendors are free to expose private events in this reserved region
+ VREvent_VendorSpecific_Reserved_Start = 10000,
+ VREvent_VendorSpecific_Reserved_End = 19999,
+};
+
+
+/** Level of Hmd activity */
+enum EDeviceActivityLevel
+{
+ k_EDeviceActivityLevel_Unknown = -1,
+ k_EDeviceActivityLevel_Idle = 0,
+ k_EDeviceActivityLevel_UserInteraction = 1,
+ k_EDeviceActivityLevel_UserInteraction_Timeout = 2,
+ k_EDeviceActivityLevel_Standby = 3,
+};
+
+
+/** VR controller button and axis IDs */
+enum EVRButtonId
+{
+ k_EButton_System = 0,
+ k_EButton_ApplicationMenu = 1,
+ k_EButton_Grip = 2,
+ k_EButton_DPad_Left = 3,
+ k_EButton_DPad_Up = 4,
+ k_EButton_DPad_Right = 5,
+ k_EButton_DPad_Down = 6,
+ k_EButton_A = 7,
+
+ k_EButton_Axis0 = 32,
+ k_EButton_Axis1 = 33,
+ k_EButton_Axis2 = 34,
+ k_EButton_Axis3 = 35,
+ k_EButton_Axis4 = 36,
+
+ // aliases for well known controllers
+ k_EButton_SteamVR_Touchpad = k_EButton_Axis0,
+ k_EButton_SteamVR_Trigger = k_EButton_Axis1,
+
+ k_EButton_Dashboard_Back = k_EButton_Grip,
+
+ k_EButton_Max = 64
+};
+
+inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; }
+
+/** used for controller button events */
+struct VREvent_Controller_t
+{
+ uint32_t button; // EVRButtonId enum
+};
+
+
+/** used for simulated mouse events in overlay space */
+enum EVRMouseButton
+{
+ VRMouseButton_Left = 0x0001,
+ VRMouseButton_Right = 0x0002,
+ VRMouseButton_Middle = 0x0004,
+};
+
+
+/** used for simulated mouse events in overlay space */
+struct VREvent_Mouse_t
+{
+ float x, y; // co-ords are in GL space, bottom left of the texture is 0,0
+ uint32_t button; // EVRMouseButton enum
+};
+
+/** used for simulated mouse wheel scroll in overlay space */
+struct VREvent_Scroll_t
+{
+ float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe
+ uint32_t repeatCount;
+};
+
+/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger
+ is on the touchpad (or just released from it)
+**/
+struct VREvent_TouchPadMove_t
+{
+ // true if the users finger is detected on the touch pad
+ bool bFingerDown;
+
+ // How long the finger has been down in seconds
+ float flSecondsFingerDown;
+
+ // These values indicate the starting finger position (so you can do some basic swipe stuff)
+ float fValueXFirst;
+ float fValueYFirst;
+
+ // This is the raw sampled coordinate without deadzoning
+ float fValueXRaw;
+ float fValueYRaw;
+};
+
+/** notification related events. Details will still change at this point */
+struct VREvent_Notification_t
+{
+ uint64_t ulUserValue;
+ uint32_t notificationId;
+};
+
+/** Used for events about processes */
+struct VREvent_Process_t
+{
+ uint32_t pid;
+ uint32_t oldPid;
+ bool bForced;
+};
+
+
+/** Used for a few events about overlays */
+struct VREvent_Overlay_t
+{
+ uint64_t overlayHandle;
+};
+
+
+/** Used for a few events about overlays */
+struct VREvent_Status_t
+{
+ uint32_t statusState; // EVRState enum
+};
+
+/** Used for keyboard events **/
+struct VREvent_Keyboard_t
+{
+ char cNewInput[8]; // Up to 11 bytes of new input
+ uint64_t uUserValue; // Possible flags about the new input
+};
+
+struct VREvent_Ipd_t
+{
+ float ipdMeters;
+};
+
+struct VREvent_Chaperone_t
+{
+ uint64_t m_nPreviousUniverse;
+ uint64_t m_nCurrentUniverse;
+};
+
+/** Not actually used for any events */
+struct VREvent_Reserved_t
+{
+ uint64_t reserved0;
+ uint64_t reserved1;
+};
+
+struct VREvent_PerformanceTest_t
+{
+ uint32_t m_nFidelityLevel;
+};
+
+struct VREvent_SeatedZeroPoseReset_t
+{
+ bool bResetBySystemMenu;
+};
+
+/** If you change this you must manually update openvr_interop.cs.py */
+typedef union
+{
+ VREvent_Reserved_t reserved;
+ VREvent_Controller_t controller;
+ VREvent_Mouse_t mouse;
+ VREvent_Scroll_t scroll;
+ VREvent_Process_t process;
+ VREvent_Notification_t notification;
+ VREvent_Overlay_t overlay;
+ VREvent_Status_t status;
+ VREvent_Keyboard_t keyboard;
+ VREvent_Ipd_t ipd;
+ VREvent_Chaperone_t chaperone;
+ VREvent_PerformanceTest_t performanceTest;
+ VREvent_TouchPadMove_t touchPadMove;
+ VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset;
+} VREvent_Data_t;
+
+/** An event posted by the server to all running applications */
+struct VREvent_t
+{
+ uint32_t eventType; // EVREventType enum
+ TrackedDeviceIndex_t trackedDeviceIndex;
+ float eventAgeSeconds;
+ // event data must be the end of the struct as its size is variable
+ VREvent_Data_t data;
+};
+
+
+/** The mesh to draw into the stencil (or depth) buffer to perform
+* early stencil (or depth) kills of pixels that will never appear on the HMD.
+* This mesh draws on all the pixels that will be hidden after distortion.
+*
+* If the HMD does not provide a visible area mesh pVertexData will be
+* NULL and unTriangleCount will be 0. */
+struct HiddenAreaMesh_t
+{
+ const HmdVector2_t *pVertexData;
+ uint32_t unTriangleCount;
+};
+
+
+/** Identifies what kind of axis is on the controller at index n. Read this type
+* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n );
+*/
+enum EVRControllerAxisType
+{
+ k_eControllerAxis_None = 0,
+ k_eControllerAxis_TrackPad = 1,
+ k_eControllerAxis_Joystick = 2,
+ k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis
+};
+
+
+/** contains information about one axis on the controller */
+struct VRControllerAxis_t
+{
+ float x; // Ranges from -1.0 to 1.0 for joysticks and track pads. Ranges from 0.0 to 1.0 for triggers were 0 is fully released.
+ float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers.
+};
+
+
+/** the number of axes in the controller state */
+static const uint32_t k_unControllerStateAxisCount = 5;
+
+
+/** Holds all the state of a controller at one moment in time. */
+struct VRControllerState001_t
+{
+ // If packet num matches that on your prior call, then the controller state hasn't been changed since
+ // your last call and there is no need to process it
+ uint32_t unPacketNum;
+
+ // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask
+ uint64_t ulButtonPressed;
+ uint64_t ulButtonTouched;
+
+ // Axis data for the controller's analog inputs
+ VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ];
+};
+
+
+typedef VRControllerState001_t VRControllerState_t;
+
+
+/** determines how to provide output to the application of various event processing functions. */
+enum EVRControllerEventOutputType
+{
+ ControllerEventOutput_OSEvents = 0,
+ ControllerEventOutput_VREvents = 1,
+};
+
+
+
+/** Collision Bounds Style */
+enum ECollisionBoundsStyle
+{
+ COLLISION_BOUNDS_STYLE_BEGINNER = 0,
+ COLLISION_BOUNDS_STYLE_INTERMEDIATE,
+ COLLISION_BOUNDS_STYLE_SQUARES,
+ COLLISION_BOUNDS_STYLE_ADVANCED,
+ COLLISION_BOUNDS_STYLE_NONE,
+
+ COLLISION_BOUNDS_STYLE_COUNT
+};
+
+/** Allows the application to customize how the overlay appears in the compositor */
+struct Compositor_OverlaySettings
+{
+ uint32_t size; // sizeof(Compositor_OverlaySettings)
+ bool curved, antialias;
+ float scale, distance, alpha;
+ float uOffset, vOffset, uScale, vScale;
+ float gridDivs, gridWidth, gridScale;
+ HmdMatrix44_t transform;
+};
+
+/** used to refer to a single VR overlay */
+typedef uint64_t VROverlayHandle_t;
+
+static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0;
+
+/** Errors that can occur around VR overlays */
+enum EVROverlayError
+{
+ VROverlayError_None = 0,
+
+ VROverlayError_UnknownOverlay = 10,
+ VROverlayError_InvalidHandle = 11,
+ VROverlayError_PermissionDenied = 12,
+ VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist
+ VROverlayError_WrongVisibilityType = 14,
+ VROverlayError_KeyTooLong = 15,
+ VROverlayError_NameTooLong = 16,
+ VROverlayError_KeyInUse = 17,
+ VROverlayError_WrongTransformType = 18,
+ VROverlayError_InvalidTrackedDevice = 19,
+ VROverlayError_InvalidParameter = 20,
+ VROverlayError_ThumbnailCantBeDestroyed = 21,
+ VROverlayError_ArrayTooSmall = 22,
+ VROverlayError_RequestFailed = 23,
+ VROverlayError_InvalidTexture = 24,
+ VROverlayError_UnableToLoadFile = 25,
+ VROVerlayError_KeyboardAlreadyInUse = 26,
+ VROverlayError_NoNeighbor = 27,
+};
+
+/** enum values to pass in to VR_Init to identify whether the application will
+* draw a 3D scene. */
+enum EVRApplicationType
+{
+ VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries
+ VRApplication_Scene = 1, // Application will submit 3D frames
+ VRApplication_Overlay = 2, // Application only interacts with overlays
+ VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not
+ // keep it running if everything else quits.
+ VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility
+ // interfaces (like IVRSettings and IVRApplications) but not hardware.
+};
+
+
+/** error codes for firmware */
+enum EVRFirmwareError
+{
+ VRFirmwareError_None = 0,
+ VRFirmwareError_Success = 1,
+ VRFirmwareError_Fail = 2,
+};
+
+
+/** error codes for notifications */
+enum EVRNotificationError
+{
+ VRNotificationError_OK = 0,
+ VRNotificationError_InvalidNotificationId = 100,
+ VRNotificationError_NotificationQueueFull = 101,
+ VRNotificationError_InvalidOverlayHandle = 102,
+};
+
+
+/** error codes returned by Vr_Init */
+
+// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp
+enum EVRInitError
+{
+ VRInitError_None = 0,
+ VRInitError_Unknown = 1,
+
+ VRInitError_Init_InstallationNotFound = 100,
+ VRInitError_Init_InstallationCorrupt = 101,
+ VRInitError_Init_VRClientDLLNotFound = 102,
+ VRInitError_Init_FileNotFound = 103,
+ VRInitError_Init_FactoryNotFound = 104,
+ VRInitError_Init_InterfaceNotFound = 105,
+ VRInitError_Init_InvalidInterface = 106,
+ VRInitError_Init_UserConfigDirectoryInvalid = 107,
+ VRInitError_Init_HmdNotFound = 108,
+ VRInitError_Init_NotInitialized = 109,
+ VRInitError_Init_PathRegistryNotFound = 110,
+ VRInitError_Init_NoConfigPath = 111,
+ VRInitError_Init_NoLogPath = 112,
+ VRInitError_Init_PathRegistryNotWritable = 113,
+ VRInitError_Init_AppInfoInitFailed = 114,
+ VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver
+ VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup
+ VRInitError_Init_AnotherAppLaunching = 117,
+ VRInitError_Init_SettingsInitFailed = 118,
+ VRInitError_Init_ShuttingDown = 119,
+ VRInitError_Init_TooManyObjects = 120,
+ VRInitError_Init_NoServerForBackgroundApp = 121,
+ VRInitError_Init_NotSupportedWithCompositor = 122,
+ VRInitError_Init_NotAvailableToUtilityApps = 123,
+
+ VRInitError_Driver_Failed = 200,
+ VRInitError_Driver_Unknown = 201,
+ VRInitError_Driver_HmdUnknown = 202,
+ VRInitError_Driver_NotLoaded = 203,
+ VRInitError_Driver_RuntimeOutOfDate = 204,
+ VRInitError_Driver_HmdInUse = 205,
+ VRInitError_Driver_NotCalibrated = 206,
+ VRInitError_Driver_CalibrationInvalid = 207,
+ VRInitError_Driver_HmdDisplayNotFound = 208,
+
+ VRInitError_IPC_ServerInitFailed = 300,
+ VRInitError_IPC_ConnectFailed = 301,
+ VRInitError_IPC_SharedStateInitFailed = 302,
+ VRInitError_IPC_CompositorInitFailed = 303,
+ VRInitError_IPC_MutexInitFailed = 304,
+ VRInitError_IPC_Failed = 305,
+
+ VRInitError_Compositor_Failed = 400,
+ VRInitError_Compositor_D3D11HardwareRequired = 401,
+
+ VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000,
+
+ VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101,
+ VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102,
+ VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103,
+ VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104,
+ VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105,
+ VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106,
+ VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107,
+ VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108,
+ VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109,
+ VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110,
+ VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111,
+ VRInitError_VendorSpecific_HmdFound_UserDataError = 1112,
+ VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113,
+
+ VRInitError_Steam_SteamInstallationNotFound = 2000,
+
+};
+
+#pragma pack( pop )
+
+// figure out how to import from the VR API dll
+#if defined(_WIN32)
+
+#ifdef VR_API_EXPORT
+#define VR_INTERFACE extern "C" __declspec( dllexport )
+#else
+#define VR_INTERFACE extern "C" __declspec( dllimport )
+#endif
+
+#elif defined(GNUC) || defined(COMPILER_GCC) || defined(__APPLE__)
+
+#ifdef VR_API_EXPORT
+#define VR_INTERFACE extern "C" __attribute__((visibility("default")))
+#else
+#define VR_INTERFACE extern "C"
+#endif
+
+#else
+#error "Unsupported Platform."
+#endif
+
+
+#if defined( _WIN32 )
+#define VR_CALLTYPE __cdecl
+#else
+#define VR_CALLTYPE
+#endif
+
+}
+
+#endif // _INCLUDE_VRTYPES_H
+
+
+// vrtrackedcameratypes.h
+#ifndef _VRTRACKEDCAMERATYPES_H
+#define _VRTRACKEDCAMERATYPES_H
+
+namespace vr
+{
+
+#if defined(__linux__) || defined(__APPLE__)
+ // The 32-bit version of gcc has the alignment requirement for uint64 and double set to
+ // 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
+ // The 64-bit version of gcc has the alignment requirement for these types set to
+ // 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
+ // The 64-bit structure packing has to match the 32-bit structure packing for each platform.
+ #pragma pack( push, 4 )
+#else
+ #pragma pack( push, 8 )
+#endif
+
+enum ECameraVideoStreamFormat
+{
+ CVS_FORMAT_UNKNOWN = 0,
+ CVS_FORMAT_RAW10 = 1, // 10 bits per pixel
+ CVS_FORMAT_NV12 = 2, // 12 bits per pixel
+ CVS_FORMAT_RGB24 = 3, // 24 bits per pixel
+ CVS_MAX_FORMATS
+};
+
+enum ECameraCompatibilityMode
+{
+ CAMERA_COMPAT_MODE_BULK_DEFAULT = 0,
+ CAMERA_COMPAT_MODE_BULK_64K_DMA,
+ CAMERA_COMPAT_MODE_BULK_16K_DMA,
+ CAMERA_COMPAT_MODE_BULK_8K_DMA,
+ CAMERA_COMPAT_MODE_ISO_52FPS,
+ CAMERA_COMPAT_MODE_ISO_50FPS,
+ CAMERA_COMPAT_MODE_ISO_48FPS,
+ CAMERA_COMPAT_MODE_ISO_46FPS,
+ CAMERA_COMPAT_MODE_ISO_44FPS,
+ CAMERA_COMPAT_MODE_ISO_42FPS,
+ CAMERA_COMPAT_MODE_ISO_40FPS,
+ CAMERA_COMPAT_MODE_ISO_35FPS,
+ CAMERA_COMPAT_MODE_ISO_30FPS,
+ MAX_CAMERA_COMPAT_MODES
+};
+
+#ifdef _MSC_VER
+#define VR_CAMERA_DECL_ALIGN( x ) __declspec( align( x ) )
+#else
+#define VR_CAMERA_DECL_ALIGN( x ) //
+#endif
+
+VR_CAMERA_DECL_ALIGN( 8 ) struct CameraVideoStreamFrame_t
+{
+ ECameraVideoStreamFormat m_nStreamFormat;
+
+ uint32_t m_nWidth;
+ uint32_t m_nHeight;
+
+ uint32_t m_nImageDataSize; // Based on stream format, width, height
+
+ uint32_t m_nFrameSequence; // Starts from 0 when stream starts.
+
+ uint32_t m_nBufferIndex; // Identifies which buffer the image data is hosted
+ uint32_t m_nBufferCount; // Total number of configured buffers
+
+ uint32_t m_nExposureTime;
+
+ uint32_t m_nISPFrameTimeStamp; // Driver provided time stamp per driver centric time base
+ uint32_t m_nISPReferenceTimeStamp;
+ uint32_t m_nSyncCounter;
+
+ uint32_t m_nCamSyncEvents;
+ double m_flReferenceCamSyncTime;
+
+ double m_flFrameElapsedTime; // Starts from 0 when stream starts. In seconds.
+ double m_flFrameDeliveryRate;
+
+ double m_flFrameCaptureTime_DriverAbsolute; // In USB time, via AuxEvent
+ double m_flFrameCaptureTime_ServerRelative; // In System time within the server
+ uint64_t m_nFrameCaptureTicks_ServerAbsolute; // In system ticks within the server
+ double m_flFrameCaptureTime_ClientRelative; // At the client, relative to when the frame was exposed/captured.
+
+ bool m_bPoseIsValid; // Supplied by HMD layer when used as a tracked camera
+ vr::HmdMatrix34_t m_matDeviceToAbsoluteTracking;
+
+ float m_Pad[4];
+
+ void *m_pImageData;
+};
+
+#pragma pack( pop )
+
+}
+
+#endif // _VRTRACKEDCAMERATYPES_H
+// ivrsettings.h
+namespace vr
+{
+ enum EVRSettingsError
+ {
+ VRSettingsError_None = 0,
+ VRSettingsError_IPCFailed = 1,
+ VRSettingsError_WriteFailed = 2,
+ VRSettingsError_ReadFailed = 3,
+ };
+
+ // The maximum length of a settings key
+ static const uint32_t k_unMaxSettingsKeyLength = 128;
+
+ class IVRSettings
+ {
+ public:
+ virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0;
+
+ // Returns true if file sync occurred (force or settings dirty)
+ virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0;
+
+ virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, bool bDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, float flDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void GetString( const char *pchSection, const char *pchSettingsKey, char *pchValue, uint32_t unValueLen, const char *pchDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0;
+
+ virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0;
+ };
+
+ //-----------------------------------------------------------------------------
+ // steamvr keys
+
+ static const char * const k_pch_SteamVR_Section = "steamvr";
+ static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd";
+ static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
+ static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
+ static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug";
+ static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe";
+ static const char * const k_pch_SteamVR_EnableDistortion_Bool = "enableDistortion";
+ static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX";
+ static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY";
+ static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps";
+ static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel";
+ static const char * const k_pch_SteamVR_IPD_Float = "ipd";
+ static const char * const k_pch_SteamVR_Background_String = "background";
+ static const char * const k_pch_SteamVR_GridColor_String = "gridColor";
+ static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
+ static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
+ static const char * const k_pch_SteamVR_PowerOffOnExit_Bool = "powerOffOnExit";
+ static const char * const k_pch_SteamVR_StandbyAppRunningTimeout_Float = "standbyAppRunningTimeout";
+ static const char * const k_pch_SteamVR_StandbyNoAppTimeout_Float = "standbyNoAppTimeout";
+ static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode";
+ static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid";
+ static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid";
+ static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers";
+ static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees";
+ static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement";
+ static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses";
+
+ //-----------------------------------------------------------------------------
+ // lighthouse keys
+
+ static const char * const k_pch_Lighthouse_Section = "driver_lighthouse";
+ static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu";
+ static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation";
+ static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug";
+
+ static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation";
+ static const char * const k_pch_Lighthouse_LighthouseName_String = "lighthousename";
+ static const char * const k_pch_Lighthouse_MaxIncidenceAngleDegrees_Float = "maxincidenceangledegrees";
+ static const char * const k_pch_Lighthouse_UseLighthouseDirect_Bool = "uselighthousedirect";
+ static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory";
+ static const char * const k_pch_Lighthouse_OriginOffsetX_Float = "originoffsetx";
+ static const char * const k_pch_Lighthouse_OriginOffsetY_Float = "originoffsety";
+ static const char * const k_pch_Lighthouse_OriginOffsetZ_Float = "originoffsetz";
+ static const char * const k_pch_Lighthouse_HeadingOffset_Float = "headingoffset";
+
+ //-----------------------------------------------------------------------------
+ // null keys
+
+ static const char * const k_pch_Null_Section = "driver_null";
+ static const char * const k_pch_Null_EnableNullDriver_Bool = "enable";
+ static const char * const k_pch_Null_SerialNumber_String = "serialNumber";
+ static const char * const k_pch_Null_ModelNumber_String = "modelNumber";
+ static const char * const k_pch_Null_WindowX_Int32 = "windowX";
+ static const char * const k_pch_Null_WindowY_Int32 = "windowY";
+ static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth";
+ static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight";
+ static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth";
+ static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight";
+ static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons";
+ static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency";
+
+ //-----------------------------------------------------------------------------
+ // user interface keys
+ static const char * const k_pch_UserInterface_Section = "userinterface";
+ static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop";
+
+ //-----------------------------------------------------------------------------
+ // notification keys
+ static const char * const k_pch_Notifications_Section = "notifications";
+ static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb";
+
+ //-----------------------------------------------------------------------------
+ // keyboard keys
+ static const char * const k_pch_Keyboard_Section = "keyboard";
+ static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions";
+
+ //-----------------------------------------------------------------------------
+ // perf keys
+ static const char * const k_pch_Perf_Section = "perfcheck";
+ static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive";
+ static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD";
+ static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce";
+ static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore";
+ static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit";
+ static const char * const k_pch_Perf_TestData_Float = "perfTestData";
+
+ //-----------------------------------------------------------------------------
+ // camera keys
+ static const char * const k_pch_Camera_Section = "camera";
+
+ //-----------------------------------------------------------------------------
+
+ static const char * const IVRSettings_Version = "IVRSettings_001";
+
+ //-----------------------------------------------------------------------------
+ // audio keys
+ static const char * const k_pch_audio_Section = "audio";
+ static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice";
+ static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice";
+ static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice";
+ static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice";
+ static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain";
+} // namespace vr
+
+// iservertrackeddevicedriver.h
+namespace vr
+{
+
+
+struct DriverPoseQuaternion_t
+{
+ double w, x, y, z;
+};
+
+struct DriverPose_t
+{
+ /* Time offset of this pose, in seconds from the actual time of the pose,
+ * relative to the time of the PoseUpdated() call made by the driver.
+ */
+ double poseTimeOffset;
+
+ /* Generally, the pose maintained by a driver
+ * is in an inertial coordinate system different
+ * from the world system of x+ right, y+ up, z+ back.
+ * Also, the driver is not usually tracking the "head" position,
+ * but instead an internal IMU or another reference point in the HMD.
+ * The following two transforms transform positions and orientations
+ * to app world space from driver world space,
+ * and to HMD head space from driver local body space.
+ *
+ * We maintain the driver pose state in its internal coordinate system,
+ * so we can do the pose prediction math without having to
+ * use angular acceleration. A driver's angular acceleration is generally not measured,
+ * and is instead calculated from successive samples of angular velocity.
+ * This leads to a noisy angular acceleration values, which are also
+ * lagged due to the filtering required to reduce noise to an acceptable level.
+ */
+ vr::HmdQuaternion_t qWorldFromDriverRotation;
+ double vecWorldFromDriverTranslation[ 3 ];
+
+ vr::HmdQuaternion_t qDriverFromHeadRotation;
+ double vecDriverFromHeadTranslation[ 3 ];
+
+ /* State of driver pose, in meters and radians. */
+ /* Position of the driver tracking reference in driver world space
+ * +[0] (x) is right
+ * +[1] (y) is up
+ * -[2] (z) is forward
+ */
+ double vecPosition[ 3 ];
+
+ /* Velocity of the pose in meters/second */
+ double vecVelocity[ 3 ];
+
+ /* Acceleration of the pose in meters/second */
+ double vecAcceleration[ 3 ];
+
+ /* Orientation of the tracker, represented as a quaternion */
+ vr::HmdQuaternion_t qRotation;
+
+ /* Angular velocity of the pose in axis-angle
+ * representation. The direction is the angle of
+ * rotation and the magnitude is the angle around
+ * that axis in radians/second. */
+ double vecAngularVelocity[ 3 ];
+
+ /* Angular acceleration of the pose in axis-angle
+ * representation. The direction is the angle of
+ * rotation and the magnitude is the angle around
+ * that axis in radians/second^2. */
+ double vecAngularAcceleration[ 3 ];
+
+ ETrackingResult result;
+
+ bool poseIsValid;
+ bool willDriftInYaw;
+ bool shouldApplyHeadModel;
+ bool deviceIsConnected;
+};
+
+
+// ----------------------------------------------------------------------------------------------
+// Purpose: Represents a single tracked device in a driver
+// ----------------------------------------------------------------------------------------------
+class ITrackedDeviceServerDriver
+{
+public:
+
+ // ------------------------------------
+ // Management Methods
+ // ------------------------------------
+ /** This is called before an HMD is returned to the application. It will always be
+ * called before any display or tracking methods. Memory and processor use by the
+ * ITrackedDeviceServerDriver object should be kept to a minimum until it is activated.
+ * The pose listener is guaranteed to be valid until Deactivate is called, but
+ * should not be used after that point. */
+ virtual EVRInitError Activate( uint32_t unObjectId ) = 0;
+
+ /** This is called when The VR system is switching from this Hmd being the active display
+ * to another Hmd being the active display. The driver should clean whatever memory
+ * and thread use it can when it is deactivated */
+ virtual void Deactivate() = 0;
+
+ /** Handles a request from the system to power off this device */
+ virtual void PowerOff() = 0;
+
+ /** Requests a component interface of the driver for device-specific functionality. The driver should return NULL
+ * if the requested interface or version is not supported. */
+ virtual void *GetComponent( const char *pchComponentNameAndVersion ) = 0;
+
+ /** A VR Client has made this debug request of the driver. The set of valid requests is entirely
+ * up to the driver and the client to figure out, as is the format of the response. Responses that
+ * exceed the length of the supplied buffer should be truncated and null terminated */
+ virtual void DebugRequest( const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0;
+
+ // ------------------------------------
+ // Tracking Methods
+ // ------------------------------------
+ virtual DriverPose_t GetPose() = 0;
+
+ // ------------------------------------
+ // Property Methods
+ // ------------------------------------
+
+ /** Returns a bool property. If the property is not available this function will return false. */
+ virtual bool GetBoolTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a float property. If the property is not available this function will return 0. */
+ virtual float GetFloatTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns an int property. If the property is not available this function will return 0. */
+ virtual int32_t GetInt32TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a uint64 property. If the property is not available this function will return 0. */
+ virtual uint64_t GetUint64TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */
+ virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a string property. If the property is not available this function will return 0 and pError will be
+ * set to an error. Otherwise it returns the length of the number of bytes necessary to hold this string including
+ * the trailing null. If the buffer is too small the error will be TrackedProp_BufferTooSmall. Strings will
+ * generally fit in buffers of k_unTrackingStringSize characters. Drivers may not return strings longer than
+ * k_unMaxPropertyStringSize. */
+ virtual uint32_t GetStringTrackedDeviceProperty( ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError ) = 0;
+
+};
+
+
+
+static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_004";
+
+}
+// ivrdisplaycomponent.h
+namespace vr
+{
+
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: The display component on a single tracked device
+ // ----------------------------------------------------------------------------------------------
+ class IVRDisplayComponent
+ {
+ public:
+
+ // ------------------------------------
+ // Display Methods
+ // ------------------------------------
+
+ /** Size and position that the window needs to be on the VR display. */
+ virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** Returns true if the display is extending the desktop. */
+ virtual bool IsDisplayOnDesktop( ) = 0;
+
+ /** Returns true if the display is real and not a fictional display. */
+ virtual bool IsDisplayRealDisplay( ) = 0;
+
+ /** Suggested size for the intermediate render target that the distortion pulls from. */
+ virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** Gets the viewport in the frame buffer to draw the output of the distortion into */
+ virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** The components necessary to build your own projection matrix in case your
+ * application is doing something fancy like infinite Z */
+ virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0;
+
+ /** Returns the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in
+ * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. */
+ virtual DistortionCoordinates_t ComputeDistortion( EVREye eEye, float fU, float fV ) = 0;
+
+ // -----------------------------------
+ // Direct mode methods
+ // -----------------------------------
+
+ /** Specific to Oculus compositor support, textures supplied must be created using this method. */
+ virtual void CreateSwapTextureSet( uint32_t unPid, uint32_t unFormat, uint32_t unWidth, uint32_t unHeight, void *(*pSharedTextureHandles)[2] ) {}
+
+ /** Used to textures created using CreateSwapTextureSet. Only one of the set's handles needs to be used to destroy the entire set. */
+ virtual void DestroySwapTextureSet( void *pSharedTextureHandle ) {}
+
+ /** Used to purge all texture sets for a given process. */
+ virtual void DestroyAllSwapTextureSets( uint32_t unPid ) {}
+
+ /** Call once per layer to draw for this frame. One shared texture handle per eye. Textures must be created
+ * using CreateSwapTextureSet and should be alternated per frame. Call Present once all layers have been submitted. */
+ virtual void SubmitLayer( void *pSharedTextureHandles[ 2 ], const vr::VRTextureBounds_t( &bounds )[ 2 ], const vr::HmdMatrix34_t *pPose ) {}
+
+ /** Submits queued layers for display. */
+ virtual void Present( void *hSyncTexture ) {}
+
+ };
+
+ static const char *IVRDisplayComponent_Version = "IVRDisplayComponent_001";
+
+}
+
+// ivrcontrollercomponent.h
+namespace vr
+{
+
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: Controller access on a single tracked device.
+ // ----------------------------------------------------------------------------------------------
+ class IVRControllerComponent
+ {
+ public:
+
+ // ------------------------------------
+ // Controller Methods
+ // ------------------------------------
+
+ /** Gets the current state of a controller. */
+ virtual VRControllerState_t GetControllerState( ) = 0;
+
+ /** Returns a uint64 property. If the property is not available this function will return 0. */
+ virtual bool TriggerHapticPulse( uint32_t unAxisId, uint16_t usPulseDurationMicroseconds ) = 0;
+
+ };
+
+
+
+ static const char *IVRControllerComponent_Version = "IVRControllerComponent_001";
+
+}
+// ivrcameracomponent.h
+namespace vr
+{
+
+ //-----------------------------------------------------------------------------
+ //-----------------------------------------------------------------------------
+ class ICameraVideoSinkCallback
+ {
+ public:
+ virtual void OnCameraVideoSinkCallback() = 0;
+ };
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: The camera on a single tracked device
+ // ----------------------------------------------------------------------------------------------
+ class IVRCameraComponent
+ {
+ public:
+ // ------------------------------------
+ // Camera Methods
+ // ------------------------------------
+ virtual bool HasCamera() = 0;
+ virtual bool GetCameraFirmwareDescription( char *pBuffer, uint32_t nBufferLen ) = 0;
+ virtual bool GetCameraFrameDimensions( vr::ECameraVideoStreamFormat nVideoStreamFormat, uint32_t *pWidth, uint32_t *pHeight ) = 0;
+ virtual bool GetCameraFrameBufferingRequirements( int *pDefaultFrameQueueSize, uint32_t *pFrameBufferDataSize ) = 0;
+ virtual bool SetCameraFrameBuffering( int nFrameBufferCount, void **ppFrameBuffers, uint32_t nFrameBufferDataSize ) = 0;
+ virtual bool SetCameraVideoStreamFormat( vr::ECameraVideoStreamFormat nVideoStreamFormat ) = 0;
+ virtual vr::ECameraVideoStreamFormat GetCameraVideoStreamFormat() = 0;
+ virtual bool StartVideoStream() = 0;
+ virtual void StopVideoStream() = 0;
+ virtual bool IsVideoStreamActive() = 0;
+ virtual float GetVideoStreamElapsedTime() = 0;
+ virtual const vr::CameraVideoStreamFrame_t *GetVideoStreamFrame() = 0;
+ virtual void ReleaseVideoStreamFrame( const vr::CameraVideoStreamFrame_t *pFrameImage ) = 0;
+ virtual bool SetAutoExposure( bool bEnable ) = 0;
+ virtual bool PauseVideoStream() = 0;
+ virtual bool ResumeVideoStream() = 0;
+ virtual bool IsVideoStreamPaused() = 0;
+ virtual bool GetCameraDistortion( float flInputU, float flInputV, float *pflOutputU, float *pflOutputV ) = 0;
+ virtual bool GetCameraProjection( float flWidthPixels, float flHeightPixels, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0;
+ virtual bool GetRecommendedCameraUndistortion( uint32_t *pUndistortionWidthPixels, uint32_t *pUndistortionHeightPixels ) = 0;
+ virtual bool SetCameraUndistortion( uint32_t nUndistortionWidthPixels, uint32_t nUndistortionHeightPixels ) = 0;
+ virtual bool GetCameraFirmwareVersion( uint64_t *pFirmwareVersion ) = 0;
+ virtual bool SetFrameRate( int nISPFrameRate, int nSensorFrameRate ) = 0;
+ virtual bool SetCameraVideoSinkCallback( vr::ICameraVideoSinkCallback *pCameraVideoSinkCallback ) = 0;
+ virtual bool GetCameraCompatibilityMode( vr::ECameraCompatibilityMode *pCameraCompatibilityMode ) = 0;
+ virtual bool SetCameraCompatibilityMode( vr::ECameraCompatibilityMode nCameraCompatibilityMode ) = 0;
+ };
+
+ static const char *IVRCameraComponent_Version = "IVRCameraComponent_001";
+}
+// itrackeddevicedriverprovider.h
+namespace vr
+{
+
+class ITrackedDeviceServerDriver;
+struct TrackedDeviceDriverInfo_t;
+struct DriverPose_t;
+
+class IDriverLog
+{
+public:
+ /** Writes a log message to the log file prefixed with the driver name */
+ virtual void Log( const char *pchLogMessage ) = 0;
+};
+
+/** This interface is provided by vrserver to allow the driver to notify
+* the system when something changes about a device. These changes must
+* not change the serial number or class of the device because those values
+* are permanently associated with the device's index. */
+class IServerDriverHost
+{
+public:
+ /** Notifies the server that a tracked device has been added. If this function returns true
+ * the server will call Activate on the device. If it returns false some kind of error
+ * has occurred and the device will not be activated. */
+ virtual bool TrackedDeviceAdded( const char *pchDeviceSerialNumber ) = 0;
+
+ /** Notifies the server that a tracked device's pose has been updated */
+ virtual void TrackedDevicePoseUpdated( uint32_t unWhichDevice, const DriverPose_t & newPose ) = 0;
+
+ /** Notifies the server that the property cache for the specified device should be invalidated */
+ virtual void TrackedDevicePropertiesChanged( uint32_t unWhichDevice ) = 0;
+
+ /** Notifies the server that vsync has occurred on the the display attached to the device. This is
+ * only permitted on devices of the HMD class. */
+ virtual void VsyncEvent( double vsyncTimeOffsetSeconds ) = 0;
+
+ /** notifies the server that the button was pressed */
+ virtual void TrackedDeviceButtonPressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was unpressed */
+ virtual void TrackedDeviceButtonUnpressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was pressed */
+ virtual void TrackedDeviceButtonTouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was unpressed */
+ virtual void TrackedDeviceButtonUntouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server than a controller axis changed */
+ virtual void TrackedDeviceAxisUpdated( uint32_t unWhichDevice, uint32_t unWhichAxis, const VRControllerAxis_t & axisState ) = 0;
+
+ /** Notifies the server that the MC image has been updated for the display attached to the device. This is
+ * only permitted on devices of the HMD class. */
+ virtual void MCImageUpdated() = 0;
+
+ /** always returns a pointer to a valid interface pointer of IVRSettings */
+ virtual IVRSettings *GetSettings( const char *pchInterfaceVersion ) = 0;
+
+ /** Notifies the server that the physical IPD adjustment has been moved on the HMD */
+ virtual void PhysicalIpdSet( uint32_t unWhichDevice, float fPhysicalIpdMeters ) = 0;
+
+ /** Notifies the server that the proximity sensor on the specified device */
+ virtual void ProximitySensorState( uint32_t unWhichDevice, bool bProximitySensorTriggered ) = 0;
+
+ /** Sends a vendor specific event (VREvent_VendorSpecific_Reserved_Start..VREvent_VendorSpecific_Reserved_End */
+ virtual void VendorSpecificEvent( uint32_t unWhichDevice, vr::EVREventType eventType, const VREvent_Data_t & eventData, double eventTimeOffset ) = 0;
+
+ /** Returns true if SteamVR is exiting */
+ virtual bool IsExiting() = 0;
+};
+
+
+/** This interface must be implemented in each driver. It will be loaded in vrserver.exe */
+class IServerTrackedDeviceProvider
+{
+public:
+ /** initializes the driver. This will be called before any other methods are called.
+ * If Init returns anything other than VRInitError_None the driver DLL will be unloaded.
+ *
+ * pDriverHost will never be NULL, and will always be a pointer to a IServerDriverHost interface
+ *
+ * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user
+ * config files.
+ * pchDriverInstallDir - The absolute path of the root directory for the driver.
+ */
+ virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IServerDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+
+ /** cleans up the driver right before it is unloaded */
+ virtual void Cleanup() = 0;
+
+ /** returns the number of HMDs that this driver manages that are physically connected. */
+ virtual uint32_t GetTrackedDeviceCount() = 0;
+
+ /** returns a single HMD */
+ virtual ITrackedDeviceServerDriver *GetTrackedDeviceDriver( uint32_t unWhich, const char *pchInterfaceVersion ) = 0;
+
+ /** returns a single HMD by ID */
+ virtual ITrackedDeviceServerDriver* FindTrackedDeviceDriver( const char *pchId, const char *pchInterfaceVersion ) = 0;
+
+ /** Allows the driver do to some work in the main loop of the server. */
+ virtual void RunFrame() = 0;
+
+
+ // ------------ Power State Functions ----------------------- //
+
+ /** Returns true if the driver wants to block Standby mode. */
+ virtual bool ShouldBlockStandbyMode() = 0;
+
+ /** Called when the system is entering Standby mode. The driver should switch itself into whatever sort of low-power
+ * state it has. */
+ virtual void EnterStandby() = 0;
+
+ /** Called when the system is leaving Standby mode. The driver should switch itself back to
+ full operation. */
+ virtual void LeaveStandby() = 0;
+
+};
+
+
+static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_002";
+
+
+/** This interface is provided by vrclient to allow the driver call back and query various information */
+class IClientDriverHost
+{
+public:
+ /** Returns the device class of a tracked device. If there has not been a device connected in this slot
+ * since the application started this function will return TrackedDevice_Invalid. For previous detected
+ * devices the function will return the previously observed device class.
+ *
+ * To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check
+ * the device class. Every device with something other than TrackedDevice_Invalid is associated with an
+ * actual tracked device. */
+ virtual ETrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
+
+ /** Returns true if there is a device connected in this slot. */
+ virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
+
+ /** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */
+ virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */
+ virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */
+ virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */
+ virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a string property. If the device index is not valid or the property is not a float type this function will
+ * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
+ * null. Strings will generally fit in buffers of k_unTrackingStringSize characters. */
+ virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** always returns a pointer to a valid interface pointer of IVRSettings */
+ virtual IVRSettings *GetSettings( const char *pchInterfaceVersion ) = 0;
+};
+
+
+
+/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */
+class IClientTrackedDeviceProvider
+{
+public:
+ /** initializes the driver. This will be called before any other methods are called,
+ * except BIsHmdPresent(). BIsHmdPresent is called outside of the Init/Cleanup pair.
+ * If Init returns anything other than VRInitError_None the driver DLL will be unloaded.
+ *
+ * pDriverHost will never be NULL, and will always be a pointer to a IClientDriverHost interface
+ *
+ * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user
+ * config files.
+ * pchDriverInstallDir - The absolute path of the root directory for the driver.
+ */
+ virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IClientDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+
+ /** cleans up the driver right before it is unloaded */
+ virtual void Cleanup() = 0;
+
+ /** Called when the client needs to inform an application if an HMD is attached that uses
+ * this driver. This method should be as lightweight as possible and should have no side effects
+ * such as hooking process functions or leaving resources loaded. Init will not be called before
+ * this method and Cleanup will not be called after it.
+ */
+ virtual bool BIsHmdPresent( const char *pchUserConfigDir ) = 0;
+
+ /** called when the client inits an HMD to let the client driver know which one is in use */
+ virtual EVRInitError SetDisplayId( const char *pchDisplayId ) = 0;
+
+ /** Returns the stencil mesh information for the current HMD. If this HMD does not have a stencil mesh the vertex data and count will be
+ * NULL and 0 respectively. This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering
+ * each eye's view. The pixels covered by this mesh will never be seen by the user after the lens distortion is applied and based on visibility to the panels.
+ * This will improve perf by letting the GPU early-reject pixels the user will never see before running the pixel shader.
+ * NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye.
+ */
+ virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye ) = 0;
+
+ /** Get the MC image for the current HMD.
+ * Returns the size in bytes of the buffer required to hold the specified resource. */
+ virtual uint32_t GetMCImage( uint32_t *pImgWidth, uint32_t *pImgHeight, uint32_t *pChannels, void *pDataBuffer, uint32_t unBufferLen ) = 0;
+};
+
+static const char *IClientTrackedDeviceProvider_Version = "IClientTrackedDeviceProvider_003";
+
+}// End
+
+#endif // _OPENVR_DRIVER_API
+
+
diff --git a/4.Software/GeekIMUDriver 1.0/Src/quaternion.cpp b/4.Software/GeekIMUDriver 1.0/Src/quaternion.cpp
new file mode 100644
index 0000000..c5d807b
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/quaternion.cpp
@@ -0,0 +1,267 @@
+#include "quaternion.h"
+#include "math.h"
+#include "stdio.h"
+
+#define PI 3.141592f
+
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v)
+{
+ Quaternion q;
+ /*把angle转换为弧度*/
+ angle = PI*angle/(180.0f);
+ q.w = cos(angle/2.0f);
+ q.x = v.x * sin(angle/2);
+ q.y = v.y * sin(angle/2);
+ q.z = v.z * sin(angle/2);
+ return q;
+}
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,_Quaternion q2)
+{
+ Quaternion q;
+ float mod;
+ /*按照四元数乘法计算系数*/
+ q.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.x = q1.w * q2.x + q1.x * q2.w - q1.y * q2.z + q1.z * q2.y; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.y = q1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.z = q1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+
+ // //按照四元数乘法标准计算法,实际不用
+ //q.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z;
+ //q.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y;
+ //q.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x;
+ //q.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w;
+
+
+ mod = QuaternionMod(q);
+ q.w = q.w/mod; q.x = q.x/mod; q.y = q.y/mod; q.z = q.z/mod;
+ return q;
+}
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1)
+{
+ Quaternion q;
+ /*按照四元数乘法计算系数*/
+ q.w = q1.w;
+ q.x = -q1.x;
+ q.y = -q1.y;
+ q.z = -q1.z;
+ return q;
+}
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1)
+{
+ float mod;
+ /*按照四元数乘法计算系数*/
+ mod = q1.w * q1.w + q1.x * q1.x +
+ q1.y * q1.y + q1.z * q1.z;
+ mod = sqrt(mod);
+ return mod;
+}
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1)
+{
+ Quaternion q;
+ /*计算四元数模的平方*/
+ float mod2 = QuaternionMod(q1);
+ /* 按照公式: *q^-1 = (q*)/(|q|)^2 */
+ q = QuaternionConjugate(q1);
+ q.w = q.w / mod2;
+ q.x = q.x / mod2;
+ q.y = q.y / mod2;
+ q.z = q.z / mod2;
+ return q;
+}
+
+void DisplayQuaternion(Quaternion q)
+{
+ float q0,q1,q2,q3;
+ q0 = q.w; q1 = q.x; q2 = q.y; q3 = q.z;
+ printf("DisplayQuaternion ::w = %f x = %f y = %f z = %f\n",q.w,q.x,q.y,q.z);
+}
+
+/*欧拉角转四元数*/
+Quaternion EulerAnglesToQuaternion(EulerAngles e)
+{
+ Quaternion q;
+ e.Pitch = e.Pitch/(180.00f/3.141592f);
+ e.Yaw = e.Yaw/ (180.00f/3.141592f);
+ e.Roll = e.Roll/ (180.00f/3.141592f);
+ // 按照Qz*Qy*Qx 产生四元数
+ /*w*/
+ q.w = (float)(cos(0.5*e.Roll)*cos(0.5*e.Pitch)*cos(0.5*e.Yaw) - sin(0.5*e.Roll)*sin(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*x 绕x轴旋转是pitch*/
+ q.x = (float)(cos(0.5*e.Roll)*sin(0.5*e.Pitch)*cos(0.5*e.Yaw) - sin(0.5*e.Roll)*cos(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*y 绕y轴旋转是roll*/
+ q.y = (float)(sin(0.5*e.Roll)*cos(0.5*e.Pitch)*cos(0.5*e.Yaw) + cos(0.5*e.Roll)*sin(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*z 绕z轴旋转是Yaw*/
+ q.z = (float)(cos(0.5*e.Roll)*cos(0.5*e.Pitch)*sin(0.5*e.Yaw) + sin(0.5*e.Roll)*sin(0.5*e.Pitch)*cos(0.5*e.Yaw));
+ return q;
+}
+
+EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer)
+{
+ EulerAngles e;
+ /*Pitch 在D3D坐标系中被认为是绕x轴旋转,Roll绕z旋转,Yaw是绕y旋转*/
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(y*z-w*x))* (180.0f /PI);
+ e.Yaw = atan2(x*z + w*y,0.5f - x*x - y*y)* (180.0f /PI);
+ e.Roll = atan2(x*y + w*z,0.5f - x*x - z*z)* (180.0f /PI);
+
+ return e;
+}
+
+
+void DisplayEulerAngles(EulerAngles e)
+{
+ printf("DisplayEulerAngles::Yaw=%f,Pitch=%f,Roll=%f\n",e.Yaw,e.Pitch,e.Roll);
+}
+
+void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll)
+{
+ (*e).Pitch = Pitch; (*e).Roll = Roll;(*e).Yaw = Yaw;
+}
+
+
+EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll)
+{
+ EulerAngles e;
+ (e).Pitch = Pitch; (e).Roll = Roll;(e).Yaw = Yaw;
+ return e;
+}
+
+Vector3 SetVector3(float x,float y,float z)
+{
+ Vector3 v;
+ v.x = x;
+ v.y = y;
+ v.z = z;
+ return v;
+}
+
+
+bool QuaternionEqual(Quaternion q1,Quaternion q2)
+{
+ if(fabsf(q1.w-q2.w)<0.0001f&&
+ fabsf(q1.x-q2.x)<0.0001f&&
+ fabsf(q1.y-q2.y)<0.0001f&&
+ fabsf(q1.z-q2.z)<0.0001f)return true;
+ return false;
+}
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz)
+{
+ float qw,qx,qy,qz;
+ static float q0 = 1.0f,q1 = 0.0f,q2 = 0.0f,q3 = 0.0f;
+ float halfT = 1.0f;
+
+ Quaternion q;
+ qw = (-q1*gx - q2*gy - q3*gz)*halfT; /*利用一阶龙格库塔法对四元数进行更新*/
+ qx = ( q0*gx + q2*gz - q3*gy)*halfT;
+ qy = ( q0*gy - q1*gz + q3*gx)*halfT;
+ qz = ( q0*gz + q1*gy - q2*gx)*halfT;
+
+ q0 = q0 + qw;
+ q1 = q1 + qx;
+ q2 = q2 + qy;
+ q3 = q3 + qz;
+
+ q.w = q0;
+ q.x = q1;
+ q.y = q2;
+ q.z = q3;
+
+
+ float mod2 = QuaternionMod(q); /*求模*/
+
+ q.w = q.w / mod2;
+ q.x = q.x / mod2;
+ q.y = q.y / mod2;
+ q.z = q.z / mod2;
+
+ return q;
+}
+
+
+/*把四元数转换为旋转矩阵*/
+Matrix3 QuaternionToMatrix(Quaternion q)
+{
+ Matrix3 mMatrix;
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ mMatrix.m[0][0] = 1 - 2*y*y -2*z*z;
+ mMatrix.m[0][1] = 2*x*y + 2*w*z;
+ mMatrix.m[0][2] = 2*x*y - 2*w*y;
+
+ mMatrix.m[1][0] = 2*x*y - 2*w*z;
+ mMatrix.m[1][1] = 1 - 2*x*x -2*z*z;
+ mMatrix.m[1][2] = 2*y*z + 2*w*x;
+
+ mMatrix.m[2][0] = 2*x*z + 2*w*z;
+ mMatrix.m[2][1] = 2*y*z - 2*w*x;
+ mMatrix.m[2][2] = 1 - 2*x*x -2*y*y;
+ return mMatrix;
+}
+
+/* 给定旋转矩阵以及向量,返回旋转后的向量*/
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec)
+{
+ MVector3 mResult;
+ int j;
+ for(j=0;j<3;j++)
+ {
+ mResult.v[j] = mMatrix.m[j][0]*vec.v[0] +
+ mMatrix.m[j][1]*vec.v[1] +
+ mMatrix.m[j][2]*vec.v[2];
+ }
+ return mResult;
+}
+
+
+
+
+/*************************************************************************
+
+* 描 述 : 把标准笛卡尔坐标系下的四元数转换到欧拉角显示。
+ 这里的变换公式为物体-惯性四元数转换到欧拉角
+
+**************************************************************************/
+EulerAngles MathQuaternionToEulerAngles(Quaternion q)
+{
+ EulerAngles e;
+ /*标准笛卡尔坐标系中,我们认为绕z轴为Yaw,绕x轴为Roll,绕y轴为Pitch*/
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(z*x-w*y))* (180.0f /PI);
+ e.Yaw = atan2(y*x + w*z,0.5f - y*y - z*z)* (180.0f /PI);
+ e.Roll = atan2(y*z + w*x,0.5f - y*y - x*x)* (180.0f /PI);
+
+ return e;
+}
+/*************************************************************************
+
+* 描 述 : 把D3D坐标系下的四元数转换到欧拉角显示。
+ 这里的变换公式为物体-惯性四元数转换到欧拉角
+
+**************************************************************************/
+EulerAngles D3DQuaternionToEulerAngles(Quaternion q)
+{
+ EulerAngles e;
+ /*Pitch 在D3D坐标系中被认为是绕x轴旋转,Roll绕z旋转,Yaw是绕y旋转*/
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(y*z-w*x))* (180.0f /PI);
+ e.Yaw = atan2(x*z + w*y,0.5f - x*x - y*y)* (180.0f /PI);
+ e.Roll = atan2(x*y + w*z,0.5f - x*x - z*z)* (180.0f /PI);
+
+ return e;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/quaternion.h b/4.Software/GeekIMUDriver 1.0/Src/quaternion.h
new file mode 100644
index 0000000..26f44cc
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/quaternion.h
@@ -0,0 +1,145 @@
+#ifndef _QUATERNION_H_
+#define _QUATERNION_H_
+
+typedef struct _MagCaliParam
+{
+ float xOffset;
+ float yOffset;
+ float zOffset;
+ float xScale;
+ float yScale;
+ float zScale;
+}MagCaliParam;
+
+typedef struct _Quaternion
+{
+ float w,x,y,z;
+}Quaternion;
+
+
+typedef struct _Vector3
+{
+ float x,y,z;
+}Vector3;
+
+typedef struct _EulerAngles{
+ float Yaw;
+ float Roll;
+ float Pitch;
+}EulerAngles;
+
+typedef struct _MVector3
+{
+ float v[3];
+}MVector3;
+
+
+typedef struct _Matrix3
+{
+ float m[3][3];
+}Matrix3;
+
+
+
+#ifdef __cplusplus
+extern "C"{
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v);
+
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,Quaternion q2);
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1);
+
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1);
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1);
+
+void DisplayQuaternion(Quaternion q);
+
+Quaternion EulerAnglesToQuaternion(EulerAngles e);
+
+//EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer);
+
+void DisplayEulerAngles(EulerAngles e);
+
+//void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll);
+
+EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll);
+
+/*判断两个四元数是否相等,相等返回ture,否则返回false*/
+bool QuaternionEqual(Quaternion q1,Quaternion q2);
+
+
+Vector3 SetVector3(float x,float y,float z);
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz);
+
+
+Matrix3 QuaternionToMatrix(Quaternion q);
+
+
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec);
+
+EulerAngles MathQuaternionToEulerAngles(Quaternion q);
+
+
+
+}
+
+#else
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v);
+
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,Quaternion q2);
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1);
+
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1);
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1);
+
+void DisplayQuaternion(Quaternion q);
+
+Quaternion EulerAnglesToQuaternion(EulerAngles e);
+
+//EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer);
+
+void DisplayEulerAngles(EulerAngles e);
+
+void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll);
+
+//EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll);
+
+/*判断两个四元数是否相等,相等返回ture,否则返回false*/
+//bool QuaternionEqual(Quaternion q1,Quaternion q2);
+
+
+Vector3 SetVector3(float x,float y,float z);
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz);
+
+
+Matrix3 QuaternionToMatrix(Quaternion q);
+
+
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec);
+
+EulerAngles MathQuaternionToEulerAngles(Quaternion q);
+
+
+#endif
+
+
+
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.0/Src/sensor.h b/4.Software/GeekIMUDriver 1.0/Src/sensor.h
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMUDriver 1.0/Src/usbport.h b/4.Software/GeekIMUDriver 1.0/Src/usbport.h
new file mode 100644
index 0000000..59498d3
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.0/Src/usbport.h
@@ -0,0 +1,40 @@
+#include
+#include
+#include "hidsdi.h"
+#include "hidclass.h"
+#include "hidpddi.h"
+#include "hidport.h"
+#include "SetupAPI.h"
+#include
+#include "malloc.h"
+
+#pragma comment(lib,"setupapi.lib")
+#pragma comment(lib,"hid.lib")
+#pragma comment(lib,"comctl32.lib")
+
+#ifndef BULKUSBH_INC
+#define BULKUSBH_INC
+
+#define BULKUSB_IOCTL_INDEX 0x0000
+
+#define IOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \
+0x0000, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_RESET_DEVICE CTL_CODE(FILE_DEVICE_UNKNOWN, \
+0x0001, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN,
+0x0002, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+extern HANDLE open_file(char *filename);
+extern int GetUsbPath(char *path);
+extern int WriteUsb(HANDLE hUsb, char *Outbuff, int len);
+extern int ReadUsb(HANDLE hUsb, BYTE inbuff[], DWORD &nBytesRead, int nToRead);
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/IMU_CAPI.obj b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/IMU_CAPI.obj
new file mode 100644
index 0000000..b445328
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/IMU_CAPI.obj differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/LibHID.log b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/LibHID.log
new file mode 100644
index 0000000..224a7ae
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/LibHID.log
@@ -0,0 +1,14 @@
+锘 SensorImpl.cpp
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(142,48): warning C4305: 鈥滃垵濮嬪寲鈥: 浠庘渄ouble鈥濆埌鈥渇loat鈥濇埅鏂
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(78,44): warning C4101: 鈥渕x1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(82,14): warning C4101: 鈥渜2鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(82,11): warning C4101: 鈥渜1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(82,17): warning C4101: 鈥渜3鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(78,49): warning C4101: 鈥渕y1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(78,54): warning C4101: 鈥渕z1鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(82,8): warning C4101: 鈥渜0鈥: 鏈紩鐢ㄧ殑灞閮ㄥ彉閲
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(279,15): warning C4305: 鈥=鈥: 浠庘渄ouble鈥濆埌鈥渇loat鈥濇埅鏂
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(379,37): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(380,50): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Src\SensorImpl.cpp(381,51): warning C4244: 鈥=鈥: 浠庘渄ouble鈥濊浆鎹㈠埌鈥渇loat鈥濓紝鍙兘涓㈠け鏁版嵁
+ LibHID.vcxproj -> E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.exe
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt
new file mode 100644
index 0000000..59ed8e2
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/LibHID.vcxproj.FileListAbsolute.txt
@@ -0,0 +1,2 @@
+C:\Users\Administrator\Documents\Tencent Files\719901725\FileRecv\2017-10-30 230812_DM妯″潡涓婁綅鏈烘牎鍑嗚蒋浠禫1.1\DMMTCalibrationTools\DMMTCalibrationTools\Bin_Win32\Debug\libdm.dll
+E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.exe
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/MagCalibrate.obj b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/MagCalibrate.obj
new file mode 100644
index 0000000..b28d56b
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/MagCalibrate.obj differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/PipeHMD.obj b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/PipeHMD.obj
new file mode 100644
index 0000000..c0808c1
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/PipeHMD.obj differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/SensorImpl.obj b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/SensorImpl.obj
new file mode 100644
index 0000000..7179e59
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/SensorImpl.obj differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/USB_Win32_HIDDevice.obj b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/USB_Win32_HIDDevice.obj
new file mode 100644
index 0000000..79c4a37
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/USB_Win32_HIDDevice.obj differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.Build.CppClean.log b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.Build.CppClean.log
new file mode 100644
index 0000000..38f481c
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.Build.CppClean.log
@@ -0,0 +1,20 @@
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\vc142.pdb
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\vc142.idb
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\sensorimpl.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\quaternion.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\pipehmd.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\main.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\magcalibrate.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\usb_win32_hiddevice.obj
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.lib
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.exp
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.dll
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.ilk
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.pdb
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\cl.command.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\cl.read.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\cl.write.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\libdm.write.1u.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\link.command.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\link.read.1.tlog
+e:\hardwareproject\geekimu\4.software\geekimudriver 1.1\bin_win32\debug\libdm.tlog\link.write.1.tlog
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.dll.recipe b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.dll.recipe
new file mode 100644
index 0000000..0b62182
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.dll.recipe
@@ -0,0 +1,11 @@
+锘
+
+
+
+ E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.dll
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exe b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exe
new file mode 100644
index 0000000..912dbdf
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exe differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exe.recipe b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exe.recipe
new file mode 100644
index 0000000..94b37f4
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exe.recipe
@@ -0,0 +1,11 @@
+锘
+
+
+
+ E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Bin_Win32\Debug\libdm.exe
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exp b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exp
new file mode 100644
index 0000000..ed8630d
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.exp differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.ilk b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.ilk
new file mode 100644
index 0000000..207a56b
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.ilk differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.lib b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.lib
new file mode 100644
index 0000000..e6e7b59
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.lib differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.pdb b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.pdb
new file mode 100644
index 0000000..dfe13c7
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.pdb differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog
new file mode 100644
index 0000000..ddae013
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.command.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog
new file mode 100644
index 0000000..f7e7943
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.read.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog
new file mode 100644
index 0000000..b82cdbb
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/CL.write.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate
new file mode 100644
index 0000000..c83b5a4
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/libdm.lastbuildstate
@@ -0,0 +1,2 @@
+PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.29.30133:VCServicingVersionMFC=14.29.30136:VCServicingVersionCrtHeaders=14.29.30136:TargetPlatformVersion=10.0.20348.0:
+Debug|Win32|E:\HardwareProject\GeekIMU\4.Software\GeekIMUDriver 1.1\Projects\|
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog
new file mode 100644
index 0000000..16f2fba
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/libdm.write.1u.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.18056.delete.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.18056.delete.1.tlog
new file mode 100644
index 0000000..a05416e
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.18056.delete.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.20816.delete.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.20816.delete.1.tlog
new file mode 100644
index 0000000..6478208
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.20816.delete.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog
new file mode 100644
index 0000000..5339a98
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.command.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.delete.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.delete.1.tlog
new file mode 100644
index 0000000..6bc9783
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.delete.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog
new file mode 100644
index 0000000..6bafa96
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.read.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog
new file mode 100644
index 0000000..dcdab8e
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/libdm.tlog/link.write.1.tlog differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/main.obj b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/main.obj
new file mode 100644
index 0000000..1b6bf07
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/main.obj differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/quaternion.obj b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/quaternion.obj
new file mode 100644
index 0000000..4cbf178
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/quaternion.obj differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/vc142.idb b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/vc142.idb
new file mode 100644
index 0000000..5b703ec
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/vc142.idb differ
diff --git a/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/vc142.pdb b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/vc142.pdb
new file mode 100644
index 0000000..7787748
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Bin_Win32/Debug/vc142.pdb differ
diff --git a/4.Software/GeekIMUDriver 1.1/LibDM.sln.lnk b/4.Software/GeekIMUDriver 1.1/LibDM.sln.lnk
new file mode 100644
index 0000000..077d49e
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/LibDM.sln.lnk differ
diff --git a/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.sln b/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.sln
new file mode 100644
index 0000000..bb30ef4
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.sln
@@ -0,0 +1,26 @@
+锘
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibHID", "LibHID.vcxproj", "{37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|Win32.Build.0 = Debug|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|x64.ActiveCfg = Debug|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Debug|x64.Build.0 = Debug|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|Win32.ActiveCfg = Release|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|Win32.Build.0 = Release|Win32
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|x64.ActiveCfg = Release|x64
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.suo b/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.suo
new file mode 100644
index 0000000..0defe56
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.suo differ
diff --git a/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.v12.suo b/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.v12.suo
new file mode 100644
index 0000000..4d992ee
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Projects/DMMTCalibrationTools.v12.suo differ
diff --git a/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj b/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj
new file mode 100644
index 0000000..b67f54e
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj
@@ -0,0 +1,145 @@
+锘
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {37A7D3CE-D00F-4B23-8DFA-C8FE41ED892A}
+ LibHID
+ libdm
+ 10.0
+
+
+
+ Application
+ true
+ v142
+ MultiByte
+
+
+ Application
+ true
+ v142
+ MultiByte
+
+
+ DynamicLibrary
+ false
+ v142
+ true
+ MultiByte
+
+
+ Application
+ false
+ v142
+ true
+ MultiByte
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\Bin_Win32\Debug\
+ ..\Bin_Win32\Debug\
+
+
+ ..\Bin\x64\Debug\
+ ..\Bin\x64\Debug\
+
+
+
+ Level3
+ Disabled
+ $(SolutionDir)..\Src;%(AdditionalIncludeDirectories)
+
+
+ true
+ AsInvoker
+
+
+
+
+ Level3
+ Disabled
+
+
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+
+
+ true
+ true
+ true
+
+
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+
+
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj.filters b/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj.filters
new file mode 100644
index 0000000..177e0f1
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj.filters
@@ -0,0 +1,78 @@
+锘
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+ {548ce9d9-2531-4935-9cf5-5f84f905abc1}
+
+
+ {282a2cbd-c34f-4e1e-a946-987edf6336d1}
+
+
+ {6c132069-0a46-4ff3-be04-048d1613aa75}
+
+
+ {1a76e6bf-779d-4efd-b8f4-7a7ce2707d28}
+
+
+ {ca3301bc-ba86-402b-a605-e4c66594f8a6}
+
+
+
+
+ 婧愭枃浠
+
+
+ 婧愭枃浠禱math
+
+
+ 婧愭枃浠禱driver
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱app
+
+
+ 婧愭枃浠
+
+
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱math
+
+
+ 婧愭枃浠禱driver
+
+
+ 婧愭枃浠禱motion_engine
+
+
+ 婧愭枃浠禱app
+
+
+ 婧愭枃浠禱util
+
+
+ 婧愭枃浠
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj.user b/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj.user
new file mode 100644
index 0000000..a375ae3
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Projects/LibHID.vcxproj.user
@@ -0,0 +1,4 @@
+锘
+
+
+
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Projects/LibUsbHid.v12.suo b/4.Software/GeekIMUDriver 1.1/Projects/LibUsbHid.v12.suo
new file mode 100644
index 0000000..055f3a4
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Projects/LibUsbHid.v12.suo differ
diff --git a/4.Software/GeekIMUDriver 1.1/Src/DM_Sensor.h b/4.Software/GeekIMUDriver 1.1/Src/DM_Sensor.h
new file mode 100644
index 0000000..b0be5d8
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/DM_Sensor.h
@@ -0,0 +1,19 @@
+#ifndef _DM_SENSOR_H_
+#define _DM_SENSOR_H_
+
+/**********************************************************************************
+* 函数名 : UnpackSensor
+* 描述 : Oculus按照一定的算法压缩陀螺仪数据,这里最数据进行解包,可以参考:
+ http://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend
+ 文档进行处理。
+* 输入 : 要输入数据的指针
+* 输出 : 输出陀螺仪x、y、z三轴的数据
+***********************************************************************************/
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+
+void GetDK2_SensorData(unsigned char usb_input_buffer[]);
+
+void AHRSupdate(double gx, double gy, double gz, double ax, double ay, double az, double mx, double my, double mz,int Dtime);
+
+#endif
diff --git a/4.Software/GeekIMUDriver 1.1/Src/DM_Sensor_type.h b/4.Software/GeekIMUDriver 1.1/Src/DM_Sensor_type.h
new file mode 100644
index 0000000..1bc0f00
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/DM_Sensor_type.h
@@ -0,0 +1,21 @@
+#ifndef _DM_SENSOR_TYPE_H_
+#define _DM_SENSOR_TYPE_H_
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct EulaAngle_
+{
+ double Yaw;
+ double Pitch;
+ double Roll;
+}DM_EulaAngle;
+
+
+typedef struct DMVector3f_
+{
+ float x, y, z;
+} DMVector3f;
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/IMU_CAPI.c b/4.Software/GeekIMUDriver 1.1/Src/IMU_CAPI.c
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMUDriver 1.1/Src/IMU_CAPI.h b/4.Software/GeekIMUDriver 1.1/Src/IMU_CAPI.h
new file mode 100644
index 0000000..1aec8d6
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/IMU_CAPI.h
@@ -0,0 +1,42 @@
+#ifndef _IMU_SENSOR_API_
+#define _IMU_SENSOR_API_
+#include
+
+#ifdef __cplusplus
+extern "C"{
+
+ __declspec(dllexport) int Init(char* );
+
+ __declspec(dllexport) int CheckDevice(void);
+
+ __declspec(dllexport) int GyroCali(void);
+
+ __declspec(dllexport) Vector3 GetGyroCali(void);
+
+ _declspec (dllexport) MagCaliParam GetMagCali();
+
+ __declspec(dllexport) int MagCalibrate(void);
+
+ __declspec(dllexport) int FinishMagCali(void);
+
+ __declspec(dllexport) int SetMagCali(float x, float y, float z, float x0, float y0, float z0);
+
+ __declspec(dllexport) MagCaliParam CalculateMagParam();
+
+ __declspec(dllexport) Vector3 GetPoint(void);
+
+ __declspec(dllexport) Vector3 GetEulerianAngle(void);
+
+ __declspec(dllexport) int Correction(void);
+
+ __declspec(dllexport) Quaternion GetQuaternion(void);
+
+}
+#else
+
+#endif
+
+#endif
+
+
+
diff --git a/4.Software/GeekIMUDriver 1.1/Src/MagCalibrate.cpp b/4.Software/GeekIMUDriver 1.1/Src/MagCalibrate.cpp
new file mode 100644
index 0000000..ba09ffb
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/MagCalibrate.cpp
@@ -0,0 +1,113 @@
+/******************** (C) COPYRIGHT 2023 Geek************************************
+* File Name : MagCalibrate.cpp
+* Department : Sensor Algorithm Team
+* Current Version : V1.0
+* Author : zhanli
+* Date of Issued : 2023.09.10
+* Comments : GeekIMU 磁力计校准模块
+********************************************************************************/
+/* Header File Including -----------------------------------------------------*/
+
+#include
+#include
+#include
+#include "MagCalibrate.h"
+#include
+
+MagCaliParam CalculateMagCalibrationParams(MagData _mdata[], int dataSize)
+{
+ MagCaliParam param, lastparam;
+
+ srand((unsigned)time(NULL));
+
+ float xmin = _mdata[0].x;
+ float ymin = _mdata[0].y;
+ float zmin = _mdata[0].z;
+ float xmax = _mdata[0].x;
+ float ymax = _mdata[0].y;
+ float zmax = _mdata[0].z;
+ float err, errnew;
+
+ for (int i = 0; i < dataSize; i++)
+ {
+ if (xmax < _mdata[i].x)
+ xmax = _mdata[i].x;
+ if (ymax < _mdata[i].y)
+ ymax = _mdata[i].y;
+ if (zmax < _mdata[i].z)
+ zmax = _mdata[i].z;
+ if (xmin > _mdata[i].x)
+ xmin = _mdata[i].x;
+ if (ymin > _mdata[i].y)
+ ymin = _mdata[i].y;
+ if (zmin > _mdata[i].z)
+ zmin = _mdata[i].z;
+ }
+
+ lastparam.xOffset = 0.5 * (xmax + xmin);
+ lastparam.yOffset = 0.5 * (ymax + ymin);
+ lastparam.zOffset = 0.5 * (zmax + zmin);
+ lastparam.xScale = 0.5 * abs(xmax - xmin);
+ lastparam.yScale = 0.5 * abs(ymax - ymin);
+ lastparam.zScale = 0.5 * abs(zmax - zmin);
+ err = 0;
+ for (int i = 0; i < dataSize; i++)
+ err = err + fabs(pow((_mdata[i].x - lastparam.xOffset), 2) / pow(lastparam.xScale, 2) + pow((_mdata[i].y - lastparam.yOffset), 2) / pow(lastparam.yScale, 2) + pow((_mdata[i].z - lastparam.zOffset), 2) / pow(lastparam.zScale, 2) - 1);
+ //printf("xc = %f yc = %f zc = %f, a = %f b = %f c= %f,初始化InitErr = %f\n", lastparam.xOffset, lastparam.yOffset, lastparam.zOffset, lastparam.xScale, lastparam.yScale, lastparam.zScale, err);
+ int starttime = clock();
+ for (int j = 0; j < 5000; j++)
+ {
+ param.xOffset = lastparam.xOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.yOffset = lastparam.yOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.zOffset = lastparam.zOffset + rand() / (RAND_MAX + 1.0) - 0.5;
+ param.xScale = fabs(lastparam.xScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ param.yScale = fabs(lastparam.yScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ param.zScale = fabs(lastparam.zScale + rand() / (RAND_MAX + 1.0) - 0.5);
+ errnew = 0;
+ for (int i = 0; i < dataSize; i++)
+ errnew = errnew + fabs(pow((_mdata[i].x - param.xOffset), 2) / pow(param.xScale, 2) + pow((_mdata[i].y - param.yOffset), 2) / pow(param.yScale, 2) + pow((_mdata[i].z - param.zOffset), 2) / pow(param.zScale, 2) - 1);
+ if (errnew < err)
+ {
+ lastparam.xOffset = param.xOffset;
+ lastparam.yOffset = param.yOffset;
+ lastparam.zOffset = param.zOffset;
+ lastparam.xScale = param.xScale;
+ lastparam.yScale = param.yScale;
+ lastparam.zScale = param.zScale;
+ err = errnew;
+ }
+ }
+ param.xScale = 200 / param.xScale;
+ param.yScale = 200 / param.yScale;
+ param.zScale = 200 / param.zScale;
+ int durtime = clock() - starttime;
+
+ printf("%f, %f, %f, %f, %f, %f, %f\n cost:%dms\n", param.xOffset, param.yOffset, param.zOffset, param.xScale, param.yScale, param.zScale, err, durtime);
+
+ return param;
+}
+MagCaliParam GetMagDataFormFile()
+{
+ int maxdatasize = 4000;
+ std::ifstream fin("data.txt");
+ float x, y, z, x1, y1, z1;
+ int i = 0;
+ MagData mdata[4000];
+
+ while (fin) {
+ fin >> x >> y >> z;
+ fin.get(); // 加入这行,避免最后一行输出两次
+ mdata[i].x = x;
+ mdata[i].y = y;
+ mdata[i].z = z;
+
+ i++;
+
+ if (i == maxdatasize)
+ break;
+ }
+
+ MagCaliParam p = CalculateMagCalibrationParams(mdata, i);
+
+ return p;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/MagCalibrate.h b/4.Software/GeekIMUDriver 1.1/Src/MagCalibrate.h
new file mode 100644
index 0000000..0ed65c2
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/MagCalibrate.h
@@ -0,0 +1,25 @@
+#ifndef _MAG_CALIBRATE_H_
+#define _MAG_CALIBRATE_H_
+
+typedef struct _MagData
+{
+ float x;
+ float y;
+ float z;
+}MagData;
+
+typedef struct _MagCaliParam
+{
+ float xOffset;
+ float yOffset;
+ float zOffset;
+ float xScale;
+ float yScale;
+ float zScale;
+}MagCaliParam;
+
+MagCaliParam CalculateMagCalibrationParams(MagData _mdata[], int dataSize);
+
+MagCaliParam GetMagDataFormFile();
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/MyCls.h b/4.Software/GeekIMUDriver 1.1/Src/MyCls.h
new file mode 100644
index 0000000..3319814
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/MyCls.h
@@ -0,0 +1,43 @@
+#include
+void MyCls(HANDLE hConsole)
+{
+ COORD coordScreen = { 0, 0 };//设置清屏后光标返回的屏幕左上角坐标
+ BOOL bSuccess;
+ DWORD cCharsWritten;
+ CONSOLE_SCREEN_BUFFER_INFO csbi;//保存缓冲区信息
+
+ DWORD dwConSize;//当前缓冲区可容纳的字符数
+
+ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);//获得缓冲区信息
+ //PERR(bSuccess, "GetConsoleScreenBufferInfo");
+ dwConSize = csbi.dwSize.X * csbi.dwSize.Y;//缓冲区容纳字符数目
+
+ //用空格填充缓冲区
+ bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR)' ', dwConSize, coordScreen, &cCharsWritten);
+ //PERR(bSuccess, "FillConsoleOutputCharacter");
+
+ bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);//获得缓冲区信息
+ //PERR(bSuccess, "ConsoleScreenBufferInfo");
+
+ //填充缓冲区属性
+ bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
+ //PERR(bSuccess, "FillConsoleOutputAttribute");
+
+ //光标返回屏幕左上角坐标
+ bSuccess = SetConsoleCursorPosition(hConsole, coordScreen);
+ //printf("ok");
+ //PERR(bSuccess, "SetConsoleCursorPosition");
+ return;
+}
+inline void back2zero(void)
+{
+ static HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ static COORD coordScreen = { 0, 0 };
+ SetConsoleCursorPosition(hStdOut, coordScreen);
+}
+inline void clrscr(void)
+{
+ HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
+ MyCls(hStdOut);
+ return;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/OVR_CAPI.h b/4.Software/GeekIMUDriver 1.1/Src/OVR_CAPI.h
new file mode 100644
index 0000000..431c403
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/OVR_CAPI.h
@@ -0,0 +1,868 @@
+/************************************************************************************
+
+Filename : OVR_CAPI.h
+Content : C Interface to Oculus sensors and rendering.
+Created : November 23, 2013
+Authors : Michael Antonov
+
+Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved.
+
+Licensed under the Oculus VR Rift SDK License Version 3.1 (the "License");
+you may not use the Oculus VR Rift SDK except in compliance with the License,
+which is provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+http://www.oculusvr.com/licenses/LICENSE-3.1
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+************************************************************************************/
+#ifndef OVR_CAPI_h
+#define OVR_CAPI_h
+
+#include
+
+
+typedef char ovrBool;
+
+//-----------------------------------------------------------------------------------
+// ***** OVR_EXPORT definition
+
+#if !defined(OVR_EXPORT)
+#if defined(WIN32)
+#define OVR_EXPORT __declspec(dllexport)
+#else
+#define OVR_EXPORT
+#endif
+#endif
+
+//-----------------------------------------------------------------------------------
+
+typedef struct SensorPureData_
+{
+ long AccelX, AccelY, AccelZ;
+ long GyroX, GyroY, GyroZ;
+ short MagX, MagY, MagZ;
+}SensorPureData;
+
+// ***** Simple Math Structures
+
+// 2D integer
+typedef struct ovrVector2i_
+{
+ int x, y;
+} ovrVector2i;
+typedef struct ovrSizei_
+{
+ int w, h;
+} ovrSizei;
+typedef struct ovrRecti_
+{
+ ovrVector2i Pos;
+ ovrSizei Size;
+} ovrRecti;
+
+// 3D
+typedef struct ovrQuatf_
+{
+ float x, y, z, w;
+} ovrQuatf;
+typedef struct ovrVector2f_
+{
+ float x, y;
+} ovrVector2f;
+typedef struct ovrVector3f_
+{
+ float x, y, z;
+} ovrVector3f;
+typedef struct ovrMatrix4f_
+{
+ float M[4][4];
+} ovrMatrix4f;
+// Position and orientation together.
+typedef struct ovrPosef_
+{
+ ovrQuatf Orientation;
+ ovrVector3f Position;
+} ovrPosef;
+
+// Full pose (rigid body) configuration with first and second derivatives.
+typedef struct ovrPoseStatef_
+{
+ ovrPosef Pose;
+ ovrVector3f AngularVelocity;
+ ovrVector3f LinearVelocity;
+ ovrVector3f AngularAcceleration;
+ ovrVector3f LinearAcceleration;
+ double TimeInSeconds; // Absolute time of this state sample.
+} ovrPoseStatef;
+
+// Field Of View (FOV) in tangent of the angle units.
+// As an example, for a standard 90 degree vertical FOV, we would
+// have: { UpTan = tan(90 degrees / 2), DownTan = tan(90 degrees / 2) }.
+typedef struct ovrFovPort_
+{
+ float UpTan;
+ float DownTan;
+ float LeftTan;
+ float RightTan;
+} ovrFovPort;
+
+
+//-----------------------------------------------------------------------------------
+// ***** HMD Types
+
+// Enumerates all HMD types that we support.
+typedef enum
+{
+ ovrHmd_None = 0,
+ ovrHmd_DK1 = 3,
+ ovrHmd_DKHD = 4,
+ ovrHmd_CrystalCoveProto = 5,
+ ovrHmd_DK2 = 6,
+ ovrHmd_Other // Some HMD other then the one in the enumeration.
+} ovrHmdType;
+
+// HMD capability bits reported by device.
+//
+typedef enum
+{
+ // Read-only flags.
+ ovrHmdCap_Present = 0x0001, // This HMD exists (as opposed to being unplugged).
+ ovrHmdCap_Available = 0x0002, // HMD and is sensor is available for use
+ // (if not owned by another app).
+
+ // These flags are intended for use with the new driver display mode.
+ /*
+ ovrHmdCap_ExtendDesktop = 0x0004, // Read only, means display driver is in compatibility mode.
+
+ ovrHmdCap_DisplayOff = 0x0040, // Turns off Oculus HMD screen and output.
+ ovrHmdCap_NoMirrorToWindow = 0x2000, // Disables mirrowing of HMD output to the window;
+ // may improve rendering performance slightly.
+ */
+
+ // Modifiable flags (through ovrHmd_SetEnabledCaps).
+ ovrHmdCap_LowPersistence = 0x0080, // Supports low persistence mode.
+ ovrHmdCap_LatencyTest = 0x0100, // Supports pixel reading for continuous latency testing.
+ ovrHmdCap_DynamicPrediction = 0x0200, // Adjust prediction dynamically based on DK2 Latency.
+ // Support rendering without VSync for debugging
+ ovrHmdCap_NoVSync = 0x1000,
+ ovrHmdCap_NoRestore = 0x4000,
+
+ // These bits can be modified by ovrHmd_SetEnabledCaps.
+ ovrHmdCap_Writable_Mask = 0x1380
+} ovrHmdCaps;
+
+
+// Sensor capability bits reported by device.
+// Used with ovrHmd_StartSensor.
+typedef enum
+{
+ ovrSensorCap_Orientation = 0x0010, // Supports orientation tracking (IMU).
+ ovrSensorCap_YawCorrection = 0x0020, // Supports yaw correction through magnetometer or other means.
+ ovrSensorCap_Position = 0x0040, // Supports positional tracking.
+
+} ovrSensorCaps;
+
+// Distortion capability bits reported by device.
+// Used with ovrHmd_ConfigureRendering and ovrHmd_CreateDistortionMesh.
+typedef enum
+{
+ ovrDistortionCap_Chromatic = 0x01, // Supports chromatic aberration correction.
+ ovrDistortionCap_TimeWarp = 0x02, // Supports timewarp.
+ ovrDistortionCap_Vignette = 0x08 // Supports vignetting around the edges of the view.
+} ovrDistortionCaps;
+
+
+// Specifies which eye is being used for rendering.
+// This type explicitly does not include a third "NoStereo" option, as such is
+// not required for an HMD-centered API.
+typedef enum
+{
+ ovrEye_Left = 0,
+ ovrEye_Right = 1,
+ ovrEye_Count = 2
+} ovrEyeType;
+
+
+// Handle to HMD; returned by ovrHmd_Create.
+typedef struct ovrHmdStruct* ovrHmd;
+
+// This is a complete descriptor of the HMD.
+typedef struct ovrHmdDesc_
+{
+ ovrHmd Handle; // Handle of this HMD.
+ ovrHmdType Type;
+
+ // Name string describing the product: "Oculus Rift DK1", etc.
+ const char* ProductName;
+ const char* Manufacturer;
+
+ // Capability bits described by ovrHmdCaps.
+ unsigned int HmdCaps;
+ // Capability bits described by ovrSensorCaps.
+ unsigned int SensorCaps;
+ // Capability bits described by ovrDistortionCaps.
+ unsigned int DistortionCaps;
+
+ // Resolution of the entire HMD screen (for both eyes) in pixels.
+ ovrSizei Resolution;
+ // Where monitor window should be on screen or (0,0).
+ ovrVector2i WindowsPos;
+
+ // These define the recommended and maximum optical FOVs for the HMD.
+ ovrFovPort DefaultEyeFov[ovrEye_Count];
+ ovrFovPort MaxEyeFov[ovrEye_Count];
+
+ // Preferred eye rendering order for best performance.
+ // Can help reduce latency on sideways-scanned screens.
+ ovrEyeType EyeRenderOrder[ovrEye_Count];
+
+ // Display that HMD should present on.
+ // TBD: It may be good to remove this information relying on WidowPos instead.
+ // Ultimately, we may need to come up with a more convenient alternative,
+ // such as a API-specific functions that return adapter, ot something that will
+ // work with our monitor driver.
+
+ // Windows: "\\\\.\\DISPLAY3", etc. Can be used in EnumDisplaySettings/CreateDC.
+ const char* DisplayDeviceName;
+ // MacOS
+ int DisplayId;
+} ovrHmdDesc;
+
+// Describes the type of positional tracking being done.
+/*
+typedef enum
+{
+ovrPose_None,
+ovrPose_HeadModel,
+ovrPose_Positional
+} ovrPoseType;
+*/
+
+
+// Bit flags describing the current status of sensor tracking.
+typedef enum
+{
+ ovrStatus_OrientationTracked = 0x0001, // Orientation is currently tracked (connected and in use).
+ ovrStatus_PositionTracked = 0x0002, // Position is currently tracked (FALSE if out of range).
+ ovrStatus_PositionConnected = 0x0020, // Position tracking HW is connected.
+ ovrStatus_HmdConnected = 0x0080 // HMD Display is available & connected.
+} ovrStatusBits;
+
+
+// State of the sensor at a given absolute time.
+typedef struct ovrSensorState_
+{
+ // Predicted pose configuration at requested absolute time.
+ // One can determine the time difference between predicted and actual
+ // readings by comparing ovrPoseState.TimeInSeconds.
+ ovrPoseStatef Predicted;
+ // Actual recorded pose configuration based on the sensor sample at a
+ // moment closest to the requested time.
+ ovrPoseStatef Recorded;
+
+ // Sensor temperature reading, in degrees Celsius, as sample time.
+ float Temperature;
+ // Sensor status described by ovrStatusBits.
+ unsigned int StatusFlags;
+} ovrSensorState;
+
+// For now.
+// TBD: Decide if this becomes a part of HMDDesc
+typedef struct ovrSensorDesc_
+{
+ // HID Vendor and ProductId of the device.
+ short VendorId;
+ short ProductId;
+ // Sensor (and display) serial number.
+ char SerialNumber[24];
+} ovrSensorDesc;
+
+
+
+// Frame data reported by ovrHmd_BeginFrameTiming().
+typedef struct ovrFrameTiming_
+{
+ // The amount of time that has passed since the previous frame returned
+ // BeginFrameSeconds value, usable for movement scaling.
+ // This will be clamped to no more than 0.1 seconds to prevent
+ // excessive movement after pauses for loading or initialization.
+ float DeltaSeconds;
+
+ // It is generally expected that the following hold:
+ // ThisFrameSeconds < TimewarpPointSeconds < NextFrameSeconds <
+ // EyeScanoutSeconds[EyeOrder[0]] <= ScanoutMidpointSeconds <= EyeScanoutSeconds[EyeOrder[1]]
+
+ // Absolute time value of when rendering of this frame began or is expected to
+ // begin; generally equal to NextFrameSeconds of the previous frame. Can be used
+ // for animation timing.
+ double ThisFrameSeconds;
+ // Absolute point when IMU expects to be sampled for this frame.
+ double TimewarpPointSeconds;
+ // Absolute time when frame Present + GPU Flush will finish, and the next frame starts.
+ double NextFrameSeconds;
+
+ // Time when when half of the screen will be scanned out. Can be passes as a prediction
+ // value to ovrHmd_GetSensorState() go get general orientation.
+ double ScanoutMidpointSeconds;
+ // Timing points when each eye will be scanned out to display. Used for rendering each eye.
+ double EyeScanoutSeconds[2];
+
+} ovrFrameTiming;
+
+
+
+// Rendering information for each eye, computed by either ovrHmd_ConfigureRendering().
+// or ovrHmd_GetRenderDesc() based on the specified Fov.
+// Note that the rendering viewport is not included here as it can be
+// specified separately and modified per frame though:
+// (a) calling ovrHmd_GetRenderScaleAndOffset with game-rendered api,
+// or (b) passing different values in ovrTexture in case of SDK-rendered distortion.
+typedef struct ovrEyeRenderDesc_
+{
+ ovrEyeType Eye;
+ ovrFovPort Fov;
+ ovrRecti DistortedViewport; // Distortion viewport
+ ovrVector2f PixelsPerTanAngleAtCenter; // How many display pixels will fit in tan(angle) = 1.
+ ovrVector3f ViewAdjust; // Translation to be applied to view matrix.
+} ovrEyeRenderDesc;
+
+
+//-----------------------------------------------------------------------------------
+// ***** Platform-independent Rendering Configuration
+
+// These types are used to hide platform-specific details when passing
+// render device, OS and texture data to the APIs.
+//
+// The benefit of having these wrappers vs. platform-specific API functions is
+// that they allow game glue code to be portable. A typical example is an
+// engine that has multiple back ends, say GL and D3D. Portable code that calls
+// these back ends may also use LibOVR. To do this, back ends can be modified
+// to return portable types such as ovrTexture and ovrRenderAPIConfig.
+
+typedef enum
+{
+ ovrRenderAPI_None,
+ ovrRenderAPI_OpenGL,
+ ovrRenderAPI_Android_GLES, // May include extra native window pointers, etc.
+ ovrRenderAPI_D3D9,
+ ovrRenderAPI_D3D10,
+ ovrRenderAPI_D3D11,
+ ovrRenderAPI_Count
+} ovrRenderAPIType;
+
+// Platform-independent part of rendering API-configuration data.
+// It is a part of ovrRenderAPIConfig, passed to ovrHmd_Configure.
+typedef struct ovrRenderAPIConfigHeader_
+{
+ ovrRenderAPIType API;
+ ovrSizei RTSize;
+ int Multisample;
+} ovrRenderAPIConfigHeader;
+
+typedef struct ovrRenderAPIConfig_
+{
+ ovrRenderAPIConfigHeader Header;
+ uintptr_t PlatformData[8];
+} ovrRenderAPIConfig;
+
+// Platform-independent part of eye texture descriptor.
+// It is a part of ovrTexture, passed to ovrHmd_EndFrame.
+// - If RenderViewport is all zeros, will be used.
+typedef struct ovrTextureHeader_
+{
+ ovrRenderAPIType API;
+ ovrSizei TextureSize;
+ ovrRecti RenderViewport; // Pixel viewport in texture that holds eye image.
+} ovrTextureHeader;
+
+typedef struct ovrTexture_
+{
+ ovrTextureHeader Header;
+ uintptr_t PlatformData[8];
+} ovrTexture;
+
+
+// -----------------------------------------------------------------------------------
+// ***** API Interfaces
+
+// Basic steps to use the API:
+//
+// Setup:
+// 1. ovrInitialize();
+// 2. ovrHMD hmd = ovrHmd_Create(0); ovrHmd_GetDesc(hmd, &hmdDesc);
+// 3. Use hmdDesc and ovrHmd_GetFovTextureSize() to determine graphics configuration.
+// 4. Call ovrHmd_StartSensor() to configure and initialize tracking.
+// 5. Call ovrHmd_ConfigureRendering() to setup graphics for SDK rendering,
+// which is the preferred approach.
+// Please refer to "Game-Side Rendering" below if you prefer to do that instead.
+// 5. Allocate textures as needed.
+//
+// Game Loop:
+// 6. Call ovrHmd_BeginFrame() to get frame timing and orientation information.
+// 7. Render each eye in between ovrHmd_BeginEyeRender and ovrHmd_EndEyeRender calls,
+// providing the result texture to the API.
+// 8. Call ovrHmd_EndFrame() to render distorted textures to the back buffer
+// and present them on the Hmd.
+//
+// Shutdown:
+// 9. ovrHmd_Destroy(hmd)
+// 10. ovr_Shutdown()
+//
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ // Library init/shutdown, must be called around all other OVR code.
+ // No other functions calls are allowed before ovr_Initialize succeeds or after ovr_Shutdown.
+ OVR_EXPORT ovrBool ovr_Initialize();
+ OVR_EXPORT void ovr_Shutdown();
+
+
+ // Detects or re-detects HMDs and reports the total number detected.
+ // Users can get information about each HMD by calling ovrHmd_Create with an index.
+ OVR_EXPORT int ovrHmd_Detect();
+
+
+ // Creates a handle to an HMD and optionally fills in data about it.
+ // Index can [0 .. ovrHmd_Detect()-1]; index mappings can cange after each ovrHmd_Detect call.
+ // If not null, returned handle must be freed with ovrHmd_Destroy.
+ OVR_EXPORT ovrHmd ovrHmd_Create(int index);
+ OVR_EXPORT void ovrHmd_Destroy(ovrHmd hmd);
+
+ // Creates a "fake" HMD used for debugging only. This is not tied to specific hardware,
+ // but may be used to debug some of the related rendering.
+ OVR_EXPORT ovrHmd ovrHmd_CreateDebug(ovrHmdType type);
+
+
+ // Returns last error for HMD state. Returns null for no error.
+ // String is valid until next call or GetLastError or HMD is destroyed.
+ // Pass null hmd to get global error (for create, etc).
+ OVR_EXPORT const char* ovrHmd_GetLastError(ovrHmd hmd);
+
+
+ //-------------------------------------------------------------------------------------
+
+ // Returns capability bits that are enabled at this time; described by ovrHmdCaps.
+ // Note that this value is different font ovrHmdDesc::HmdCaps, which describes what
+ // capabilities are available.
+ OVR_EXPORT unsigned int ovrHmd_GetEnabledCaps(ovrHmd hmd);
+
+ // Modifies capability bits described by ovrHmdCaps that can be modified,
+ // such as ovrHmd_LowPersistance.
+ OVR_EXPORT void ovrHmd_SetEnabledCaps(ovrHmd hmd, unsigned int hmdCaps);
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Sensor Interface
+
+ // All sensor interface functions are thread-safe, allowing sensor state to be sampled
+ // from different threads.
+ // Starts sensor sampling, enabling specified capabilities, described by ovrSensorCaps.
+ // - supportedSensorCaps specifies support that is requested. The function will succeed
+ // even if these caps are not available (i.e. sensor or camera is unplugged). Support
+ // will automatically be enabled if such device is plugged in later. Software should
+ // check ovrSensorState.StatusFlags for real-time status.
+ // - requiredSensorCaps specify sensor capabilities required at the time of the call.
+ // If they are not available, the function will fail. Pass 0 if only specifying
+ // supportedSensorCaps.
+ OVR_EXPORT ovrBool ovrHmd_StartSensor(ovrHmd hmd, unsigned int supportedSensorCaps,
+ unsigned int requiredSensorCaps);
+ // Stops sensor sampling, shutting down internal resources.
+ OVR_EXPORT void ovrHmd_StopSensor(ovrHmd hmd);
+ // Resets sensor orientation.
+ OVR_EXPORT void ovrHmd_ResetSensor(ovrHmd hmd);
+
+ // Returns sensor state reading based on the specified absolute system time.
+ // Pass absTime value of 0.0 to request the most recent sensor reading; in this case
+ // both PredictedPose and SamplePose will have the same value.
+ // ovrHmd_GetEyePredictedSensorState relies on this internally.
+ // This may also be used for more refined timing of FrontBuffer rendering logic, etc.
+ OVR_EXPORT ovrSensorState ovrHmd_GetSensorState(ovrHmd hmd, double absTime);
+
+ // Returns information about a sensor.
+ // Only valid after StartSensor.
+ OVR_EXPORT ovrBool ovrHmd_GetSensorDesc(ovrHmd hmd, ovrSensorDesc* descOut);
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Graphics Setup
+
+ // Fills in description about HMD; this is the same as filled in by ovrHmd_Create.
+ OVR_EXPORT void ovrHmd_GetDesc(ovrHmd hmd, ovrHmdDesc* desc);
+
+ // Calculates texture size recommended for rendering one eye within HMD, given FOV cone.
+ // Higher FOV will generally require larger textures to maintain quality.
+ // - pixelsPerDisplayPixel specifies that number of render target pixels per display
+ // pixel at center of distortion; 1.0 is the default value. Lower values
+ // can improve performance.
+ OVR_EXPORT ovrSizei ovrHmd_GetFovTextureSize(ovrHmd hmd, ovrEyeType eye, ovrFovPort fov,
+ float pixelsPerDisplayPixel);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Rendering API Thread Safety
+
+ // All of rendering APIs, inclusing Configure and frame functions are *NOT
+ // Thread Safe*. It is ok to use ConfigureRendering on one thread and handle
+ // frames on another thread, but explicit synchronization must be done since
+ // functions that depend on configured state are not reentrant.
+ //
+ // As an extra requirement, any of the following calls must be done on
+ // the render thread, which is the same thread that calls ovrHmd_BeginFrame
+ // or ovrHmd_BeginFrameTiming.
+ // - ovrHmd_EndFrame
+ // - ovrHmd_BeginEyeRender
+ // - ovrHmd_EndEyeRender
+ // - ovrHmd_GetFramePointTime
+ // - ovrHmd_GetEyePose
+ // - ovrHmd_GetEyeTimewarpMatrices
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** SDK-Rendering Functions
+
+ // These functions support rendering of distortion by the SDK through direct
+ // access to the underlying rendering HW, such as D3D or GL.
+ // This is the recommended approach, as it allows for better support or future
+ // Oculus hardware and a range of low-level optimizations.
+
+
+ // Configures rendering; fills in computed render parameters.
+ // This function can be called multiple times to change rendering settings.
+ // The users pass in two eye view descriptors that are used to
+ // generate complete rendering information for each eye in eyeRenderDescOut[2].
+ //
+ // - apiConfig provides D3D/OpenGL specific parameters. Pass null
+ // to shutdown rendering and release all resources.
+ // - distortionCaps describe distortion settings that will be applied.
+ //
+ OVR_EXPORT ovrBool ovrHmd_ConfigureRendering(ovrHmd hmd,
+ const ovrRenderAPIConfig* apiConfig,
+ unsigned int distortionCaps,
+ const ovrFovPort eyeFovIn[2],
+ ovrEyeRenderDesc eyeRenderDescOut[2]);
+
+
+ // Begins a frame, returning timing and orientation information useful for simulation.
+ // This should be called in the beginning of game rendering loop (on render thread).
+ // This function relies on ovrHmd_BeginFrameTiming for some of its functionality.
+ // Pass 0 for frame index if not using GetFrameTiming.
+ OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrame(ovrHmd hmd, unsigned int frameIndex);
+
+ // Ends frame, rendering textures to frame buffer. This may perform distortion and scaling
+ // internally, assuming is it not delegated to another thread.
+ // Must be called on the same thread as BeginFrame. Calls ovrHmd_BeginEndTiming internally.
+ // *** This Function will to Present/SwapBuffers and potentially wait for GPU Sync ***.
+ OVR_EXPORT void ovrHmd_EndFrame(ovrHmd hmd);
+
+
+ // Marks beginning of eye rendering. Must be called on the same thread as BeginFrame.
+ // This function uses ovrHmd_GetEyePose to predict sensor state that should be
+ // used rendering the specified eye.
+ // This combines current absolute time with prediction that is appropriate for this HMD.
+ // It is ok to call ovrHmd_BeginEyeRender() on both eyes before calling ovrHmd_EndEyeRender.
+ // If rendering one eye at a time, it is best to render eye specified by
+ // HmdDesc.EyeRenderOrder[0] first.
+ OVR_EXPORT ovrPosef ovrHmd_BeginEyeRender(ovrHmd hmd, ovrEyeType eye);
+
+ // Marks the end of eye rendering and submits the eye texture for display after it is ready.
+ // Rendering viewport within the texture can change per frame if necessary.
+ // Specified texture may be presented immediately or wait until ovrHmd_EndFrame based
+ // on the implementation. The API performs distortion and scaling internally.
+ // 'renderPose' will typically be the value returned from ovrHmd_BeginEyeRender, but can
+ // be different if a different pose was used for rendering.
+ OVR_EXPORT void ovrHmd_EndEyeRender(ovrHmd hmd, ovrEyeType eye,
+ ovrPosef renderPose, ovrTexture* eyeTexture);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Game-Side Rendering Functions
+
+ // These functions provide distortion data and render timing support necessary to allow
+ // game rendering of distortion. Game-side rendering involves the following steps:
+ //
+ // 1. Setup ovrEyeDesc based on desired texture size and Fov.
+ // Call ovrHmd_GetRenderDesc to get the necessary rendering parameters for each eye.
+ //
+ // 2. Use ovrHmd_CreateDistortionMesh to generate distortion mesh.
+ //
+ // 3. Use ovrHmd_BeginFrameTiming, ovrHmd_GetEyePose and ovrHmd_BeginFrameTiming
+ // in the rendering loop to obtain timing and predicted view orientation for
+ // each eye.
+ // - If relying on timewarp, use ovr_WaitTillTime after rendering+flush, followed
+ // by ovrHmd_GetEyeTimewarpMatrices to obtain timewarp matrices used
+ // in distortion pixel shader to reduce latency.
+ //
+
+ // Computes distortion viewport, view adjust and other rendering for the specified
+ // eye. This can be used instead of ovrHmd_ConfigureRendering to help setup rendering on
+ // the game side.
+ OVR_EXPORT ovrEyeRenderDesc ovrHmd_GetRenderDesc(ovrHmd hmd,
+ ovrEyeType eyeType, ovrFovPort fov);
+
+
+ // Describes a vertex used for distortion; this is intended to be converted into
+ // the engine-specific format.
+ // Some fields may be unused based on ovrDistortionCaps selected. TexG and TexB, for example,
+ // are not used if chromatic correction is not requested.
+ typedef struct ovrDistortionVertex_
+ {
+ ovrVector2f Pos;
+ float TimeWarpFactor; // Lerp factor between time-warp matrices. Can be encoded in Pos.z.
+ float VignetteFactor; // Vignette fade factor. Can be encoded in Pos.w.
+ ovrVector2f TexR;
+ ovrVector2f TexG;
+ ovrVector2f TexB;
+ } ovrDistortionVertex;
+
+ // Describes a full set of distortion mesh data, filled in by ovrHmd_CreateDistortionMesh.
+ // Contents of this data structure, if not null, should be freed by ovrHmd_DestroyDistortionMesh.
+ typedef struct ovrDistortionMesh_
+ {
+ ovrDistortionVertex* pVertexData;
+ unsigned long* pIndexData;
+ unsigned int VertexCount;
+ unsigned int IndexCount;
+ } ovrDistortionMesh;
+
+ // Generate distortion mesh per eye.
+ // Distortion capabilities will depend on 'distortionCaps' flags; user should rely on
+ // appropriate shaders based on their settings.
+ // Distortion mesh data will be allocated and stored into the ovrDistortionMesh data structure,
+ // which should be explicitly freed with ovrHmd_DestroyDistortionMesh.
+ // Users should call ovrHmd_GetRenderScaleAndOffset to get uvScale and Offset values for rendering.
+ // The function shouldn't fail unless theres is a configuration or memory error, in which case
+ // ovrDistortionMesh values will be set to null.
+ OVR_EXPORT ovrBool ovrHmd_CreateDistortionMesh(ovrHmd hmd,
+ ovrEyeType eyeType, ovrFovPort fov,
+ unsigned int distortionCaps,
+ ovrDistortionMesh *meshData);
+
+ // Frees distortion mesh allocated by ovrHmd_GenerateDistortionMesh. meshData elements
+ // are set to null and zeroes after the call.
+ OVR_EXPORT void ovrHmd_DestroyDistortionMesh(ovrDistortionMesh* meshData);
+
+ // Computes updated 'uvScaleOffsetOut' to be used with a distortion if render target size or
+ // viewport changes after the fact. This can be used to adjust render size every frame, if desired.
+ OVR_EXPORT void ovrHmd_GetRenderScaleAndOffset(ovrFovPort fov,
+ ovrSizei textureSize, ovrRecti renderViewport,
+ ovrVector2f uvScaleOffsetOut[2]);
+
+
+ // Thread-safe timing function for the main thread. Caller should increment frameIndex
+ // with every frame and pass the index to RenderThread for processing.
+ OVR_EXPORT ovrFrameTiming ovrHmd_GetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+ // Called at the beginning of the frame on the Render Thread.
+ // Pass frameIndex == 0 if ovrHmd_GetFrameTiming isn't being used. Otherwise,
+ // pass the same frame index as was used for GetFrameTiming on the main thread.
+ OVR_EXPORT ovrFrameTiming ovrHmd_BeginFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+ // Marks the end of game-rendered frame, tracking the necessary timing information. This
+ // function must be called immediately after Present/SwapBuffers + GPU sync. GPU sync is important
+ // before this call to reduce latency and ensure proper timing.
+ OVR_EXPORT void ovrHmd_EndFrameTiming(ovrHmd hmd);
+
+ // Initializes and resets frame time tracking. This is typically not necessary, but
+ // is helpful if game changes vsync state or video mode. vsync is assumed to be on if this
+ // isn't called. Resets internal frame index to the specified number.
+ OVR_EXPORT void ovrHmd_ResetFrameTiming(ovrHmd hmd, unsigned int frameIndex);
+
+
+ // Predicts and returns Pose that should be used rendering the specified eye.
+ // Must be called between ovrHmd_BeginFrameTiming & ovrHmd_EndFrameTiming.
+ OVR_EXPORT ovrPosef ovrHmd_GetEyePose(ovrHmd hmd, ovrEyeType eye);
+
+ // Computes timewarp matrices used by distortion mesh shader, these are used to adjust
+ // for orientation change since the last call to ovrHmd_GetEyePose for this eye.
+ // The ovrDistortionVertex::TimeWarpFactor is used to blend between the matrices,
+ // usually representing two different sides of the screen.
+ // Must be called on the same thread as ovrHmd_BeginFrameTiming.
+ OVR_EXPORT void ovrHmd_GetEyeTimewarpMatrices(ovrHmd hmd, ovrEyeType eye,
+ ovrPosef renderPose, ovrMatrix4f twmOut[2]);
+
+
+
+ //-------------------------------------------------------------------------------------
+ // ***** Stateless math setup functions
+
+ // Used to generate projection from ovrEyeDesc::Fov.
+ OVR_EXPORT ovrMatrix4f ovrMatrix4f_Projection(ovrFovPort fov,
+ float znear, float zfar, ovrBool rightHanded);
+
+ // Used for 2D rendering, Y is down
+ // orthoScale = 1.0f / pixelsPerTanAngleAtCenter
+ // orthoDistance = distance from camera, such as 0.8m
+ OVR_EXPORT ovrMatrix4f ovrMatrix4f_OrthoSubProjection(ovrMatrix4f projection, ovrVector2f orthoScale,
+ float orthoDistance, float eyeViewAdjustX);
+
+ // Returns global, absolute high-resolution time in seconds. This is the same
+ // value as used in sensor messages.
+ OVR_EXPORT double ovr_GetTimeInSeconds();
+
+ // Waits until the specified absolute time.
+ OVR_EXPORT double ovr_WaitTillTime(double absTime);
+
+
+
+ // -----------------------------------------------------------------------------------
+ // ***** Latency Test interface
+
+ // Does latency test processing and returns 'TRUE' if specified rgb color should
+ // be used to clear the screen.
+ OVR_EXPORT ovrBool ovrHmd_ProcessLatencyTest(ovrHmd hmd, unsigned char rgbColorOut[3]);
+
+ // Returns non-null string once with latency test result, when it is available.
+ // Buffer is valid until next call.
+ OVR_EXPORT const char* ovrHmd_GetLatencyTestResult(ovrHmd hmd);
+
+ // Returns latency for HMDs that support internal latency testing via the
+ // pixel-read back method (-1 for invalid or N/A)
+ OVR_EXPORT double ovrHmd_GetMeasuredLatencyTest2(ovrHmd hmd);
+
+
+ // -----------------------------------------------------------------------------------
+ // ***** Property Access
+
+ // NOTICE: This is experimental part of API that is likely to go away or change.
+
+ // These allow accessing different properties of the HMD and profile.
+ // Some of the properties may go away with profile/HMD versions, so software should
+ // use defaults and/or proper fallbacks.
+ //
+
+ // For now, access profile entries; this will change.
+#if !defined(OVR_KEY_USER)
+
+#define OVR_KEY_USER "User"
+#define OVR_KEY_NAME "Name"
+#define OVR_KEY_GENDER "Gender"
+#define OVR_KEY_PLAYER_HEIGHT "PlayerHeight"
+#define OVR_KEY_EYE_HEIGHT "EyeHeight"
+#define OVR_KEY_IPD "IPD"
+#define OVR_KEY_NECK_TO_EYE_HORIZONTAL "NeckEyeHori"
+#define OVR_KEY_NECK_TO_EYE_VERTICAL "NeckEyeVert"
+
+#define OVR_DEFAULT_GENDER "Male"
+#define OVR_DEFAULT_PLAYER_HEIGHT 1.778f
+#define OVR_DEFAULT_EYE_HEIGHT 1.675f
+#define OVR_DEFAULT_IPD 0.064f
+#define OVR_DEFAULT_NECK_TO_EYE_HORIZONTAL 0.12f
+#define OVR_DEFAULT_NECK_TO_EYE_VERTICAL 0.12f
+#endif
+
+
+ // Get float property. Returns first element if property is a float array.
+ // Returns defaultValue if property doesn't exist.
+ OVR_EXPORT float ovrHmd_GetFloat(ovrHmd hmd, const char* propertyName, float defaultVal);
+
+ // Modify float property; false if property doesn't exist or is readonly.
+ OVR_EXPORT ovrBool ovrHmd_SetFloat(ovrHmd hmd, const char* propertyName, float value);
+
+
+ // Get float[] property. Returns the number of elements filled in, 0 if property doesn't exist.
+ // Maximum of arraySize elements will be written.
+ OVR_EXPORT unsigned int ovrHmd_GetFloatArray(ovrHmd hmd, const char* propertyName,
+ float values[], unsigned int arraySize);
+
+ // Modify float[] property; false if property doesn't exist or is readonly.
+ OVR_EXPORT ovrBool ovrHmd_SetFloatArray(ovrHmd hmd, const char* propertyName,
+ float values[], unsigned int arraySize);
+
+ // Get string property. Returns first element if property is a string array.
+ // Returns defaultValue if property doesn't exist.
+ // String memory is guaranteed to exist until next call to GetString or GetStringArray, or HMD is destroyed.
+ OVR_EXPORT const char* ovrHmd_GetString(ovrHmd hmd, const char* propertyName,
+ const char* defaultVal);
+
+ // Returns array size of a property, 0 if property doesn't exist.
+ // Can be used to check existence of a property.
+ OVR_EXPORT unsigned int ovrHmd_GetArraySize(ovrHmd hmd, const char* propertyName);
+
+
+ //OVR_EXPORT void DMKeepAlive(void);
+
+ /*
+ ** 调用这个函数判断设备设备插入状态是否改变
+ ** 如果返回1则表示发生变化
+ ** 返回0则表示未发生变换
+ */
+ OVR_EXPORT int DM_IsConnectionChanged(void);
+
+ /*
+ ** 调用这个函数判断设备是否插入该函数只返回当前设备连接状态不做任何操作
+ ** 如果返回1则表示设备已经插入
+ ** 返回0则表示已经拔出
+ */
+ OVR_EXPORT int DM_IsConnected(void);
+
+ /*
+ ** 调用这个函数执行陀螺仪校准命令,每调用一次,驱动层会向Hmd发送陀螺仪校准命令
+ ** 如果返回1则表示驱动层发送命令成功,SetFeatureReport成功
+ ** 返回0则表示发送失败 SetFeatureReport失败
+ ** 返回2表示驱动层错误: 说明USB HID句柄未初始化成功,指针为空。表示设备未插入或者驱动层未正常初始化
+ */
+ OVR_EXPORT int DM_CalibrateGyro(void);
+
+ /*
+ ** 调用这个函数执行进入DFU命令,每调用一次,驱动层会向Hmd发送进入DFU升级命令
+ ** 如果返回1则表示驱动层发送命令成功,SetFeatureReport成功
+ ** 返回0则表示发送失败 SetFeatureReport失败
+ ** 返回2表示驱动层错误: 说明USB HID句柄未初始化成功,指针为空。表示设备未插入或者驱动层未正常初始化
+ ** 注意发送DFU命令后,Hmd会立即进入DFU模式,USB会和当前驱动断开,除非再次以正常模式进行连接,否则该函数
+ ** 无法正常调用。
+ */
+ OVR_EXPORT int DM_EnterDFUMode(void);
+
+
+ /*
+ ** 调用该函数,发送命令设置Hmd的显示模式,如果为TRUE,Hmd则进入分屏模式(双屏模式),默认设置为FALSE,单屏模式显示
+ ** 返回0表示USB的SetFeatureReport失败,返回2表示:头显断开或者是初始化错误。返回1表示成功
+ */
+ OVR_EXPORT int DM_IsDoubleScreen(bool state);
+
+ /*
+ * 调用该函数设置屏幕背光亮度,返回1表示成功。返回-1表示亮度范围错误。亮度范围0
+#include
+#include
+#include
+#include "PipeHMD.h"
+#include "OVR_CAPI.h"
+#include
+
+
+using namespace std;
+namespace DMPipe
+{
+ PipeHMD::PipeHMD(string sname) :m_hPipe(INVALID_HANDLE_VALUE)
+ {
+ this->name = sname;
+ }
+ PipeHMD::~PipeHMD()
+ {
+ PipeHMD::Free();
+ }
+ BOOL PipeHMD::IsOpen()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_IS_OPEN;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ ovrSensorState PipeHMD::GetSensorData()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ ovrSensorState * result = (ovrSensorState *)&reciveBuf[0];
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_GET_DATA;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(ovrSensorState));
+ return result[0];
+ }
+ SensorPureData PipeHMD::GetPureSensorData()
+ {
+ memset(reciveBuf, 0, sizeof(BOOL));
+ SensorPureData * result = (SensorPureData *)&reciveBuf[0];
+ return result[0];
+ }
+ BOOL PipeHMD::EnterDFUMode()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_ENTER_DFU_MODE;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ BOOL PipeHMD::Calibration()
+ {
+ unsigned int* temp_uint;
+ memset(reciveBuf, 0, sizeof(BOOL));
+ BOOL * result = (BOOL *)&reciveBuf[0];
+ result[0] = FALSE;
+ temp_uint = (unsigned int*)&writeBuf[0];
+ temp_uint[0] = COMMAND_DEVICE_CALIBRATION;
+ temp_uint[1] = 0;
+ temp_uint[2] = 0;
+ PipeProcess(sizeof(BOOL));
+ return result[0];
+ }
+ void PipeHMD::SetName(string sname)
+ {
+ this->name = sname;
+ }
+}
+
diff --git a/4.Software/GeekIMUDriver 1.1/Src/PipeHMD.h b/4.Software/GeekIMUDriver 1.1/Src/PipeHMD.h
new file mode 100644
index 0000000..68b801f
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/PipeHMD.h
@@ -0,0 +1,151 @@
+#ifndef _PIPE_H_
+#define _PIPE_H_
+
+#pragma once
+
+#include
+#include
+#include "OVR_CAPI.h"
+using namespace std;
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_DATA 2
+#define COMMAND_DEVICE_CALIBRATION 3
+#define COMMAND_DEVICE_GET_PURE_DATA 4
+#define COMMAND_DEVICE_ENTER_DFU_MODE 11
+
+#define ENTER_DFU_MODE_SUCCESS 1
+#define ENTER_DFU_MODE_FAILED 0
+#define CALIBRATION_SUCCESS 1
+#define CALIBRATION_FAILED 0
+
+namespace DMPipe{
+ class PipeHMD
+ {
+ public:
+ PipeHMD() :m_hPipe(INVALID_HANDLE_VALUE){}
+ ~PipeHMD();
+ PipeHMD(std::string sname);
+ BOOL IsOpen();
+ ovrSensorState GetSensorData();
+ SensorPureData GetPureSensorData();
+ BOOL EnterDFUMode();
+ BOOL Calibration();
+ inline LPCTSTR GetName()
+ {
+ return name.c_str();
+ }
+ void SetName(std::string sname);
+ private:
+ std::string name;
+ unsigned char reciveBuf[512];
+ unsigned char writeBuf[512];
+ DWORD readLenth;
+ DWORD writeLenth;
+ HANDLE m_hPipe;
+ BOOL isConnection;
+ inline void Init()
+ {
+ for (;;)
+ {
+ m_hPipe = CreateFile(
+ GetName(), // pipe name
+ GENERIC_READ | // read and write access
+ GENERIC_WRITE,
+ 0, // no sharing
+ NULL, // default security attributes
+ OPEN_EXISTING, // opens existing pipe
+ 0, // default attributes
+ NULL); // no template file
+
+ // Break if the pipe handle is valid.
+
+ if (m_hPipe != INVALID_HANDLE_VALUE)
+ {
+ isConnection = TRUE;
+ return;
+ }
+ // Exit if an error other than ERROR_PIPE_BUSY occurs.
+
+ if (GetLastError() != ERROR_PIPE_BUSY)
+ {
+ //char buf[255] = { 0 };
+ //printf(TEXT("Could not open pipe. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ return;
+ }
+
+ // All pipe instances are busy, so wait for 1 milliseconds.
+
+ if (!WaitNamedPipe(GetName(), 1))
+ {
+ //TimeLog("Could not open pipe: 1 millisecond wait timed out.");
+ return;
+ }
+ }
+
+ }
+ inline void Free()
+ {
+ if (m_hPipe == INVALID_HANDLE_VALUE)
+ {
+ isConnection = FALSE;
+ return;
+ }
+ else
+ {
+ if (CloseHandle(m_hPipe))
+ {
+ m_hPipe = INVALID_HANDLE_VALUE;
+ isConnection = FALSE;
+ }
+ }
+ }
+ inline void PipeProcess(DWORD sizeofrecive)
+ {
+ this->Init();
+ if (isConnection)
+ {
+ BOOL fSuccess = FALSE;
+ fSuccess = WriteFile(
+ m_hPipe, // pipe handle
+ writeBuf, // message
+ sizeof(unsigned int) * 3, // message length
+ &writeLenth, // bytes written
+ NULL); // not overlapped
+
+ if (!fSuccess)
+ {
+ char buf[255] = { 0 };
+ sprintf(buf, TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ goto freepipe;
+ }
+ //printf("\nMessage sent to server, receiving reply as follows:\n");
+ do
+ {
+ // Read from the pipe.
+ fSuccess = ReadFile(
+ m_hPipe, // pipe handle
+ reciveBuf, // buffer to receive reply
+ sizeofrecive, // size of buffer
+ &readLenth, // number of bytes read
+ NULL); // not overlapped
+ if (!fSuccess && GetLastError() != ERROR_MORE_DATA)
+ break;
+ } while (!fSuccess); // repeat loop if ERROR_MORE_DATA
+
+ if (!fSuccess)
+ {
+ char buf[255] = { 0 };
+ sprintf(buf, TEXT("ReadFile from pipe failed. GLE=%d\n"), GetLastError());
+ //TimeLog(buf);
+ goto freepipe;
+ }
+ freepipe:
+ this->Free();
+ }
+ }
+ };
+
+}
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/SensorImpl.cpp b/4.Software/GeekIMUDriver 1.1/Src/SensorImpl.cpp
new file mode 100644
index 0000000..14b4f50
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/SensorImpl.cpp
@@ -0,0 +1,595 @@
+/******************** (C) COPYRIGHT 2023 Geek************************************
+* File Name : SensorImpl.cpp
+* Current Version : V1.0
+* Author : zhanli
+* Date of Issued : 2023.09.10
+* Comments : GeekIMU 传感器实现模块
+********************************************************************************/
+/* Header File Including -----------------------------------------------------*/
+
+#include "windows.h"
+#include "SensorImpl.h"
+#include "stdio.h"
+#include "quaternion.h"
+#include "math.h"
+#include "UsbHid_CAPI.h"
+#include "MyCls.h"
+extern "C" FILE* fpdata;
+Quaternion GlobalQ;
+BOOL GlobalQ_Updating;
+float LocX,LocY,LocZ;
+float Yaw,Pitch,Roll;
+extern FILE* Getfpdata();
+extern int global_calibration_flag;
+extern int global_Show;
+UINT8 global_key[4] = { 0 };
+float gxc=0, gyc=0, gzc=0;
+int gyro_cali_count = 0;
+#define GYRO_CALIBRATION_SAMPLE_NUMBER 3000
+float gx0=0, gy0=0, gz0=0;
+BOOL GlobalMag_Updating = false;
+Vector3 GlobalMag = {0};
+static bool HmdStandByState;
+
+Quaternion CQ_DM = { 1, 0, 0, 0 };
+
+bool DM_Corrected = false;
+
+void MagFilter(float *mx,float *my,float *mz,float sita);
+void GyroComputeDrift(float *gx, float *gy, float *gz);
+
+void LowPassFilterYaw(float *z, float alpha);
+
+bool IsHmdIntoStandBy(float *Pitch, float *Roll, float dTime);
+
+/**----------------------------------------------------------------------
+* Function : UnpackSensor
+* Description : Oculus 数据解包
+* Date : 2023/09/10 logzhan : 重新整理代码
+*---------------------------------------------------------------------**/
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z)
+{
+ struct {INT32 x:21;} s;
+ *x = s.x = (buffer[0] << 13) | (buffer[1] << 5) | ((buffer[2] & 0xF8) >> 3);
+ *y = s.x = ((buffer[2] & 0x07) << 18) | (buffer[3] << 10) | (buffer[4] << 2) |
+ ((buffer[5] & 0xC0) >> 6);
+ *z = s.x = ((buffer[5] & 0x3F) << 15) | (buffer[6] << 7) | (buffer[7] >> 1);
+}
+
+Vector3 GetMagData()
+{
+ Vector3 v = { 0 };
+ static Vector3 VLast = { 0 };
+ if (!GlobalMag_Updating)
+ {
+ VLast = GlobalMag;
+ }
+ v = VLast;
+ return v;
+}
+
+void GetControllerSensor(unsigned char usb_input_buffer[])
+{
+ static UINT8 updatecnt = 0;
+ INT16 MagX,MagY,MagZ;
+ long GX,GY,GZ;
+ long AX,AY,AZ;
+ UINT NowTime;
+ float ax, ay, az, gx, gy, gz, mx, my, mz, mx1, my1, mz1;;
+ static float mxlast=0,mylast=0,mzlast=0;
+ static int Dtime = 0;
+ static UINT LastTime = 0;
+ float q0,q1,q2,q3;
+
+
+ NowTime = *(UINT16* )(usb_input_buffer+2);
+ if(LastTime != 0)
+ {
+ if(NowTime >= LastTime)
+ {
+ Dtime = NowTime - LastTime;
+ LastTime = NowTime;
+ }else
+ {
+ Dtime = (65535 - LastTime) + NowTime;
+ LastTime = NowTime;
+ }
+
+ }else
+ {
+ Dtime = 1;
+ LastTime = NowTime;
+ }
+
+ if (global_Show==5)
+ {
+ //clrscr();
+ back2zero();
+ printf("Hex数据\n\n");
+ for (int i = 0; i < 64; i++)
+ {
+ if ((i%16)==0)
+ {
+ printf("\n");
+ }
+ //if (global_debug)
+ printf("%2x ", usb_input_buffer[i]);
+
+ }
+ printf("\n");
+ }
+
+
+ MagX = *(INT16 *)(usb_input_buffer + 56);
+ MagY = *(INT16 *)(usb_input_buffer + 58);
+ MagZ = *(INT16 *)(usb_input_buffer + 60);
+
+ UnpackSensor(usb_input_buffer+8, &AX,&AY,&AZ);
+ UnpackSensor(usb_input_buffer+16, &GX,&GY,&GZ);
+
+
+ ax = (float)0.0001*AX;
+ ay = (float)0.0001*AY;
+ az = (float)0.0001*AZ;
+
+ gx = (float)0.0001*GX;
+ gy = (float)0.0001*GY;
+ gz = (float)0.0001*GZ;
+
+
+ printf("%f %f %f\n", ax, ay, az);
+
+ float x = 16.4 * 180 / 3.14159265358979323846F;
+
+ if (global_Show == 1)
+ {
+ printf("gx = %f,gy = %f gz =%f\n", gx*x, gy*x, gz*x);
+ }
+
+ GyroComputeDrift(&gx, &gy, &gz);
+
+ if (global_calibration_flag == 1)
+ {
+ if (gyro_cali_count > GYRO_CALIBRATION_SAMPLE_NUMBER)
+ {
+ gyro_cali_count = 0;
+ gxc = gyc = gzc = 0;
+ }
+ gyro_cali_count++;
+ gxc += gx*x;
+ gyc += gy*x;
+ gzc += gz*x;
+ if (gyro_cali_count == GYRO_CALIBRATION_SAMPLE_NUMBER)
+ {
+ gx0 = gxc / gyro_cali_count;
+ gy0 = gyc / gyro_cali_count;
+ gz0 = gzc / gyro_cali_count;
+ gyro_cali_count++;
+ global_calibration_flag = 0;
+ printf("%f %f %f\n", gx0, gy0, gz0);
+ }
+ }
+
+
+ global_key[0] = usb_input_buffer[24];
+ global_key[3] = usb_input_buffer[27];
+
+
+ mx = (float)MagX / 16;
+ my = (float)MagY / 16;
+ mz = (float)MagZ / 16;
+ if (global_calibration_flag==3)
+ {
+ GlobalMag_Updating = true;
+ mx = (float)MagX;
+ my = (float)MagY;
+ mz = (float)MagZ;
+
+ GlobalMag.x = (float)MagX;
+ GlobalMag.y = (float)MagY;
+ GlobalMag.z = (float)MagZ;
+ GlobalMag_Updating = false;
+ }
+
+
+ if(mxlast == 0&&mylast == 0&&mzlast == 0)
+ {
+ mxlast = mx;
+ mylast = my;
+ mzlast = mz;
+
+ MagFilter(&mx, &my, &mz, 0.95f);
+ for (int i = 0; i < 200; i++)
+ AHRSupdate(0, 0, 0, az, ax, ay, mz, mx, my, 1, Dtime * 400);
+ }
+ else
+ {
+ updatecnt++;
+ if (updatecnt > 10)
+ updatecnt = 0;
+ if (mx == mxlast&&my == my&&mz == mzlast && updatecnt < 10)
+ {
+ AHRSupdate(gz,gx,gy,az,ax,ay,mz,mx,my,1,Dtime);
+
+ }
+ else
+ {
+ mxlast = mx;
+ mylast = my;
+ mzlast = mz;
+
+ MagFilter(&mx,&my,&mz,0.95f);
+
+ AHRSupdate(gz,gx,gy,az,ax,ay,mz,mx,my,1,Dtime);
+ }
+ }
+}
+
+
+/**********************************************************************************************************
+* Function Name : AHRSupdate
+* 输入 : 三轴加速度计、陀螺仪、磁力计的值
+* 描述 :加速度计、陀螺仪、磁力计融合得到的欧拉角
+
+ 1)这个算法基于标准笛卡尔右手坐标系,z轴朝上,x轴朝人,y轴朝右
+ 2)传感器的方向需要变换到和改算法定义的坐标轴相同。
+
+* 修改 :2016/11/5 : 根据磁力计采样率比较低的特点,设置了2种模式:1、融合磁力计 2、不融合磁力计
+ 2016/11/6 :改进了四元数更新算法,原来的四元数更新算法会导致累计误差。
+ 2016/11/9 : 规定了本算法运行的坐标轴,重写了四元数到欧拉角变换的代码。
+***********************************************************************************************************/
+
+
+float q0 = 1, q1 = 0, q2 = 0, q3 = 0;
+float exInt = 0, eyInt = 0, ezInt = 0; /*缩放积分误差 */
+#define Kp 2.5f /*加速度计和磁力计对陀螺仪的比例修正参数 */
+#define Ki 0.005f /*加速度计和磁力计对陀螺仪的积分修正参数 */
+#define Kd 0.0f
+static int AHRS_Init = 0;
+
+
+void ResetAHRS()
+{
+ AHRS_Init = 0; q0 = 1; q1 = 0; q2 = 0; q3 = 0;
+}
+
+void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz, char useMag, int Dtime)
+{
+ /*原算法的定义*/
+ float norm, halfT;
+ float hx, hy, hz, bz, by;
+ float vx, vy, vz, wx, wy, wz;
+ float ex, ey, ez;
+ float qw, qx, qy, qz;
+ float AccelAjust, MagAjust;
+ /*方便之后的程序使用,减少计算时间*/
+ float q0q0 = q0*q0; float q0q1 = q0*q1;
+ float q0q2 = q0*q2; float q0q3 = q0*q3;
+ float q1q1 = q1*q1; float q1q2 = q1*q2;
+ float q1q3 = q1*q3; float q2q2 = q2*q2;
+ float q2q3 = q2*q3; float q3q3 = q3*q3;
+ if (AHRS_Init > 200)
+ {
+ halfT = 0.0005f*Dtime; /*得到每次姿态更新的周期的一半t = (1/SampleFrq) * 0.5 */
+ }
+ else
+ {
+ if (useMag == 1)
+ {
+ halfT = 0.1;
+ gx = gy = gz = 0;
+ AHRS_Init++;
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ norm = invSqrt(ax*ax + ay*ay + az*az); /*把加速度计向量转换为单位向量*/
+
+ if ((1.0f / norm) > 1.6 || (1.0f / norm) < 0.4){
+ AccelAjust = 0;
+ MagAjust = 1.2f;
+
+ }
+ else{
+ AccelAjust = 1.0f;
+ MagAjust = 1.0f;
+ }
+
+
+ ax = ax * norm;
+ ay = ay * norm;
+ az = az * norm; /*把磁力计向量转换为单位向量 */
+ norm = invSqrt(mx*mx + my*my + mz*mz);
+ mx = mx * norm;
+ my = my * norm;
+ mz = mz * norm;
+
+
+ hx = 2.0f*(mx*(0.5f - q2q2 - q3q3) + my*(q1q2 - q0q3) + mz*(q1q3 + q0q2)); /*把(mx,my,mz)转换到地理坐标系的(hx,hy,hz),利用H = Q^-1 * M */
+ hy = 2.0f*(mx*(q1q2 + q0q3) + my*(0.5f - q1q1 - q3q3) + mz*(q2q3 - q0q1));
+ hz = 2.0f*(mx*(q1q3 - q0q2) + my*(q2q3 + q0q1) + mz*(0.5f - q1q1 - q2q2));
+
+ /*计的数值为(bx,by,0),所以我们不关注hx的数值 */
+ // bx = sqrtf((hx*hx) + (hy*hy)); /*使磁力计正交化*/
+ by = sqrtf((hx*hx) + (hy*hy));
+ bz = hz;
+
+ /*v代表的是把地理坐标系的加速度(0,0,1g)转换到机体坐标系的加 */
+ vx = 2.0f*(q1q3 - q0q2); /*速度计(ax,ay,az),其实就是用R*(0,0,1),R为旋转矩阵,此矩阵可 */
+ vy = 2 * (q0q1 + q2q3); /*由四元数转换得到 */
+ vz = q0q0 - q1q1 - q2q2 + q3q3;
+
+ wx = 2.0f*(by*(q1q2 + q0q3) + bz*(q1q3 - q0q2)); /*把正交化的H即B从地理坐标系转换到飞行器坐标系,利用W = Q * B */
+ wy = 2.0f*(by*(0.5f - q1q1 - q3q3) + bz*(q0q1 + q2q3)); /*这里认为bx = 0 */
+ wz = 2.0f*(by*(q2q3 - q0q1) + bz*(0.5f - q1q1 - q2q2));
+
+
+
+ /*如果使用磁力计,则融合磁力计*/
+ if (useMag != 0)
+ { /*用当前姿态向量和加速度的姿态向量做叉乘,乘积越小说明两个向量方向越相同*/
+ ex = AccelAjust*(ay*vz - az*vy) + MagAjust*(my*wz - mz*wy);
+ ey = AccelAjust*(az*vx - ax*vz) + MagAjust*(mz*wx - mx*wz);
+ ez = AccelAjust*(ax*vy - ay*vx) + MagAjust*(mx*wy - my*wx);
+ }
+ else
+ {
+
+ ex = AccelAjust*(ay*vz - az*vy);
+ ey = AccelAjust*(az*vx - ax*vz); /*因为加速度计没有校准,ez不靠谱*/
+ ez = AccelAjust*(ax*vy - ay*vx);
+ ez = 0;
+ }
+
+ if (ex != 0.0f && ey != 0.0f && ez != 0.0f)
+ {
+ /*这里使用了PID调节的方式,对角速度修正,Ki 是积分修正,Kp是直接修正 */
+ exInt = exInt + ex*Ki * halfT; /*对误差进行积分 */
+ eyInt = eyInt + ey*Ki * halfT;
+ ezInt = ezInt + ez*Ki * halfT;
+ gx = gx + Kp*(1 + Kd*fabsf(ex))*ex + exInt; /*使用比例和积分综合对陀螺仪进行修正,由于存在积分修正,所以才能确保回 */
+ gy = gy + Kp*(1 + Kd*fabsf(ey))*ey + eyInt; /*到期望回到的位置 */
+ gz = gz + Kp*(1 + Kd*fabsf(ez))*ez + ezInt;
+ }
+
+
+ qw = (-q1*gx - q2*gy - q3*gz)*halfT; /*利用一阶龙格库塔法对四元数进行更新*/
+ qx = (q0*gx + q2*gz - q3*gy)*halfT;
+ qy = (q0*gy - q1*gz + q3*gx)*halfT;
+ qz = (q0*gz + q1*gy - q2*gx)*halfT;
+
+ q0 = q0 + qw;
+ q1 = q1 + qx;
+ q2 = q2 + qy;
+ q3 = q3 + qz;
+
+
+ norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3); /*对四元数进行规范化,即四元数模为1*/
+
+ q0 = q0 * norm; //w
+ q1 = q1 * norm; //x
+ q2 = q2 * norm; //y
+ q3 = q3 * norm; //z
+
+
+ /*对原变换公式进行重写,避免了以前坐标轴混乱的问题,按照标准y上z右x前*/
+ Pitch = asin(-2.0f*(q2*q1 - q0*q3))* (180.0f / 3.141592f); /*轴进行四元数到欧拉角的转换 */
+ Yaw = atan2(q3*q1 + q0*q2, 0.5f - q3*q3 - q2*q2)* (180.0f / 3.141592f);
+ Roll = atan2(q3*q2 + q0*q1, 0.5f - q3*q3 - q1*q1)* (180.0f / 3.141592f);
+
+ LowPassFilterYaw(&Yaw, 0.9f);
+
+ if (AHRS_Init > 200)
+ {
+ GlobalQ_Updating = TRUE;
+ GlobalQ.w = q0;
+ GlobalQ.x = q2;
+ GlobalQ.y = q3;
+ GlobalQ.z = q1;
+ GlobalQ_Updating = FALSE;
+ }
+ printf("%f %f %f\n", Yaw, Roll, Pitch);
+
+ IsHmdIntoStandBy(&Pitch, &Roll, 1.0f);
+}
+
+
+void MagFilter(float *mx, float *my, float *mz, float sita)
+{
+ static float xlast = 0, ylast = 0, zlast = 0;
+ if (xlast == 0 && ylast == 0 && zlast == 0)
+ {
+ xlast = *mx;
+ ylast = *my;
+ zlast = *mz;
+ }
+ else
+ {
+ xlast = sita*xlast + (1 - sita)*(*mx);
+ ylast = sita*ylast + (1 - sita)*(*my);
+ zlast = sita*zlast + (1 - sita)*(*mz);
+ }
+}
+
+
+/*******************************************************************************
+* Function Name : invSqrt
+* Description : 快速计算 1/Sqrt(x),源自雷神3,神奇的0x5f3759df
+* 输入 : x
+* 输出 :1/sqrt(x)
+*******************************************************************************/
+float invSqrt(float x)
+{
+ float halfx = 0.5f * x;
+ float y = x;
+ long i = *(long*)&y;
+ i = 0x5f3759df - (i >> 1);
+ y = *(float*)&i;
+ y = y * (1.5f - (halfx * y * y));
+ return y;
+}
+
+
+void GyroComputeDrift(float *gx, float *gy, float *gz)
+{
+ static float GxOffect = 0.0f, GyOffect = 0.0f, GzOffect = 0.0f;
+ static float GxOffectTmp = 0.0f, GyOffectTmp = 0.0f, GzOffectTmp = 0.0f;
+ static float GxTmp = 0.0f, GyTmp = 0.0f, GzTmp = 0.0f;
+ static int count = 0;
+
+ *gx = *gx - GxOffect;
+ *gy = *gy - GyOffect;
+ *gz = *gz - GzOffect;
+
+ if (HmdStandByState == true){
+ GxTmp = GxTmp + *gx;
+ GyTmp = GyTmp + *gy;
+ GzTmp = GzTmp + *gz;
+ count++;
+ if (count == 3000){
+ //printf("陀螺仪校准完成\n");
+
+ GxOffectTmp = GxTmp / count;
+ GyOffectTmp = GyTmp / count;
+ GzOffectTmp = GzTmp / count;
+
+ GxOffect = GxOffect + GxOffectTmp;
+ GyOffect = GyOffect + GyOffectTmp;
+ GzOffect = GzOffect + GzOffectTmp;
+
+ GxTmp = 0.0f;
+ GyTmp = 0.0f;
+ GzTmp = 0.0f;
+ count = 0;
+ }
+ }
+ else{
+ count = 0;
+ GxTmp = 0.0f;
+ GyTmp = 0.0f;
+ GzTmp = 0.0f;
+ }
+
+}
+
+void LowPassFilterYaw(float *z, float alpha)
+{
+ static float lastz = 0;
+ if (lastz == 0)
+ {
+ lastz = *z;
+ }
+ else
+ {
+ *z = alpha*lastz + (1 - alpha)*(*z);
+ lastz = *z;
+ }
+
+}
+
+
+
+bool IsHmdIntoStandBy(float *Pitch, float *Roll, float dTime)
+{
+ static float LastPitch = 0.0f, LastRoll = 0.0f;
+ static float LastGyroX = 0.0f, LastGyroY = 0.0f;
+ static int count = 0;
+ float GyroX = 0.0f, GyroY = 0.0f, alpha = 0.98f;
+
+
+ /* 初始化静态变量 */
+ if (LastPitch == 0.0f&&LastRoll == 0.0f){
+ LastPitch = *Pitch;
+ LastRoll = *Roll;
+ }
+ /*对Pitch和Roll微分,求Gx和Gy */
+ GyroX = fabsf(*Roll - LastRoll) / dTime;
+ GyroY = fabsf(*Pitch - LastPitch) / dTime;
+ /*初始化静态变量*/
+ if (LastGyroX == 0.0f&&LastGyroY == 0.0f){
+ LastGyroX = GyroX;
+ LastGyroY = GyroY;
+ }
+ /*进行一个滑动窗口滤波降低偶然误差*/
+ GyroX = alpha*LastGyroX + (1 - alpha)*GyroX;
+ GyroY = alpha*LastGyroY + (1 - alpha)*GyroY;
+
+ printf("%f %f\n", GyroX, GyroY);
+
+ if (GyroX < 0.0055f&&GyroY < 0.0015f){
+ count++;
+ if (count == 3000){
+ count = 0;
+ HmdStandByState = true;
+ printf("头显进入休眠\n");
+ }
+ }
+ else{
+ count = 0;
+ HmdStandByState = false;
+ }
+ /* 更新静态变量 */
+ LastRoll = *Roll;
+ LastPitch = *Pitch;
+ LastGyroX = GyroX;
+ LastGyroY = GyroY;
+
+ return HmdStandByState;
+}
+
+float DM_GetYaw(void)
+{
+ return Yaw;
+}
+
+float DM_GetPitch(void)
+{
+ return Pitch;
+}
+float DM_GetRoll(void)
+{
+ return Roll;
+}
+
+
+
+
+Quaternion CorrectQuaterinonYaw(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+int ResetHeading(void)
+{
+ Quaternion q = { GlobalQ.w, 0, GlobalQ.y, 0 };
+ CQ_DM = CorrectQuaterinonYaw(q);
+ DM_Corrected = true;
+ return DM_Corrected ? 1 : 0;
+}
+
+Quaternion GetPoseQuat(void)
+{
+ static Quaternion QLast = { 1.0f, 0.0f, 0.0f, 0.0f };
+ if (!GlobalQ_Updating)
+ {
+ QLast.w = GlobalQ.w;
+ QLast.x = GlobalQ.x;
+ QLast.y = GlobalQ.y;
+ QLast.z = GlobalQ.z;
+ }
+ if (DM_Corrected){
+ return QuaternionMulti(QLast, CQ_DM);
+ }
+ return QLast;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/SensorImpl.h b/4.Software/GeekIMUDriver 1.1/Src/SensorImpl.h
new file mode 100644
index 0000000..e31fb3e
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/SensorImpl.h
@@ -0,0 +1,56 @@
+#ifndef _SENSORIMPL_H_
+#define _SENSORIMPL_H_
+#include "quaternion.h"
+
+#ifdef __cplusplus
+extern "C"{
+ Quaternion GetPoseQuat(void);
+
+ void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+ void GetControllerSensor(unsigned char usb_input_buffer[]);
+
+ /*
+ * 描述 : 获取偏航角Yaw
+ */
+ float DM_GetYaw(void);
+ /*
+ * 描述 :获取俯仰角Pitch
+ */
+ float DM_GetPitch(void);
+ /*
+ * 描述 :获取滚转角Roll
+ */
+ float DM_GetRoll(void);
+
+ float invSqrt(float x) ;
+
+ void ResetAHRS();
+
+ void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz,char useMag,int Dtime);
+
+ Vector3 GetMagData();
+
+ int ResetHeading(void);
+
+}
+#else
+
+void UnpackSensor(const UCHAR* buffer, long* x, long* y, long* z);
+
+void GetControllerSensor(unsigned char usb_input_buffer[]);
+
+__declspec(dllexport) float GetLocX(void);
+
+__declspec(dllexport) float GetLocY(void);
+
+__declspec(dllexport) float GetLocZ(void);
+
+#endif
+
+
+
+#endif
+
+
+
diff --git a/4.Software/GeekIMUDriver 1.1/Src/USB_Win32_HIDDevice.c b/4.Software/GeekIMUDriver 1.1/Src/USB_Win32_HIDDevice.c
new file mode 100644
index 0000000..03dfa57
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/USB_Win32_HIDDevice.c
@@ -0,0 +1,246 @@
+/***************************************************************************
+* 描 述: USBHID设备驱动代码
+* 作 者: 詹力
+* 时 间: 2016/10/29
+***************************************************************************/
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "USB_Win32_HIDDevice.h"
+#include "MagCalibrate.h"
+#include "SensorImpl.h"
+
+#pragma comment(lib,"setupapi.lib")
+#pragma comment(lib, "hid.lib")
+
+unsigned char usb_output_buffer[65];
+unsigned char usb_input_buffer[256];
+unsigned char usb_feature_report_buffer[256];
+
+unsigned char buffer[255];
+/* 主函数,程序的入口 */
+
+HANDLE dematrix_usb_handle = INVALID_HANDLE_VALUE;
+HDEVINFO device_info_set;
+GUID HidGuid;
+SP_DEVICE_INTERFACE_DATA device_interface_data;
+HIDP_CAPS dematrix_device_capabilities;
+
+HANDLE DM_HID_Read_HANDLE;
+HANDLE DM_HID_Write_HANDLE;
+
+int i=5;
+BOOL device_is_found;
+OVERLAPPED usb_read_over_lapped;
+PSP_DEVICE_INTERFACE_DETAIL_DATA pData;
+
+
+BOOL HIDFindDeviceFromVendor(USHORT PID,USHORT VID,CHAR *Path)
+{
+ HANDLE DM_USB_HANDLE;
+ HIDD_ATTRIBUTES Dev_Attr;
+
+ Dev_Attr.Size = sizeof(Dev_Attr);
+
+ DM_USB_HANDLE = CreateFileA(Path, (DWORD)NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, (DWORD)NULL, NULL);
+ if(DM_USB_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ if (HidD_GetAttributes(DM_USB_HANDLE, &Dev_Attr) == FALSE) return FALSE;
+
+ HidD_GetNumInputBuffers(DM_USB_HANDLE, &i);
+ //printf("BufferSize[%d]\n",i);
+ dematrix_usb_get_capabilities(DM_USB_HANDLE);
+ //printf("Cap.out.length[%d]\n", dematrix_device_capabilities.OutputReportByteLength);
+ //printf("(PID=%x,VID=%x,VersionTest=%x)\n", Dev_Attr.ProductID, Dev_Attr.VendorID, Dev_Attr.VersionNumber);
+ if (Dev_Attr.ProductID == PID && Dev_Attr.VendorID == VID)
+ {
+ //printf("(PID=%x,VID=%x,VersionTest=%x)\n", Dev_Attr.ProductID, Dev_Attr.VendorID, Dev_Attr.VersionNumber);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+
+BOOL InitPathFromInterfaceData(HDEVINFO hdevInfoSet, SP_DEVICE_INTERFACE_DATA* pidata)
+{
+ DWORD detailSize = 0;
+ BOOL Result;
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet,pidata, NULL, (DWORD)NULL, &detailSize, NULL);
+
+ pData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(detailSize);
+ if (pData == NULL){
+ printf("内存不足!\n");
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ return FALSE;
+ }
+ pData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, pData, detailSize, NULL, NULL);
+ if(Result==TRUE)
+ {
+ //printf("Path = %s\n",(char *)(pData->DevicePath));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*给定USB设备,对USB设备进行枚举,如果PID和VID都符合,就打开USB设备并创建句柄*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID)
+{
+ HDEVINFO hdevInfoSet;
+ SP_DEVICE_INTERFACE_DATA interfaceData;
+
+
+ int deviceIndex = 0;
+ interfaceData.cbSize = sizeof(interfaceData);
+
+ /* 先取得GUID */
+ HidD_GetHidGuid(&HidGuid);
+
+ hdevInfoSet = SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);
+
+ if (hdevInfoSet == INVALID_HANDLE_VALUE) return FALSE;
+
+ for(deviceIndex = 0;
+ SetupDiEnumDeviceInterfaces(hdevInfoSet, NULL, &HidGuid, deviceIndex, &interfaceData);
+ deviceIndex++)
+ {
+ //printf("index = %d\n",deviceIndex);
+
+ if (!InitPathFromInterfaceData(hdevInfoSet, &interfaceData))
+ continue;
+ // 下面的函数需要路径
+ if(HIDFindDeviceFromVendor(PID,VID,(CHAR*)(pData->DevicePath)))
+ {
+ //printf("Path = %s\n",(char *)(pData->DevicePath));
+
+ DM_HID_Read_HANDLE = CreateFileA((char *)(pData->DevicePath), (DWORD)GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
+ FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+ DM_HID_Write_HANDLE = CreateFileA((char *)(pData->DevicePath), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
+
+
+ device_is_found = TRUE;
+ SetEvent(usb_read_over_lapped.hEvent);
+ printf("打开设备成功!\n");
+ break;
+ }else
+ continue;
+ }
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+
+ if(device_is_found==TRUE)return TRUE;
+ else
+ return FALSE;
+}
+
+void USB_HID_Init()
+{
+ //初始化读报告时用的Overlapped结构体
+ //偏移量设置为0
+ usb_read_over_lapped.Offset = 0;
+ usb_read_over_lapped.OffsetHigh = 0;
+ //创建一个事件,提供给ReadFile使用,当ReadFile完成时,
+ //会设置该事件为触发状态。
+ usb_read_over_lapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ start_thread(dematrix_usb_private_read_thread, NULL);
+}
+
+
+
+int globalpacklen = 0;
+DWORD dematrix_usb_private_read_thread(LPVOID param)
+{
+ DWORD length;
+
+ //该线程是个死循环,直到程序退出时,它才退出
+ while (1)
+ {
+ //设置事件为无效状态
+ ResetEvent(usb_read_over_lapped.hEvent);
+
+ //如果设备已经找到
+ if (device_is_found == TRUE)
+ {
+
+ if (DM_HID_Read_HANDLE == INVALID_HANDLE_VALUE) {
+ printf("无效的读报告句柄,可能是打开设备时失败");
+ }
+ else {
+
+ CancelIo(DM_HID_Read_HANDLE);
+ // DKHD2这里使用62,DK2一定要使用64,否则无法读取数据
+ ReadFile(DM_HID_Read_HANDLE, usb_input_buffer,globalpacklen, NULL, &usb_read_over_lapped);
+ }
+
+ //等待事件触发
+ WaitForSingleObject(usb_read_over_lapped.hEvent, INFINITE);
+
+ //如果等待过程中设备被拔出,也会导致事件触发,但此时MyDevFound
+ //被设置为假,因此在这里判断MyDevFound为假的话就进入下一轮循环。
+ if (device_is_found == FALSE) continue;
+
+ //如果设备没有被拔下,则是ReadFile函数正常操作完成。
+ //通过GetOverlappedResult函数来获取实际读取到的字节数。
+ GetOverlappedResult(DM_HID_Read_HANDLE, &usb_read_over_lapped, &length, TRUE);
+
+ //如果字节数不为0,则将读到的数据显示到信息框中
+ if (length != 0)
+ {
+ int useful_length = usb_input_buffer[1];
+
+ GetControllerSensor(usb_input_buffer);
+ }
+ }
+ else {
+ //阻塞线程,直到下次事件被触发
+ WaitForSingleObject(usb_read_over_lapped.hEvent, INFINITE);
+ }
+ }
+ return 0;
+}
+
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle)
+{
+ PHIDP_PREPARSED_DATA PreparsedData;
+
+ if (hid_usb_handle == NULL) return;
+
+ HidD_GetPreparsedData(hid_usb_handle, &PreparsedData);
+
+ HidP_GetCaps(PreparsedData, &dematrix_device_capabilities);
+
+ HidD_FreePreparsedData(PreparsedData);
+}
+
+DWORD start_thread(void *function_address, void *param)
+{
+ DWORD temp;
+#ifdef _WIN32
+ HANDLE hThread;
+ hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)function_address, param, 0, &temp);
+ if (hThread != NULL) return (DWORD)hThread;
+ else return 0x00;
+#else
+#ifdef linux
+ pthread_t hThread;
+ int Result;
+ Result = pthread_create(&hThread, NULL, (void *)function_address, param);
+ if (Result != NULL) return Result;
+ else return -NULL;
+#endif
+#endif
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/USB_Win32_HIDDevice.h b/4.Software/GeekIMUDriver 1.1/Src/USB_Win32_HIDDevice.h
new file mode 100644
index 0000000..b38f61b
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/USB_Win32_HIDDevice.h
@@ -0,0 +1,50 @@
+#ifndef DM_Win32_HIDDevice_h_
+#define DM_Win32_HIDDevice_h_
+
+
+typedef struct _HID_HANDLE{
+ HANDLE HID_Read_HANDLE;
+ HANDLE HID_Write_HANDLE;
+}UsbHidHandle;
+
+#ifdef __cplusplus
+extern "C"{
+
+
+ /*给定USB设备的PID和VID,对USB设备进行枚举*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID);
+
+/*对USB HID 进行一些初始化操作,初始化一些必要的变量*/
+void USB_HID_Init();
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+DWORD start_thread(void *function_address, void *param);
+
+
+}
+
+#else
+
+ /*给定USB设备的PID和VID,对USB设备进行枚举*/
+BOOL DM_HIDDeviceEnumerate(USHORT PID,USHORT VID);
+
+/*对USB HID 进行一些初始化操作,初始化一些必要的变量*/
+void USB_HID_Init();
+
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+DWORD start_thread(void *function_address, void *param);
+
+#endif
+
+
+
+
+#endif
diff --git a/4.Software/GeekIMUDriver 1.1/Src/UsbHid_CAPI.h b/4.Software/GeekIMUDriver 1.1/Src/UsbHid_CAPI.h
new file mode 100644
index 0000000..e8b2bb6
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/UsbHid_CAPI.h
@@ -0,0 +1,16 @@
+#ifndef _UsbHid_CAPI_H_
+#define _UsbHid_CAPI_H_
+
+#ifdef __cplusplus
+extern "C"{
+
+__declspec(dllexport) int Init_Hmd(void);
+
+}
+#else
+
+__declspec(dllexport) int Init_Hmd(void);
+
+#endif
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/dematrix_usb.h b/4.Software/GeekIMUDriver 1.1/Src/dematrix_usb.h
new file mode 100644
index 0000000..d4983ce
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/dematrix_usb.h
@@ -0,0 +1,41 @@
+#ifndef _DEMATRIX_USB_H_
+#define _DEMATRIX_USB_H_
+
+#include
+#include
+#include
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/*返回1则找到设备,返回0 表示未找到设备*/
+_declspec(dllexport) int Init_Hmd(void);
+
+
+
+void dematrix_usb_init();
+
+BOOL HIDFindDeviceFromVendor(USHORT PID,USHORT VID,CHAR *Path);
+BOOL DM_HIDDeviceEnumerate(void);
+
+void dematrix_usb_get_capabilities(HANDLE hid_usb_handle);
+int DK2_GetFeatureReport(HANDLE hid_usb_handle);
+int DK2_GetDisplayInfo(HANDLE hid_usb_handle,FILE *fp);
+
+DWORD dematrix_usb_private_read_thread(LPVOID param);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+
+
+
+
+
+#endif
diff --git a/4.Software/GeekIMUDriver 1.1/Src/hid.lib b/4.Software/GeekIMUDriver 1.1/Src/hid.lib
new file mode 100644
index 0000000..0040fcc
Binary files /dev/null and b/4.Software/GeekIMUDriver 1.1/Src/hid.lib differ
diff --git a/4.Software/GeekIMUDriver 1.1/Src/main.cpp b/4.Software/GeekIMUDriver 1.1/Src/main.cpp
new file mode 100644
index 0000000..141fd0f
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/main.cpp
@@ -0,0 +1,1809 @@
+#include
+#include
+#include
+#include "USB_Win32_HIDDevice.h"
+#include "MagCalibrate.h"
+#include "SensorImpl.h"
+#include "IMU_CAPI.h"
+#include "UsbHid_CAPI.h"
+#include "quaternion.h"
+
+#include
+#include "hidsdi.h"
+#include
+
+#include
+
+#include "PipeHMD.h"
+
+#include
+#include
+#include
+#include
+#include
+#include "openvr_driver.h"
+#include "OVR_CAPI.h"
+#include "MagCalibrate.h"
+
+int global_calibration_flag = 0;//0none 1 gyro 2 acc 3 mag
+int global_Show = 0;//0 hide 1 gyro 2acc 3mag 4angle 5Hex
+
+std::string sCurrent_Device_str("null");
+std::string strGlobalDevicePath("null");
+extern "C" int globalpacklen;
+
+extern "C" BOOL device_is_found;
+extern "C" PSP_DEVICE_INTERFACE_DETAIL_DATA pData;
+extern "C" HANDLE DM_HID_Read_HANDLE;
+extern "C" HANDLE DM_HID_Write_HANDLE;
+extern float gx0, gy0, gz0;
+extern "C" OVERLAPPED usb_read_over_lapped;
+
+int global_pipeserver = 0;
+//extern Quaternion Qcorr;
+bool global_debug = false;
+
+#include
+
+#include
+
+
+
+FILE *fpdata;
+
+#define BUFSIZE 512
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_LEFT_POSE 2
+#define COMMAND_GET_RIGHT_POSE 3
+#define COMMAND_GET_LEFT_BAT 10
+#define COMMAND_GET_RIGHT_BAT 11
+
+#define COMMAND_SET_RUMBLE 20
+
+
+#define LEFT_HAND 0
+#define RIGHT_HAND 1
+
+
+
+
+#define BUFSIZE 512
+
+
+
+#define COMMAND_DEVICE_IS_OPEN 1
+#define COMMAND_GET_DATA 2
+#define COMMAND_DEVICE_CALIBRATION 3
+#define COMMAND_DEVICE_GET_PURE_DATA 4
+#define COMMAND_DEVICE_ENTER_DFU_MODE 11
+
+#define ENTER_DFU_MODE_SUCCESS 1
+#define ENTER_DFU_MODE_FAILED 0
+#define CALIBRATION_SUCCESS 1
+#define CALIBRATION_FAILED 0
+
+
+#define FEATURE_OFFSET_SET_GYRO 1
+#define FEATURE_OFFSET_SET_ACC 2
+#define FEATURE_OFFSET_SET_MAG 3
+#define FEATURE_OFFSET_SET_LED 4
+#define FEATURE_OFFSET_GET_GYRO 0x11
+#define FEATURE_OFFSET_GET_ACC 0x12
+#define FEATURE_OFFSET_GET_MAG 0x13
+
+
+
+#define LED_COLOR_BLACK 0x00
+#define LED_COLOR_WHITE 0x07
+#define LED_COLOR_RED 0x04
+#define LED_COLOR_GREEN 0x02
+#define LED_COLOR_BLUE 0x01
+#define LED_COLOR_CYAN 0x03
+#define LED_COLOR_MAGENTA 0x06
+#define LED_COLOR_YELLOW 0x05
+
+UINT8 LED_COLOR_LIST[8] = {LED_COLOR_BLACK,LED_COLOR_WHITE,LED_COLOR_RED,LED_COLOR_GREEN,
+LED_COLOR_BLUE,LED_COLOR_CYAN,LED_COLOR_MAGENTA,LED_COLOR_YELLOW,};
+
+Quaternion CQGamePad = { 1, 0, 0, 0 };
+Quaternion CQHMD = { 1, 0, 0, 0 };
+
+
+
+
+
+
+#define FEATURE_OFFSET_SIZE 52//3+1+4*12
+
+DWORD WINAPI InstanceThread(LPVOID);
+VOID GetAnswerToRequest(LPCSTR, LPCSTR, LPDWORD);
+BOOL CreatePipeSecurity(PSECURITY_ATTRIBUTES *ppSa)
+{
+ BOOL fSucceeded = TRUE;
+ DWORD dwError = ERROR_SUCCESS;
+
+ PSECURITY_DESCRIPTOR pSd = NULL;
+ PSECURITY_ATTRIBUTES pSa = NULL;
+
+ // Define the SDDL for the security descriptor.
+ LPCSTR szSDDL = "D:" // Discretionary ACL
+ "(A;OICI;GRGW;;;AU)" // Allow read/write to authenticated users
+ "(A;OICI;GA;;;BA)"; // Allow full control to administrators
+
+ if (!ConvertStringSecurityDescriptorToSecurityDescriptor(szSDDL,
+ SDDL_REVISION_1, &pSd, NULL))
+ {
+ fSucceeded = FALSE;
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+ // Allocate the memory of SECURITY_ATTRIBUTES.
+ pSa = (PSECURITY_ATTRIBUTES)LocalAlloc(LPTR, sizeof(*pSa));
+ if (pSa == NULL)
+ {
+ fSucceeded = FALSE;
+ dwError = GetLastError();
+ goto Cleanup;
+ }
+
+ pSa->nLength = sizeof(*pSa);
+ pSa->lpSecurityDescriptor = pSd;
+ pSa->bInheritHandle = FALSE;
+
+ *ppSa = pSa;
+
+Cleanup:
+ // Clean up the allocated resources if something is wrong.
+ if (!fSucceeded)
+ {
+ if (pSd)
+ {
+ LocalFree(pSd);
+ pSd = NULL;
+ }
+ if (pSa)
+ {
+ LocalFree(pSa);
+ pSa = NULL;
+ }
+
+ SetLastError(dwError);
+ }
+
+ return fSucceeded;
+}
+void FreePipeSecurity(PSECURITY_ATTRIBUTES pSa)
+{
+ if (pSa)
+ {
+ if (pSa->lpSecurityDescriptor)
+ {
+ LocalFree(pSa->lpSecurityDescriptor);
+ }
+ LocalFree(pSa);
+ }
+}
+int pipeservermain(VOID)
+{
+ if (global_pipeserver != 1)
+ {
+ return 0;
+ }
+ global_pipeserver = 2;
+
+ BOOL fConnected = FALSE;
+ DWORD dwThreadId = 0;
+ HANDLE hPipe = INVALID_HANDLE_VALUE, hThread = NULL;
+ //LPCSTR lpszPipename = TEXT("\\\\.\\pipe\\Dematrix_SteamVR");
+ LPCSTR lpszPipename = TEXT("\\\\.\\pipe\\Dematrix_CTL");
+ PSECURITY_ATTRIBUTES pSa;
+ if (!CreatePipeSecurity(&pSa))
+ {
+ printf("CreatePipeSecurity pSa FALSE\n");
+ FreePipeSecurity(pSa);
+ return 0;
+ }
+ // The main loop creates an instance of the named pipe and
+ // then waits for a client to connect to it. When the client
+ // connects, a thread is created to handle communications
+ // with that client, and this loop is free to wait for the
+ // next client connect request. It is an infinite loop.
+
+ for (;;)
+ {
+ if (global_pipeserver == -1)
+ {
+ global_pipeserver = 0;
+ break;
+ }
+ //_tprintf(TEXT("\nPipe Server: Main thread awaiting client connection on %s\n"), lpszPipename);
+ hPipe = CreateNamedPipe(
+ lpszPipename, // pipe name
+ PIPE_ACCESS_DUPLEX, // read/write access
+ PIPE_TYPE_MESSAGE | // message type pipe
+ PIPE_READMODE_MESSAGE | // message-read mode
+ PIPE_WAIT, // blocking mode
+ PIPE_UNLIMITED_INSTANCES, // max. instances
+ BUFSIZE, // output buffer size
+ BUFSIZE, // input buffer size
+ 0, // client time-out
+ pSa); // default security attribute
+
+ if (hPipe == INVALID_HANDLE_VALUE)
+ {
+ _tprintf(TEXT("CreateNamedPipe failed, GLE=%d.\n"), GetLastError());
+ return -1;
+ }
+
+ // Wait for the client to connect; if it succeeds,
+ // the function returns a nonzero value. If the function
+ // returns zero, GetLastError returns ERROR_PIPE_CONNECTED.
+
+ fConnected = ConnectNamedPipe(hPipe, NULL) ?
+ TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
+
+ if (fConnected)
+ {
+ //printf("Client connected, creating a processing thread.\n");
+
+ // Create a thread for this client.
+ hThread = CreateThread(
+ NULL, // no security attribute
+ 0, // default stack size
+ InstanceThread, // thread proc
+ (LPVOID)hPipe, // thread parameter
+ 0, // not suspended
+ &dwThreadId); // returns thread ID
+
+ if (hThread == NULL)
+ {
+ _tprintf(TEXT("CreateThread failed, GLE=%d.\n"), GetLastError());
+ return -1;
+ }
+ else CloseHandle(hThread);
+ }
+ else
+ // The client could not connect, so close the pipe.
+ CloseHandle(hPipe);
+ }
+ printf("管道服务器终止....\n");
+ return 0;
+}
+
+DWORD WINAPI InstanceThread(LPVOID lpvParam)
+// This routine is a thread processing function to read from and reply to a client
+// via the open pipe connection passed from the main loop. Note this allows
+// the main loop to continue executing, potentially creating more threads of
+// of this procedure to run concurrently, depending on the number of incoming
+// client connections.
+{
+ HANDLE hHeap = GetProcessHeap();
+ CHAR* pchRequest = (CHAR*)HeapAlloc(hHeap, 0, BUFSIZE*sizeof(CHAR));
+ CHAR* pchReply = (CHAR*)HeapAlloc(hHeap, 0, BUFSIZE*sizeof(CHAR));
+
+ DWORD cbBytesRead = 0, cbReplyBytes = 0, cbWritten = 0;
+ BOOL fSuccess = FALSE;
+ HANDLE hPipe = NULL;
+
+ // Do some extra error checking since the app will keep running even if this
+ // thread fails.
+
+ if (lpvParam == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL value in lpvParam.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchReply != NULL) HeapFree(hHeap, 0, pchReply);
+ if (pchRequest != NULL) HeapFree(hHeap, 0, pchRequest);
+ return (DWORD)-1;
+ }
+
+ if (pchRequest == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL heap allocation.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchReply != NULL) HeapFree(hHeap, 0, pchReply);
+ return (DWORD)-1;
+ }
+
+ if (pchReply == NULL)
+ {
+ // printf("\nERROR - Pipe Server Failure:\n");
+ // printf(" InstanceThread got an unexpected NULL heap allocation.\n");
+ // printf(" InstanceThread exitting.\n");
+ if (pchRequest != NULL) HeapFree(hHeap, 0, pchRequest);
+ return (DWORD)-1;
+ }
+
+ // Print verbose messages. In production code, this should be for debugging only.
+ //printf("InstanceThread created, receiving and processing messages.\n");
+
+ // The thread's parameter is a handle to a pipe object instance.
+
+ hPipe = (HANDLE)lpvParam;
+
+ // Loop until done reading
+ while (1)
+ {
+ // Read client requests from the pipe. This simplistic code only allows messages
+ // up to BUFSIZE characters in length.
+ fSuccess = ReadFile(
+ hPipe, // handle to pipe
+ pchRequest, // buffer to receive data
+ BUFSIZE*sizeof(TCHAR), // size of buffer
+ &cbBytesRead, // number of bytes read
+ NULL); // not overlapped I/O
+
+ if (!fSuccess || cbBytesRead == 0)
+ {
+ if (GetLastError() == ERROR_BROKEN_PIPE)
+ {
+ //_tprintf(TEXT("InstanceThread: client disconnected.\n"), GetLastError());
+ }
+ else
+ {
+ _tprintf(TEXT("InstanceThread ReadFile failed, GLE=%d.\n"), GetLastError());
+ }
+ break;
+ }
+
+ // Process the incoming message.
+ GetAnswerToRequest(pchRequest, pchReply, &cbReplyBytes);
+
+ // Write the reply to the pipe.
+ fSuccess = WriteFile(
+ hPipe, // handle to pipe
+ pchReply, // buffer to write from
+ cbReplyBytes, // number of bytes to write
+ &cbWritten, // number of bytes written
+ NULL); // not overlapped I/O
+
+ if (!fSuccess || cbReplyBytes != cbWritten)
+ {
+ _tprintf(TEXT("InstanceThread WriteFile failed, GLE=%d.\n"), GetLastError());
+ break;
+ }
+ }
+
+ // Flush the pipe to allow the client to read the pipe's contents
+ // before disconnecting. Then disconnect the pipe, and close the
+ // handle to this pipe instance.
+
+ FlushFileBuffers(hPipe);
+ DisconnectNamedPipe(hPipe);
+ CloseHandle(hPipe);
+
+ HeapFree(hHeap, 0, pchRequest);
+ HeapFree(hHeap, 0, pchReply);
+
+ //printf("InstanceThread exitting.\n");
+ return 1;
+}
+
+void ProcessHMDData(void *read_buffer, void* write_buffer, LPDWORD pchBytes){
+ unsigned char* writeBuffer = (unsigned char*)write_buffer;
+ BOOL status = FALSE;
+ unsigned int *int_value;
+ int_value = (unsigned int *)read_buffer;
+
+ memset(writeBuffer, 0, 512);
+ switch (int_value[0]){
+ case COMMAND_DEVICE_IS_OPEN:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ case COMMAND_GET_DATA:{
+ ovrSensorState *result = (ovrSensorState*)&writeBuffer[0];
+ Quaternion q = GetPoseQuat();
+ result[0].Recorded.Pose.Orientation.w = q.w;
+ result[0].Recorded.Pose.Orientation.x = q.x;
+ result[0].Recorded.Pose.Orientation.y = q.y;
+ result[0].Recorded.Pose.Orientation.z = q.z;
+ *pchBytes = sizeof(ovrSensorState);
+ break;
+ }
+ case COMMAND_DEVICE_CALIBRATION:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ // case COMMAND_DEVICE_GET_PURE_DATA:{
+ // float *result = (float*)&writeBuffer[0];
+ // result[0] = usbDEV.fBatteryLevel[LEFT_HAND];
+ // if (!device_is_found)
+ // {
+ // result[0] = 0.0f;
+ // }
+ // *pchBytes = sizeof(float);
+ // break;
+ // }
+ case COMMAND_DEVICE_ENTER_DFU_MODE:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ result[0] = TRUE;
+ if (!device_is_found)
+ {
+ result[0] = FALSE;
+ }
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ }
+}
+extern UINT8 global_key[4];
+
+float global_ctlposition[3] = {0,0,0};
+void ProcessCtlData(void *read_buffer, void* write_buffer, LPDWORD pchBytes){
+ unsigned char* writeBuffer = (unsigned char*)write_buffer;
+ BOOL status = FALSE;
+ unsigned int *int_value;
+ int_value = (unsigned int *)read_buffer;
+
+ memset(writeBuffer, 0, 512);
+ switch (int_value[0]){
+ case COMMAND_DEVICE_IS_OPEN:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ *result = device_is_found;
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ case COMMAND_GET_LEFT_POSE:{
+ vr::DriverPose_t *result = (vr::DriverPose_t*)&writeBuffer[0];
+ //Quaternion q = DM_GetQ();
+ result[0].qRotation.w = 1;
+ result[0].qRotation.x = 0;
+ result[0].qRotation.y = 0;
+ result[0].qRotation.z = 0;
+ *pchBytes = sizeof(vr::DriverPose_t);
+ break;
+ }
+ case COMMAND_GET_RIGHT_POSE:{
+ vr::DriverPose_t *result = (vr::DriverPose_t*)&writeBuffer[0];
+ Quaternion q = QuaternionMulti(GetPoseQuat(),CQGamePad);
+ result[0].qRotation.w = q.w;
+ result[0].qRotation.x = q.x;
+ result[0].qRotation.y = q.y;
+ result[0].qRotation.z = q.z;
+ result[0].vecPosition[0]=global_ctlposition[0];
+ result[0].vecPosition[1]=global_ctlposition[1];
+ result[0].vecPosition[2]=global_ctlposition[2];
+ unsigned char *aAxis = (unsigned char *)&result[0].vecVelocity[3];
+ aAxis[0] = global_key[0]<<1;//unsigned char K[4] ;//依次为 8个按键数据(8bit依次△,▽,RB,◎(轴按下), Y,B,A,X ),x轴,y轴,和trig
+ //aAxis[1] = usbDEV.K[hand][1];
+ //aAxis[2] = usbDEV.K[hand][2];
+ aAxis[3] = global_key[3];//我偷懒用这传的按键状态......你说不需要vecVelocity的嘛....
+ *pchBytes = sizeof(vr::DriverPose_t);
+ break;
+ }
+ case COMMAND_GET_LEFT_BAT:{
+ float *result = (float*)&writeBuffer[0];
+ result[0] = 0;
+ if (!device_is_found)
+ {
+ result[0] = 0.0f;
+ }
+ *pchBytes = sizeof(float);
+ break;
+ }
+ case COMMAND_GET_RIGHT_BAT:{
+ float *result = (float*)&writeBuffer[0];
+ result[0] = 0.7f;
+ if (!device_is_found)
+ {
+ result[0] = 0.0f;
+ }
+ *pchBytes = sizeof(float);
+ break;
+ }
+ case COMMAND_SET_RUMBLE:{
+ BOOL *result = (BOOL*)&writeBuffer[0];
+ *result = true;// TriggerHaptic(*(unsigned int*)a_command.data / 255, 50);
+ *pchBytes = sizeof(BOOL);
+ break;
+ }
+ }
+}
+
+VOID GetAnswerToRequest(LPCSTR pchRequest,
+ LPCSTR pchReply,
+ LPDWORD pchBytes)
+{
+ // This routine is a simple function to print the client request to the console
+ // and populate the reply buffer with a default data string. This is where you
+ // would put the actual client request processing code that runs in the context
+ // of an instance thread. Keep in mind the main thread will continue to wait for
+ // and receive other client connections while the instance thread is working.
+ ProcessCtlData((void*)pchRequest, (void*)pchReply, pchBytes);
+}
+FILE* Getfpdata()
+{
+ return fpdata;
+}
+
+Quaternion CorrectQuaterinonY(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+Quaternion CorrectQuaterinon(Quaternion q)
+{
+ Quaternion qcorr;
+ qcorr.w = q.w; qcorr.x = 0.0f;
+ qcorr.y = q.y; qcorr.z = 0.0f;
+ qcorr = QuaternionInversion(qcorr);
+ float mod = QuaternionMod(qcorr);
+ qcorr.w = qcorr.w / mod;
+ qcorr.x = qcorr.x / mod;
+ qcorr.y = qcorr.y / mod;
+ qcorr.z = qcorr.z / mod;
+ return qcorr;
+}
+
+void ShowHelp()
+{
+ printf("============================HELP===========================\n");
+ printf("h - 显示帮助\n");
+ printf("c - 检查设备连接\n");
+ printf("d - 进入DFU模式\n");
+ printf("l - LED 颜色设置\n");
+ printf("t - 校准陀螺仪\n");
+// printf(" - b - 取消校准\n");
+// printf(" - s - 显示陀螺仪数据\n");
+// printf(" - - b - 返回\n");
+ printf("p - 启动管道服务器\n");
+// printf(" - r - 启动管道服务器\n");
+// printf(" - s - 关闭管道服务器\n");
+ printf("g - 进入陀螺仪校准\n");
+// printf(" - s - 显示陀螺仪数据\n");
+// printf(" - - b - 返回\n");
+// printf(" - c - 校准数据\n");
+// printf(" - r - 重置为0\n");
+// printf(" - g - 获取当前陀螺仪计校准参数\n");
+// printf(" - b - 返回\n");
+ printf("m - 进入磁力校准\n");
+// printf(" - g - 获取当前磁力计校准参数\n");
+// printf(" - s - 写入默认磁力计参数\n");
+// printf(" - c - 开始获取磁力计数据并写入data.txt\n");
+// printf(" - - f - 数据获取完成 需要输入新的校准参数\n");
+// printf(" - - c - 取消校准\n");
+// printf(" - - q - 退出校准\n");
+ printf("a - 显示欧拉角数据\n");
+// printf(" - b - 返回\n");
+ printf("o - 显示原始数据\n");
+// printf(" - b - 返回\n");
+ printf("M - 移动虚拟位置\n");
+ printf(" c校准方向 b返回 空格归零 \n");
+ printf(" ws ad qe按照手柄方向移动虚拟位置 \n");
+ printf(" WS AD QE按照头盔方向移动虚拟位置 \n");
+ printf("============================帮助===========================\n");
+}
+
+
+int main()
+{
+// printf("DMGamePad调试工具 2016-12-13 02:11:20\n");
+// /**
+// * 初始化USB_HID
+// * 相关初始化变量
+// * 启动读取线程
+// **/globalpacklen = 64;
+// USB_HID_Init();
+// find_device:
+// /*查找PID=0x0001,VID为0x2833的USB设备*/
+// //while (!DM_HIDDeviceEnumerate(0x5750, 0x0483))
+// while (!DM_HIDDeviceEnumerate(0x0002, 0x2833))
+// {
+// printf("找不到0x0001, 0x2833 USB设备!\n");
+// Sleep(1000);
+// // if (_getche()=='q')
+// // {
+// // return 0;
+// // }
+// }
+ Init("VID_2833&PID_0002");
+ //system("cls");
+ ShowHelp();
+ DMPipe::PipeHMD p("\\\\.\\Pipe\\Dematrix_SteamVR");
+
+// UINT8 MAG_Info[FEATURE_OFFSET_SIZE] = { 0x0b };
+// UINT8 MAG_Set[FEATURE_OFFSET_SIZE] = { 0x0b};
+
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+
+ while (1)
+ {
+ //printf(">>");
+ *offset_set_dev = *offset_get_dev = 0;
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ memset(offset_set_data, 0, FEATURE_OFFSET_SIZE - 4);
+ char s;
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'c')//检查设备是否有效
+ {
+ if (CheckDevice()==0)
+ {
+ printf("设备已连接...\n");
+ }
+ else
+ {
+ printf("设备断开连接...\n");
+ device_is_found = FALSE;
+ Sleep(1000);
+ //goto find_device;
+ }
+ }
+ else if (s == 'h')
+ {
+ ShowHelp();
+ }
+ else if (s == 'a')
+ {
+ global_Show = 4;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s == 'M')
+ {
+ int _flag = 1;
+ float step = 0.005f;
+ //clrscr();
+ //global_Show = 4;
+ while (_flag!=0)
+ {
+ printf(">>"); s = _getch(); printf("\n");
+ MVector3 tmppos = {0,0,0};
+ Quaternion qhmd = { 1, 0, 0, 0 };
+ if (s == 'b')
+ {
+ _flag = 0;
+ }
+ else if (s == ' ')
+ {
+ global_ctlposition[0] = 0;
+ global_ctlposition[1] = 0;
+ global_ctlposition[2] = 0;
+ }
+ else if (s == 'r')
+ {
+ CQHMD = {1,0,0,0};
+ CQGamePad = { 1, 0, 0, 0 };
+ }
+ else if (s == 'c')
+ {
+
+ if (p.IsOpen())
+ {
+ ovrSensorState ss = p.GetSensorData();
+ qhmd = { ss.Recorded.Pose.Orientation.w, 0, ss.Recorded.Pose.Orientation.y, 0 };
+ CQHMD = CorrectQuaterinonY(qhmd);
+ CQGamePad = QuaternionMulti(CorrectQuaterinonY(GetPoseQuat()), qhmd);
+ printf("Success!\n");
+ }
+
+ }
+ else if ((s == 'w') || (s == 'W'))
+ {
+ tmppos = { 0, 0, -1 };//向前 -z方向
+ }
+ else if ((s == 's') || (s == 'S'))
+ {
+ tmppos = { 0, 0, 1 };//向后 z方向
+ }
+ else if ((s == 'a') || (s == 'A'))
+ {
+ tmppos = { 0, 0, -1 };//向左 -x方向
+ }
+ else if ((s == 'd') || (s == 'D'))
+ {
+ tmppos = { 0, 0, 1 };//向右 x方向
+ }
+ else if ((s == 'q') || (s == 'Q'))
+ {
+ global_ctlposition[1] -= step;
+ }
+ else if ((s == 'e') || (s == 'E'))
+ {
+ global_ctlposition[1] += step;
+ }
+ Quaternion cq;// = CorrectQuaterinonY(DM_GetQ());
+ if ((s == 'W') || (s == 'A') || (s == 'S') || (s == 'D'))
+ {
+ if (p.IsOpen())
+ {
+ ovrSensorState ss = p.GetSensorData();
+ qhmd = { ss.Recorded.Pose.Orientation.w, ss.Recorded.Pose.Orientation.x, ss.Recorded.Pose.Orientation.y, ss.Recorded.Pose.Orientation.z };
+ CQHMD = CorrectQuaterinonY(qhmd);
+ }
+ cq = CQHMD;
+ }
+ else if ((s == 'w') || (s == 'a') || (s == 's') || (s == 'd'))
+ {
+ cq = QuaternionMulti(CorrectQuaterinonY(GetPoseQuat()), CQGamePad);
+ }
+
+ if ((s == 'a') || (s == 'd') || (s == 'A') || (s == 'D'))
+ {
+ cq = QuaternionMulti(cq, CreateQuaternion(-90, { 0, 1, 0 }));
+ }
+
+ Matrix3 rm3 = QuaternionToMatrix(cq);
+ MVector3 posv3 = ComputeRotate(rm3, tmppos);
+ global_ctlposition[2] += posv3.v[2] * step;
+ global_ctlposition[0] += posv3.v[0] * step;
+ printf("POS:%f %f %f\n", global_ctlposition[0], global_ctlposition[1], global_ctlposition[2]);
+ }
+ }
+ else if (s == 'o')//原始数据
+ {
+ system("cls");
+ global_Show = 5;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s=='l')
+ {
+ printf("\nLED 颜色设置\n");
+ printf("K - BLACK\n");
+ printf("W - WHITE\n");
+ printf("R - RED\n");
+ printf("G - GREEN\n");
+ printf("B - BLUE\n");
+ printf("C - CYAN\n");
+ printf("M - MAGENTA\n");
+ printf("Y - YELLOW\n");
+ printf("L - LOOP\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s=='L'||s=='l')
+ {
+ for (int i = 0; i < 8; i++)
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[i];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ Sleep(250);
+ }
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[5];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ }
+ else
+ {
+ char colorlist[8]{'K', 'W', 'R', 'G', 'B', 'C', 'M', 'Y'};
+ for (int i = 0; i < 8; i++)
+ {
+ if (colorlist[i] == s || colorlist[i] == (s - 32))//大小写
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_LED;
+ FEATURE_OFFSET_Set[4] = LED_COLOR_LIST[i];
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("Color Set\n");
+ //printf("%x ", FEATURE_OFFSET_Set[4]);
+ }
+ else
+ {
+ printf("FAILED\n");
+ }
+ break;
+ }
+ }
+ }
+ }
+ else if (s == 'g')
+ {
+ printf("\n上位机陀螺仪校准\n");
+ printf(" - s - 显示陀螺仪数据\n");
+ printf(" - - b - 返回\n");
+ printf(" - c - 校准数据\n");
+ printf(" - r - 重置为0\n");
+ printf(" - g - 获取当前陀螺仪计校准参数\n");
+ printf(" - b - 返回\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'c')
+ {
+ //printf("上位机校准尚未实现\n");
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 GYRO_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ GYRO_Cali_Last[3] = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, GYRO_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ float gyrodefault[3] = { 0.0f, 0.0f, 0.0f};
+ memcpy(offset_set_data, gyrodefault, sizeof(float) * 3);
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ global_Show = 1;
+ global_calibration_flag = 1;
+ while (global_calibration_flag == 1)//开始获取gyro数据
+ {
+
+ }
+ global_Show = 0;
+ Sleep(500);
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ float gyronew[3] = { -gx0,-gz0,-gy0 };//逆向坐标转换
+ memcpy(offset_set_data, gyronew, sizeof(float) * 3);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Set[i]);
+ }
+ printf("\n");
+ printf("SetGyroOffset\n");
+ }
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ //显示数据
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ }
+ else if (s == 'g')//获取陀螺仪零偏数据
+ {
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("GetGyro\n");
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+ }
+ printf("\n");
+ //显示数据
+ //float* f= (float*)(FEATURE_OFFSET_Get + 6);
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ",offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ else if (s=='r')
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_GYRO;
+ float gyronew[3] = { 0, 0, 0 };
+ memcpy(offset_set_data, gyronew, sizeof(float) * 3);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("ResetGyroOffset\n");
+ }
+ for (int i = 0; i < 3; i++)
+ {
+ printf("%f ", offset_set_data[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 's')
+ {
+ global_Show = 1;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else if (s == 'b')
+ {
+
+ }
+ }
+ else if (s == 't')
+ {
+ printf("\n下位机陀螺仪校准\n请静置头显 \n 按任意键开始校准陀螺仪\n");
+ printf(" - b - 取消校准\n");
+ printf(" - s - 显示陀螺仪数据\n");
+ printf(" - - b - 返回\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ printf("校准取消\n");
+ }
+ else if (s == 's')
+ {
+ global_Show = 1;
+ while (global_Show != 0)
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'b')
+ {
+ global_Show = 0;
+ }
+ }
+ }
+ else
+ {
+ Sleep(1000);
+ UINT8 gyrocali[5] = { 0x08, 0x00, 0x00, 0x10, 0x26 };
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, gyrocali, 5))
+ {
+ printf("正在校准陀螺仪...请保持头盔静置!\n");
+ Sleep(5000);
+ printf("校准陀螺仪成功\n");
+ }
+ else
+ {
+ printf("校准陀螺仪失败\n");
+ }
+ }
+ }
+ else if (s == 'd')
+ {
+ printf("enter dfu\n");
+ UINT8 dfu[5] = { 0x08, 0x00, 0x00, 0x10, 0x25 };
+ HidD_SetFeature(DM_HID_Read_HANDLE, dfu, 5);
+ }
+ else if (s == 'i')
+ {
+ printf("chipid\n");
+ UINT8 chipid[15] = { 0x0A };
+ HidD_GetFeature(DM_HID_Read_HANDLE, chipid, 15);
+ for (int i = 0; i < 15; i++)
+ {
+ if(global_debug) printf("%2x ", chipid[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 'm')
+ {
+ printf("\n磁力校准\n");
+ printf(" - l - 计算2data.txt");
+ printf(" - r - 重置为默认值\n");
+ printf(" - g - 获取当前磁力计校准参数\n");
+ printf(" - s - 写入默认磁力计参数\n");
+ printf(" - c - 开始获取磁力计数据并写入data.txt\n");
+ printf(" - - f - 数据获取完成 需要输入新的校准参数\n");
+ printf(" - - c - 取消校准\n");
+ printf(" - - q - 退出校准\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s=='l')
+ {
+ GetMagDataFormFile();
+ }
+ else if (s == 's')
+ {
+ printf("setreport\n");
+ float magcali[6] = { -2.018673f, -2.303837f, 1.989453f, 4.899964f, 4.839235f, 5.541566f };
+ memcpy(offset_set_data, magcali, sizeof(float) * 6);
+
+
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Set[i]);
+ }
+ if (HidD_SetFeature(DM_HID_Read_HANDLE,FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("success\n");
+ }
+ }
+ else if (s == 'r')
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("ResetMagOffset\n");
+ }
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_set_data[i]);
+ }
+ printf("\n");
+ }
+ else if (s == 'g')
+ {
+// printf("GetMag\n");
+//
+// for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+// {
+// if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+// }
+// printf("\nin float\n");
+// for (int i = 0; i < 6; i++)
+// {
+// printf("%f ", offset_get_data[i]);
+// }
+// printf("\n");
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ for (int i = 0; i < FEATURE_OFFSET_SIZE; i++)
+ {
+ if(global_debug) printf("%2x ", FEATURE_OFFSET_Get[i]);
+ }
+ printf("\nin float\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ }
+ else if (s == 'c')
+ {
+ global_calibration_flag = 3;
+ if (global_calibration_flag == 3)//MagConfig
+ {
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 MAG_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ MAG_Cali_Last[3] = FEATURE_OFFSET_GET_MAG;
+ //if (HidD_GetFeature(DM_HID_Read_HANDLE, MAG_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ *offset_set_dev= FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ //if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ remove("data.txt");
+ fopen_s(&fpdata, "data.txt", "w");//打开一个空文件以进行写入。如果该文件存在,其内容将被销毁。
+
+ if (fpdata != NULL)
+ {
+ global_Show = 3;
+ printf("文件初始化成功!\n");
+ //Sleep(100);
+
+ }
+ else
+ {
+ printf("文件初始化失败!\n");
+ global_calibration_flag = 0;
+ }
+ while (global_calibration_flag == 3)//开始获取Mag数据
+ {
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'f' || s == 'c' || s == 'q')//结束/取消/退出
+ {
+ break;
+ }
+ }
+ }
+ global_Show = 0;
+ }
+ global_calibration_flag = 0;
+ if (fpdata != NULL)
+ {
+ CancelIo(fpdata);
+ fclose(fpdata);
+ }
+
+ if (s == 'f')//Finished
+ {
+ printf("写入文件数据结束,等待计算参数后输入:\n");
+ float mag_new_cali[6];
+ system("pause");
+ MagCaliParam magcalitmp = GetMagDataFormFile();
+ mag_new_cali[0] = magcalitmp.xOffset;
+ mag_new_cali[1] = magcalitmp.yOffset;
+ mag_new_cali[2] = magcalitmp.zOffset;
+ mag_new_cali[3] = magcalitmp.xScale;
+ mag_new_cali[4] = magcalitmp.yScale;
+ mag_new_cali[5] = magcalitmp.zScale;
+// for (int i = 0; i < 6; i++)
+// {
+// printf("输入第%d个参数:", i + 1);
+// std::cin >> mag_str_tmp;
+// mag_new_cali[i] = atof(mag_str_tmp);
+// }
+ memcpy(offset_set_data, mag_new_cali, sizeof(float) * 6);
+ }
+ else
+ {
+ if (s == 'c')
+ printf("校准取消");
+ memcpy(FEATURE_OFFSET_Set, MAG_Cali_Last, FEATURE_OFFSET_SIZE);
+ }
+ printf("\n");
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ if (s == 'c')
+ printf("参数写入成功\n");
+ }
+ //最后读取一遍
+ printf("Get\n");
+ Sleep(100);
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("当前校准参数:\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+
+ }
+ }
+
+
+ }
+ else if (s == 'p')
+ {
+
+ printf("管道服务器\n");
+ printf(" - r - 启动管道服务器\n");
+ printf(" - s - 关闭管道服务器\n");
+ printf(">>"); s = _getche(); printf("\n");
+ if (s == 'r')
+ {
+ if (global_pipeserver == 0)
+ {
+ global_pipeserver = 1;
+ printf("启动管道服务器.....\n");
+ start_thread(pipeservermain, NULL);
+ }
+ else
+ {
+ printf("管道服务器已经运行...\n");
+ }
+ }
+ else if (s == 's')
+ {
+ if (global_pipeserver == 0)
+ {
+ printf("管道服务器尚未开启...\n");
+ }
+ else
+ {
+ global_pipeserver = -1;
+ }
+ }
+
+ }
+ }
+
+ printf("按任意按键开始校准...\n");
+ getchar();
+ printf("开始写入数据...\n");
+
+ while (1)
+ {
+
+ }
+
+
+
+}
+//win消息
+#include
+BOOL bIsRunning = TRUE;
+//transform
+#include
+#pragma region HID
+HDEVINFO device_info_set;
+
+SP_DEVICE_INTERFACE_DATA device_interface_data;
+HIDP_CAPS dematrix_device_capabilities;
+GUID HidGuid;
+BOOL InitPathFromInterfaceData(HDEVINFO hdevInfoSet, SP_DEVICE_INTERFACE_DATA* pidata)
+{
+ DWORD detailSize = 0;
+ BOOL Result;
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, NULL, (DWORD)NULL, &detailSize, NULL);
+
+ pData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(detailSize);
+ if (pData == NULL){
+ printf("内存不足!\n");
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ return FALSE;
+ }
+ pData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
+
+ Result = SetupDiGetDeviceInterfaceDetail(hdevInfoSet, pidata, pData, detailSize, NULL, NULL);
+ if (Result == TRUE)
+ {
+ //printf("Path = %s\n", (char *)(pData->DevicePath));
+ return TRUE;
+ }
+ return FALSE;
+}
+BOOL DM_HIDDeviceEnumerate(void)
+{
+
+ HDEVINFO hdevInfoSet;
+ SP_DEVICE_INTERFACE_DATA interfaceData;
+ int gamepadcount = 0;
+
+ int deviceIndex = 0;
+ interfaceData.cbSize = sizeof(interfaceData);
+
+ /* 先取得GUID */
+ HidD_GetHidGuid(&HidGuid);
+
+ hdevInfoSet = SetupDiGetClassDevs(&HidGuid, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);
+
+ if (hdevInfoSet == INVALID_HANDLE_VALUE) return FALSE;
+
+ for (deviceIndex = 0;
+ SetupDiEnumDeviceInterfaces(hdevInfoSet, NULL, &HidGuid, deviceIndex, &interfaceData);
+ deviceIndex++)
+ {
+
+
+ if (!InitPathFromInterfaceData(hdevInfoSet, &interfaceData))
+ continue;
+ //printf("index = %d\n",deviceIndex);
+ string pathstr(pData->DevicePath);
+ transform(pathstr.begin(), pathstr.end(), pathstr.begin(), toupper);
+ std::size_t found = pathstr.find(strGlobalDevicePath);
+
+ if (found != std::string::npos)
+ {
+ // printf("Path = %s\n", pathstr.c_str());
+ sCurrent_Device_str = pathstr;
+ //printf("sCurrent_Device_str:\n %s\n", sCurrent_Device_str.c_str());
+ DM_HID_Read_HANDLE = CreateFileA((char *)(pData->DevicePath), (DWORD)GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |
+ FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
+
+ DM_HID_Write_HANDLE = CreateFileA((char *)(pData->DevicePath), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ (LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);
+
+ if (DM_HID_Read_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ device_is_found = TRUE;
+ SetEvent(usb_read_over_lapped.hEvent);
+ printf("read打开设备成功!\n>>");
+ }
+ else
+ {
+ printf("read打开设备失败!\n>>");
+ }
+ if (DM_HID_Write_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ printf("write打开设备成功!\n>>");
+ }
+ else
+ {
+ printf("write打开设备失败!\n>>");
+ }
+
+ break;
+ }
+ else
+ continue;
+ }
+ SetupDiDestroyDeviceInfoList(hdevInfoSet);
+ if (device_is_found == TRUE)return TRUE;
+ else
+ return FALSE;
+}
+#pragma endregion
+#pragma region WindowsMessage
+
+HWND hMessageWindow;
+HDEVNOTIFY hDeviceNotify;
+
+bool MessageCallback(WORD messageType, const std::string& devicePath)
+{
+ bool rv = true;
+ if (messageType == DBT_DEVICEARRIVAL)
+ {
+
+ //rv = pNotificationClient->OnMessage(Notifier::DeviceAdded, devicePath);
+ if (!device_is_found)
+ {
+ printf("检测到新设备插入,正在初始化!\n>>");
+ DM_HIDDeviceEnumerate();
+ rv = device_is_found;
+ //TriggerHaptic(1, 50);
+ //TriggerHaptic(1, 100);
+ }
+ else
+ {
+ printf("检测到插入VID PID 相同的设备,但设备已经初始化!\n>>");
+ }
+ }
+ else if (messageType == DBT_DEVICEREMOVECOMPLETE)
+ {
+ //pNotificationClient->OnMessage(Notifier::DeviceRemoved, devicePath);
+ //printf("%s\n%s\n", devicePath.c_str(), sCurrent_Device_str.c_str());
+ if (device_is_found)
+ {
+ //found = devicePath.find(sCurrent_Device_str);
+ if (devicePath.find(sCurrent_Device_str) != std::string::npos)
+ {
+ ResetAHRS();
+ device_is_found = FALSE;
+ sCurrent_Device_str = "NULL";
+ if (DM_HID_Read_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(DM_HID_Read_HANDLE);
+ DM_HID_Read_HANDLE = INVALID_HANDLE_VALUE;
+ }
+ if (DM_HID_Write_HANDLE != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(DM_HID_Write_HANDLE);
+ DM_HID_Write_HANDLE = INVALID_HANDLE_VALUE;
+ }
+ printf("设备已拔出!\n>>");
+ }
+ else
+ {
+ printf("拔出了具有相同的vid pid但并不是已经打开的设备!\n>>");
+ }
+ }
+ }
+ else
+ {
+
+ }
+ return rv;
+}
+
+
+LRESULT CALLBACK WindowsMessageCallback(HWND hwnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (message)
+ {
+ case WM_CREATE:
+ {
+ // Setup window user data with device status object pointer.
+ LPCREATESTRUCT create_struct = reinterpret_cast(lParam);
+ void *lpCreateParam = create_struct->lpCreateParams;
+ //DeviceStatus *pDeviceStatus = reinterpret_cast(lpCreateParam);
+ //printf("create\n");
+ bIsRunning = TRUE;
+ //SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast(pDeviceStatus));
+ }
+ return 0; // Return 0 for successfully handled WM_CREATE.
+
+ case WM_DEVICECHANGE:
+ {
+ WORD loword = LOWORD(wParam);
+
+ if (loword != DBT_DEVICEARRIVAL &&
+ loword != DBT_DEVICEREMOVECOMPLETE)
+ {
+ // Ignore messages other than device arrive and remove complete
+ // (we're not handling intermediate ones).
+ return TRUE; // Grant WM_DEVICECHANGE request.
+ }
+
+ DEV_BROADCAST_DEVICEINTERFACE* hdr;
+ hdr = (DEV_BROADCAST_DEVICEINTERFACE*)lParam;
+
+ if (hdr->dbcc_devicetype != DBT_DEVTYP_DEVICEINTERFACE)
+ {
+ // Ignore non interface device messages.
+ return TRUE; // Grant WM_DEVICECHANGE request.
+ }
+
+ //LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
+
+ //DeviceStatus* pDeviceStatus = (DeviceStatus*)userData;
+ string devicePath(hdr->dbcc_name);
+
+ if (/*pDeviceStatus->*/HidGuid == hdr->dbcc_classguid)
+ {
+ transform(devicePath.begin(), devicePath.end(), devicePath.begin(), toupper);
+ std::string str2(strGlobalDevicePath);
+ //printf("devicePath:%s\n", devicePath.c_str());
+ std::size_t found = devicePath.find(str2);
+ if (found != std::string::npos)
+ {
+ if (!MessageCallback(loword, devicePath))
+ {
+
+ }
+ break;
+ }
+ }
+ }
+ return TRUE; // Grant WM_DEVICECHANGE request.
+
+
+ case WM_CLOSE:
+ {
+ //LONG_PTR userData = GetWindowLongPtr(hwnd, GWLP_USERDATA);
+ bIsRunning = FALSE;
+ DestroyWindow(hwnd);
+ }
+ return 0; // We processed the WM_CLOSE message.
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0; // We processed the WM_DESTROY message.
+ }
+
+ return DefWindowProc(hwnd, message, wParam, lParam);
+}
+
+
+bool WinProcInitialize()
+{
+ TCHAR special_name[] = TEXT("wnd_class_name_usbDMCali_JustFeng_2017");
+ WNDCLASS wndClass;
+ wndClass.style = CS_HREDRAW | CS_VREDRAW;
+ wndClass.lpfnWndProc = WindowsMessageCallback;
+ wndClass.cbClsExtra = 0;
+ wndClass.cbWndExtra = 0;
+ wndClass.hInstance = 0;
+ wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
+ wndClass.lpszMenuName = NULL;
+ wndClass.lpszClassName = special_name;
+
+ if (!RegisterClass(&wndClass))
+ {
+ printf("Failed to register window class.");
+ return false;
+ }
+
+ // We're going to create a 'message-only' window. This will be hidden, can't be enumerated etc.
+ // To do this we supply 'HWND_MESSAGE' as the hWndParent.
+ // http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#message_only
+ hMessageWindow = CreateWindow(special_name,
+ special_name,
+ WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ HWND_MESSAGE,
+ NULL,
+ 0,
+ NULL); // Pass this object via the CREATESTRUCT mechanism
+ // so that we can attach it to the window user data.
+
+ if (hMessageWindow == NULL)
+ {
+ printf("Failed to create window.");
+ return false;
+ }
+
+ // According to MS, topmost windows receive WM_DEVICECHANGE faster.
+ ::SetWindowPos(hMessageWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+ UpdateWindow(hMessageWindow);
+
+
+ // Register notification for additional HID messages.
+ HidD_GetHidGuid(&HidGuid);
+
+ DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
+
+ ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
+ notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+ notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+ //notificationFilter.dbcc_classguid = hidguid;
+
+ // We need DEVICE_NOTIFY_ALL_INTERFACE_CLASSES to detect
+ // HDMI plug/unplug events.
+ hDeviceNotify = RegisterDeviceNotification(
+ hMessageWindow,
+ ¬ificationFilter,
+ DEVICE_NOTIFY_ALL_INTERFACE_CLASSES | DEVICE_NOTIFY_WINDOW_HANDLE);
+
+ if (hDeviceNotify == NULL)
+ {
+ printf("Failed to register for device notifications.");
+ return false;
+ }
+
+ return true;
+}
+
+void ProcessMessages()
+{
+ //printf("MSG\n");
+ if (hMessageWindow == NULL)
+ printf("Need to call 'Initialize' before first use.");
+
+ MSG msg;
+
+ // Note WM_DEVICECHANGED messages are dispatched but not retrieved by PeekMessage.
+ // I think this is because they are pending, non-queued messages.
+ while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+}
+
+#pragma endregion
+
+
+DWORD Thread_Win_MSG()
+{
+
+ if (!WinProcInitialize())
+ {
+ bIsRunning = FALSE;
+ }
+ while (bIsRunning)
+ {
+ Sleep(1);
+ ProcessMessages();
+
+ }
+ return 0;
+}
+
+
+
+
+
+ /* 控制器初始化函数 */
+ __declspec(dllexport) int Init(char* devpath)
+ {
+ USB_HID_Init();
+ strGlobalDevicePath = devpath;//"VID_2833&PID_0002";
+ globalpacklen = 64;
+ start_thread(Thread_Win_MSG, 0);
+ DM_HIDDeviceEnumerate();
+ return 1;
+ }
+
+
+ __declspec(dllexport) int CheckDevice(void)
+ {
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ printf("设备已连接...\n");
+ }
+ else
+ {
+ printf("设备断开连接...\n");
+ device_is_found = FALSE;
+ }
+ return device_is_found?1:0;
+ }
+
+ __declspec(dllexport) int GyroCali(void)
+ {
+ if (device_is_found)
+ {
+ UINT8 gyrocali[5] = { 0x08, 0x00, 0x00, 0x10, 0x26 };
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, gyrocali, 5))
+ {
+ //printf("正在校准陀螺仪...请保持头盔静置!\n");
+ //Sleep(1000);
+ return 1;
+ //printf("校准陀螺仪成功\n");
+ }
+ }
+
+ return 0;
+
+
+ }
+ __declspec(dllexport) Vector3 GetGyroCali(void)
+ {
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ if (!device_is_found)
+ return v;
+
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+
+
+ *offset_set_dev = *offset_get_dev = 0;
+ memset(offset_get_data, 0, FEATURE_OFFSET_SIZE - 4);
+ memset(offset_set_data, 0, FEATURE_OFFSET_SIZE - 4);
+
+ *offset_set_dev = FEATURE_OFFSET_GET_GYRO;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_GYRO;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ v.x = offset_get_data[0];
+ v.y = offset_get_data[1];
+ v.z = offset_get_data[2];
+ }
+ return v;
+ }
+
+ __declspec(dllexport) MagCaliParam GetMagCali()
+ {
+ MagCaliParam mcp;
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ *offset_get_dev = FEATURE_OFFSET_GET_MAG;
+
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Get, FEATURE_OFFSET_SIZE))
+ {
+ mcp.xOffset = offset_get_data[0];
+ mcp.yOffset = offset_get_data[1];
+ mcp.zOffset = offset_get_data[2];
+ mcp.xScale = offset_get_data[3];
+ mcp.yScale = offset_get_data[4];
+ mcp.zScale = offset_get_data[5];
+
+ printf("当前校准参数:\n");
+ for (int i = 0; i < 6; i++)
+ {
+ printf("%f ", offset_get_data[i]);
+ }
+ printf("\n");
+ }
+ return mcp;
+ }
+ __declspec(dllexport) int SetMagCali(float x, float y, float z, float x0, float y0, float z0)
+ {
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ float magdefault[6] = { x, y, z, x0, y0, z0 };
+ memcpy(offset_set_data, magdefault, sizeof(float) * 6);
+ if (HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE))
+ {
+ printf("SetMagOffset\n");
+ return 1;
+ }
+ return 0;
+ }
+
+
+int Global_MagCali = 0;
+
+__declspec(dllexport) int MagCalibrate(void)
+{
+ if (global_calibration_flag == 3)
+ {
+ return 0;
+ }
+ UINT8 FEATURE_OFFSET_Get[FEATURE_OFFSET_SIZE] = { 0x0b };
+ UINT8 FEATURE_OFFSET_Set[FEATURE_OFFSET_SIZE] = { 0x0b };
+
+ UINT8* offset_get_dev = (UINT8*)(FEATURE_OFFSET_Get + 3);
+ float* offset_get_data = (float*)(FEATURE_OFFSET_Get + 4);
+
+ UINT8* offset_set_dev = (UINT8*)(FEATURE_OFFSET_Set + 3);
+ float* offset_set_data = (float*)(FEATURE_OFFSET_Set + 4);
+ DWORD checkhandle;
+ global_calibration_flag = 3;
+ if (global_calibration_flag == 3)//MagConfig
+ {
+
+ *offset_set_dev = FEATURE_OFFSET_GET_MAG;
+ HidD_SetFeature(DM_HID_Read_HANDLE, FEATURE_OFFSET_Set, FEATURE_OFFSET_SIZE);
+ UINT8 MAG_Cali_Last[FEATURE_OFFSET_SIZE] = { 0x0B };
+ MAG_Cali_Last[3] = FEATURE_OFFSET_GET_MAG;
+ if (HidD_GetFeature(DM_HID_Read_HANDLE, MAG_Cali_Last, FEATURE_OFFSET_SIZE))
+ {
+ *offset_set_dev = FEATURE_OFFSET_SET_MAG;
+ if (SetMagCali(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f))
+ {
+ return 1;
+ }
+ global_Show = 0;
+ }
+ global_calibration_flag = 0;
+
+ return 0;
+ }
+}
+
+__declspec(dllexport) int FinishMagCali(void)
+{
+ global_calibration_flag = 0;
+ global_Show = 0;
+ return 1;
+}
+__declspec(dllexport) MagCaliParam CalculateMagParam()
+{
+ return GetMagDataFormFile();
+}
+
+/* 获取左手信息 */
+__declspec(dllexport) Vector3 GetPoint(void)
+{
+ if (!device_is_found){
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ return v;
+ }
+ return GetMagData();
+}
+
+__declspec(dllexport) Vector3 GetEulerianAngle(void)
+{
+ Vector3 v;
+ v.x = v.y = v.z = -99999.0f;
+ if (device_is_found)
+ {
+ v.z = DM_GetYaw();
+ v.x = DM_GetPitch();
+ v.y = DM_GetRoll();
+ }
+ return v;
+}
+
+__declspec(dllexport) int Correction(void)
+{
+ return ResetHeading();
+}
+
+__declspec(dllexport) Quaternion GetQuaternion(void)
+{
+ return GetPoseQuat();
+}
diff --git a/4.Software/GeekIMUDriver 1.1/Src/openvr_driver.h b/4.Software/GeekIMUDriver 1.1/Src/openvr_driver.h
new file mode 100644
index 0000000..ea7f8d1
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/openvr_driver.h
@@ -0,0 +1,1635 @@
+#pragma once
+
+// openvr_driver.h
+//========= Copyright Valve Corporation ============//
+// Dynamically generated file. Do not modify this file directly.
+
+#ifndef _OPENVR_DRIVER_API
+#define _OPENVR_DRIVER_API
+
+#include
+
+
+
+// vrtypes.h
+#ifndef _INCLUDE_VRTYPES_H
+#define _INCLUDE_VRTYPES_H
+
+namespace vr
+{
+
+#if defined(__linux__) || defined(__APPLE__)
+ // The 32-bit version of gcc has the alignment requirement for uint64 and double set to
+ // 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
+ // The 64-bit version of gcc has the alignment requirement for these types set to
+ // 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
+ // The 64-bit structure packing has to match the 32-bit structure packing for each platform.
+ #pragma pack( push, 4 )
+#else
+ #pragma pack( push, 8 )
+#endif
+
+typedef void* glSharedTextureHandle_t;
+typedef int32_t glInt_t;
+typedef uint32_t glUInt_t;
+
+// right-handed system
+// +y is up
+// +x is to the right
+// -z is going away from you
+// Distance unit is meters
+struct HmdMatrix34_t
+{
+ float m[3][4];
+};
+
+struct HmdMatrix44_t
+{
+ float m[4][4];
+};
+
+struct HmdVector3_t
+{
+ float v[3];
+};
+
+struct HmdVector4_t
+{
+ float v[4];
+};
+
+struct HmdVector3d_t
+{
+ double v[3];
+};
+
+struct HmdVector2_t
+{
+ float v[2];
+};
+
+struct HmdQuaternion_t
+{
+ double w, x, y, z;
+};
+
+struct HmdColor_t
+{
+ float r, g, b, a;
+};
+
+struct HmdQuad_t
+{
+ HmdVector3_t vCorners[ 4 ];
+};
+
+struct HmdRect2_t
+{
+ HmdVector2_t vTopLeft;
+ HmdVector2_t vBottomRight;
+};
+
+/** Used to return the post-distortion UVs for each color channel.
+* UVs range from 0 to 1 with 0,0 in the upper left corner of the
+* source render target. The 0,0 to 1,1 range covers a single eye. */
+struct DistortionCoordinates_t
+{
+ float rfRed[2];
+ float rfGreen[2];
+ float rfBlue[2];
+};
+
+enum EVREye
+{
+ Eye_Left = 0,
+ Eye_Right = 1
+};
+
+enum EGraphicsAPIConvention
+{
+ API_DirectX = 0, // Normalized Z goes from 0 at the viewer to 1 at the far clip plane
+ API_OpenGL = 1, // Normalized Z goes from 1 at the viewer to -1 at the far clip plane
+};
+
+enum EColorSpace
+{
+ ColorSpace_Auto = 0, // Assumes 'gamma' for 8-bit per component formats, otherwise 'linear'. This mirrors the DXGI formats which have _SRGB variants.
+ ColorSpace_Gamma = 1, // Texture data can be displayed directly on the display without any conversion (a.k.a. display native format).
+ ColorSpace_Linear = 2, // Same as gamma but has been converted to a linear representation using DXGI's sRGB conversion algorithm.
+};
+
+struct Texture_t
+{
+ void* handle; // Native d3d texture pointer or GL texture id.
+ EGraphicsAPIConvention eType;
+ EColorSpace eColorSpace;
+};
+
+enum ETrackingResult
+{
+ TrackingResult_Uninitialized = 1,
+
+ TrackingResult_Calibrating_InProgress = 100,
+ TrackingResult_Calibrating_OutOfRange = 101,
+
+ TrackingResult_Running_OK = 200,
+ TrackingResult_Running_OutOfRange = 201,
+};
+
+static const uint32_t k_unTrackingStringSize = 32;
+static const uint32_t k_unMaxDriverDebugResponseSize = 32768;
+
+/** Used to pass device IDs to API calls */
+typedef uint32_t TrackedDeviceIndex_t;
+static const uint32_t k_unTrackedDeviceIndex_Hmd = 0;
+static const uint32_t k_unMaxTrackedDeviceCount = 16;
+static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF;
+
+/** Describes what kind of object is being tracked at a given ID */
+enum ETrackedDeviceClass
+{
+ TrackedDeviceClass_Invalid = 0, // the ID was not valid.
+ TrackedDeviceClass_HMD = 1, // Head-Mounted Displays
+ TrackedDeviceClass_Controller = 2, // Tracked controllers
+ TrackedDeviceClass_TrackingReference = 4, // Camera and base stations that serve as tracking reference points
+
+ TrackedDeviceClass_Other = 1000,
+};
+
+
+/** Describes what specific role associated with a tracked device */
+enum ETrackedControllerRole
+{
+ TrackedControllerRole_Invalid = 0, // Invalid value for controller type
+ TrackedControllerRole_LeftHand = 1, // Tracked device associated with the left hand
+ TrackedControllerRole_RightHand = 2, // Tracked device associated with the right hand
+};
+
+
+/** describes a single pose for a tracked object */
+struct TrackedDevicePose_t
+{
+ HmdMatrix34_t mDeviceToAbsoluteTracking;
+ HmdVector3_t vVelocity; // velocity in tracker space in m/s
+ HmdVector3_t vAngularVelocity; // angular velocity in radians/s (?)
+ ETrackingResult eTrackingResult;
+ bool bPoseIsValid;
+
+ // This indicates that there is a device connected for this spot in the pose array.
+ // It could go from true to false if the user unplugs the device.
+ bool bDeviceIsConnected;
+};
+
+/** Identifies which style of tracking origin the application wants to use
+* for the poses it is requesting */
+enum ETrackingUniverseOrigin
+{
+ TrackingUniverseSeated = 0, // Poses are provided relative to the seated zero pose
+ TrackingUniverseStanding = 1, // Poses are provided relative to the safe bounds configured by the user
+ TrackingUniverseRawAndUncalibrated = 2, // Poses are provided in the coordinate system defined by the driver. You probably don't want this one.
+};
+
+
+/** Each entry in this enum represents a property that can be retrieved about a
+* tracked device. Many fields are only valid for one ETrackedDeviceClass. */
+enum ETrackedDeviceProperty
+{
+ // general properties that apply to all device classes
+ Prop_TrackingSystemName_String = 1000,
+ Prop_ModelNumber_String = 1001,
+ Prop_SerialNumber_String = 1002,
+ Prop_RenderModelName_String = 1003,
+ Prop_WillDriftInYaw_Bool = 1004,
+ Prop_ManufacturerName_String = 1005,
+ Prop_TrackingFirmwareVersion_String = 1006,
+ Prop_HardwareRevision_String = 1007,
+ Prop_AllWirelessDongleDescriptions_String = 1008,
+ Prop_ConnectedWirelessDongle_String = 1009,
+ Prop_DeviceIsWireless_Bool = 1010,
+ Prop_DeviceIsCharging_Bool = 1011,
+ Prop_DeviceBatteryPercentage_Float = 1012, // 0 is empty, 1 is full
+ Prop_StatusDisplayTransform_Matrix34 = 1013,
+ Prop_Firmware_UpdateAvailable_Bool = 1014,
+ Prop_Firmware_ManualUpdate_Bool = 1015,
+ Prop_Firmware_ManualUpdateURL_String = 1016,
+ Prop_HardwareRevision_Uint64 = 1017,
+ Prop_FirmwareVersion_Uint64 = 1018,
+ Prop_FPGAVersion_Uint64 = 1019,
+ Prop_VRCVersion_Uint64 = 1020,
+ Prop_RadioVersion_Uint64 = 1021,
+ Prop_DongleVersion_Uint64 = 1022,
+ Prop_BlockServerShutdown_Bool = 1023,
+ Prop_CanUnifyCoordinateSystemWithHmd_Bool = 1024,
+ Prop_ContainsProximitySensor_Bool = 1025,
+ Prop_DeviceProvidesBatteryStatus_Bool = 1026,
+ Prop_DeviceCanPowerOff_Bool = 1027,
+ Prop_Firmware_ProgrammingTarget_String = 1028,
+ Prop_DeviceClass_Int32 = 1029,
+ Prop_HasCamera_Bool = 1030,
+
+ // Properties that are unique to TrackedDeviceClass_HMD
+ Prop_ReportsTimeSinceVSync_Bool = 2000,
+ Prop_SecondsFromVsyncToPhotons_Float = 2001,
+ Prop_DisplayFrequency_Float = 2002,
+ Prop_UserIpdMeters_Float = 2003,
+ Prop_CurrentUniverseId_Uint64 = 2004,
+ Prop_PreviousUniverseId_Uint64 = 2005,
+ Prop_DisplayFirmwareVersion_Uint64 = 2006,
+ Prop_IsOnDesktop_Bool = 2007,
+ Prop_DisplayMCType_Int32 = 2008,
+ Prop_DisplayMCOffset_Float = 2009,
+ Prop_DisplayMCScale_Float = 2010,
+ Prop_EdidVendorID_Int32 = 2011,
+ Prop_DisplayMCImageLeft_String = 2012,
+ Prop_DisplayMCImageRight_String = 2013,
+ Prop_DisplayGCBlackClamp_Float = 2014,
+ Prop_EdidProductID_Int32 = 2015,
+ Prop_CameraToHeadTransform_Matrix34 = 2016,
+ Prop_DisplayGCType_Int32 = 2017,
+ Prop_DisplayGCOffset_Float = 2018,
+ Prop_DisplayGCScale_Float = 2019,
+ Prop_DisplayGCPrescale_Float = 2020,
+ Prop_DisplayGCImage_String = 2021,
+ Prop_LensCenterLeftU_Float = 2022,
+ Prop_LensCenterLeftV_Float = 2023,
+ Prop_LensCenterRightU_Float = 2024,
+ Prop_LensCenterRightV_Float = 2025,
+ Prop_UserHeadToEyeDepthMeters_Float = 2026,
+ Prop_CameraFirmwareVersion_Uint64 = 2027,
+ Prop_CameraFirmwareDescription_String = 2028,
+ Prop_DisplayFPGAVersion_Uint64 = 2029,
+ Prop_DisplayBootloaderVersion_Uint64 = 2030,
+ Prop_DisplayHardwareVersion_Uint64 = 2031,
+ Prop_AudioFirmwareVersion_Uint64 = 2032,
+ Prop_CameraCompatibilityMode_Int32 = 2033,
+
+ // Properties that are unique to TrackedDeviceClass_Controller
+ Prop_AttachedDeviceId_String = 3000,
+ Prop_SupportedButtons_Uint64 = 3001,
+ Prop_Axis0Type_Int32 = 3002, // Return value is of type EVRControllerAxisType
+ Prop_Axis1Type_Int32 = 3003, // Return value is of type EVRControllerAxisType
+ Prop_Axis2Type_Int32 = 3004, // Return value is of type EVRControllerAxisType
+ Prop_Axis3Type_Int32 = 3005, // Return value is of type EVRControllerAxisType
+ Prop_Axis4Type_Int32 = 3006, // Return value is of type EVRControllerAxisType
+
+ // Properties that are unique to TrackedDeviceClass_TrackingReference
+ Prop_FieldOfViewLeftDegrees_Float = 4000,
+ Prop_FieldOfViewRightDegrees_Float = 4001,
+ Prop_FieldOfViewTopDegrees_Float = 4002,
+ Prop_FieldOfViewBottomDegrees_Float = 4003,
+ Prop_TrackingRangeMinimumMeters_Float = 4004,
+ Prop_TrackingRangeMaximumMeters_Float = 4005,
+ Prop_ModeLabel_String = 4006,
+
+ // Vendors are free to expose private debug data in this reserved region
+ Prop_VendorSpecific_Reserved_Start = 10000,
+ Prop_VendorSpecific_Reserved_End = 10999,
+};
+
+/** No string property will ever be longer than this length */
+static const uint32_t k_unMaxPropertyStringSize = 32 * 1024;
+
+/** Used to return errors that occur when reading properties. */
+enum ETrackedPropertyError
+{
+ TrackedProp_Success = 0,
+ TrackedProp_WrongDataType = 1,
+ TrackedProp_WrongDeviceClass = 2,
+ TrackedProp_BufferTooSmall = 3,
+ TrackedProp_UnknownProperty = 4,
+ TrackedProp_InvalidDevice = 5,
+ TrackedProp_CouldNotContactServer = 6,
+ TrackedProp_ValueNotProvidedByDevice = 7,
+ TrackedProp_StringExceedsMaximumLength = 8,
+ TrackedProp_NotYetAvailable = 9, // The property value isn't known yet, but is expected soon. Call again later.
+};
+
+/** Allows the application to control what part of the provided texture will be used in the
+* frame buffer. */
+struct VRTextureBounds_t
+{
+ float uMin, vMin;
+ float uMax, vMax;
+};
+
+
+/** Allows the applicaiton to control how scene textures are used by the compositor when calling Submit. */
+enum EVRSubmitFlags
+{
+ // Simple render path. App submits rendered left and right eye images with no lens distortion correction applied.
+ Submit_Default = 0x00,
+
+ // App submits final left and right eye images with lens distortion already applied (lens distortion makes the images appear
+ // barrel distorted with chromatic aberration correction applied). The app would have used the data returned by
+ // vr::IVRSystem::ComputeDistortion() to apply the correct distortion to the rendered images before calling Submit().
+ Submit_LensDistortionAlreadyApplied = 0x01,
+
+ // If the texture pointer passed in is actually a renderbuffer (e.g. for MSAA in OpenGL) then set this flag.
+ Submit_GlRenderBuffer = 0x02
+};
+
+
+/** Status of the overall system or tracked objects */
+enum EVRState
+{
+ VRState_Undefined = -1,
+ VRState_Off = 0,
+ VRState_Searching = 1,
+ VRState_Searching_Alert = 2,
+ VRState_Ready = 3,
+ VRState_Ready_Alert = 4,
+ VRState_NotReady = 5,
+};
+
+/** The types of events that could be posted (and what the parameters mean for each event type) */
+enum EVREventType
+{
+ VREvent_None = 0,
+
+ VREvent_TrackedDeviceActivated = 100,
+ VREvent_TrackedDeviceDeactivated = 101,
+ VREvent_TrackedDeviceUpdated = 102,
+ VREvent_TrackedDeviceUserInteractionStarted = 103,
+ VREvent_TrackedDeviceUserInteractionEnded = 104,
+ VREvent_IpdChanged = 105,
+ VREvent_EnterStandbyMode = 106,
+ VREvent_LeaveStandbyMode = 107,
+ VREvent_TrackedDeviceRoleChanged = 108,
+
+ VREvent_ButtonPress = 200, // data is controller
+ VREvent_ButtonUnpress = 201, // data is controller
+ VREvent_ButtonTouch = 202, // data is controller
+ VREvent_ButtonUntouch = 203, // data is controller
+
+ VREvent_MouseMove = 300, // data is mouse
+ VREvent_MouseButtonDown = 301, // data is mouse
+ VREvent_MouseButtonUp = 302, // data is mouse
+ VREvent_FocusEnter = 303, // data is overlay
+ VREvent_FocusLeave = 304, // data is overlay
+ VREvent_Scroll = 305, // data is mouse
+ VREvent_TouchPadMove = 306, // data is mouse
+
+ VREvent_InputFocusCaptured = 400, // data is process
+ VREvent_InputFocusReleased = 401, // data is process
+ VREvent_SceneFocusLost = 402, // data is process
+ VREvent_SceneFocusGained = 403, // data is process
+ VREvent_SceneApplicationChanged = 404, // data is process - The App actually drawing the scene changed (usually to or from the compositor)
+ VREvent_SceneFocusChanged = 405, // data is process - New app got access to draw the scene
+
+ VREvent_HideRenderModels = 410, // Sent to the scene application to request hiding render models temporarily
+ VREvent_ShowRenderModels = 411, // Sent to the scene application to request restoring render model visibility
+
+ VREvent_OverlayShown = 500,
+ VREvent_OverlayHidden = 501,
+ VREvent_DashboardActivated = 502,
+ VREvent_DashboardDeactivated = 503,
+ VREvent_DashboardThumbSelected = 504, // Sent to the overlay manager - data is overlay
+ VREvent_DashboardRequested = 505, // Sent to the overlay manager - data is overlay
+ VREvent_ResetDashboard = 506, // Send to the overlay manager
+ VREvent_RenderToast = 507, // Send to the dashboard to render a toast - data is the notification ID
+ VREvent_ImageLoaded = 508, // Sent to overlays when a SetOverlayRaw or SetOverlayFromFile call finishes loading
+ VREvent_ShowKeyboard = 509, // Sent to keyboard renderer in the dashboard to invoke it
+ VREvent_HideKeyboard = 510, // Sent to keyboard renderer in the dashboard to hide it
+ VREvent_OverlayGamepadFocusGained = 511, // Sent to an overlay when IVROverlay::SetFocusOverlay is called on it
+ VREvent_OverlayGamepadFocusLost = 512, // Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else
+ VREvent_OverlaySharedTextureChanged = 513,
+
+ VREvent_Notification_Shown = 600,
+ VREvent_Notification_Hidden = 601,
+ VREvent_Notification_BeginInteraction = 602,
+ VREvent_Notification_Destroyed = 603,
+
+ VREvent_Quit = 700, // data is process
+ VREvent_ProcessQuit = 701, // data is process
+ VREvent_QuitAborted_UserPrompt = 702, // data is process
+ VREvent_QuitAcknowledged = 703, // data is process
+
+ VREvent_ChaperoneDataHasChanged = 800,
+ VREvent_ChaperoneUniverseHasChanged = 801,
+ VREvent_ChaperoneTempDataHasChanged = 802,
+ VREvent_ChaperoneSettingsHaveChanged = 803,
+ VREvent_SeatedZeroPoseReset = 804,
+
+ VREvent_BackgroundSettingHasChanged = 850,
+ VREvent_CameraSettingsHaveChanged = 851,
+
+ VREvent_StatusUpdate = 900,
+
+ VREvent_MCImageUpdated = 1000,
+
+ VREvent_FirmwareUpdateStarted = 1100,
+ VREvent_FirmwareUpdateFinished = 1101,
+
+ VREvent_KeyboardClosed = 1200,
+ VREvent_KeyboardCharInput = 1201,
+ VREvent_KeyboardDone = 1202, // Sent when DONE button clicked on keyboard
+
+ VREvent_ApplicationTransitionStarted = 1300,
+ VREvent_ApplicationTransitionAborted = 1301,
+ VREvent_ApplicationTransitionNewAppStarted = 1302,
+
+ VREvent_Compositor_MirrorWindowShown = 1400,
+ VREvent_Compositor_MirrorWindowHidden = 1401,
+ VREvent_Compositor_ChaperoneBoundsShown = 1410,
+ VREvent_Compositor_ChaperoneBoundsHidden = 1411,
+
+ VREvent_TrackedCamera_StartVideoStream = 1500,
+ VREvent_TrackedCamera_StopVideoStream = 1501,
+ VREvent_TrackedCamera_PauseVideoStream = 1502,
+ VREvent_TrackedCamera_ResumeVideoStream = 1503,
+
+ VREvent_PerformanceTest_EnableCapture = 1600,
+ VREvent_PerformanceTest_DisableCapture = 1601,
+ VREvent_PerformanceTest_FidelityLevel = 1602,
+
+ // Vendors are free to expose private events in this reserved region
+ VREvent_VendorSpecific_Reserved_Start = 10000,
+ VREvent_VendorSpecific_Reserved_End = 19999,
+};
+
+
+/** Level of Hmd activity */
+enum EDeviceActivityLevel
+{
+ k_EDeviceActivityLevel_Unknown = -1,
+ k_EDeviceActivityLevel_Idle = 0,
+ k_EDeviceActivityLevel_UserInteraction = 1,
+ k_EDeviceActivityLevel_UserInteraction_Timeout = 2,
+ k_EDeviceActivityLevel_Standby = 3,
+};
+
+
+/** VR controller button and axis IDs */
+enum EVRButtonId
+{
+ k_EButton_System = 0,
+ k_EButton_ApplicationMenu = 1,
+ k_EButton_Grip = 2,
+ k_EButton_DPad_Left = 3,
+ k_EButton_DPad_Up = 4,
+ k_EButton_DPad_Right = 5,
+ k_EButton_DPad_Down = 6,
+ k_EButton_A = 7,
+
+ k_EButton_Axis0 = 32,
+ k_EButton_Axis1 = 33,
+ k_EButton_Axis2 = 34,
+ k_EButton_Axis3 = 35,
+ k_EButton_Axis4 = 36,
+
+ // aliases for well known controllers
+ k_EButton_SteamVR_Touchpad = k_EButton_Axis0,
+ k_EButton_SteamVR_Trigger = k_EButton_Axis1,
+
+ k_EButton_Dashboard_Back = k_EButton_Grip,
+
+ k_EButton_Max = 64
+};
+
+inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; }
+
+/** used for controller button events */
+struct VREvent_Controller_t
+{
+ uint32_t button; // EVRButtonId enum
+};
+
+
+/** used for simulated mouse events in overlay space */
+enum EVRMouseButton
+{
+ VRMouseButton_Left = 0x0001,
+ VRMouseButton_Right = 0x0002,
+ VRMouseButton_Middle = 0x0004,
+};
+
+
+/** used for simulated mouse events in overlay space */
+struct VREvent_Mouse_t
+{
+ float x, y; // co-ords are in GL space, bottom left of the texture is 0,0
+ uint32_t button; // EVRMouseButton enum
+};
+
+/** used for simulated mouse wheel scroll in overlay space */
+struct VREvent_Scroll_t
+{
+ float xdelta, ydelta; // movement in fraction of the pad traversed since last delta, 1.0 for a full swipe
+ uint32_t repeatCount;
+};
+
+/** when in mouse input mode you can receive data from the touchpad, these events are only sent if the users finger
+ is on the touchpad (or just released from it)
+**/
+struct VREvent_TouchPadMove_t
+{
+ // true if the users finger is detected on the touch pad
+ bool bFingerDown;
+
+ // How long the finger has been down in seconds
+ float flSecondsFingerDown;
+
+ // These values indicate the starting finger position (so you can do some basic swipe stuff)
+ float fValueXFirst;
+ float fValueYFirst;
+
+ // This is the raw sampled coordinate without deadzoning
+ float fValueXRaw;
+ float fValueYRaw;
+};
+
+/** notification related events. Details will still change at this point */
+struct VREvent_Notification_t
+{
+ uint64_t ulUserValue;
+ uint32_t notificationId;
+};
+
+/** Used for events about processes */
+struct VREvent_Process_t
+{
+ uint32_t pid;
+ uint32_t oldPid;
+ bool bForced;
+};
+
+
+/** Used for a few events about overlays */
+struct VREvent_Overlay_t
+{
+ uint64_t overlayHandle;
+};
+
+
+/** Used for a few events about overlays */
+struct VREvent_Status_t
+{
+ uint32_t statusState; // EVRState enum
+};
+
+/** Used for keyboard events **/
+struct VREvent_Keyboard_t
+{
+ char cNewInput[8]; // Up to 11 bytes of new input
+ uint64_t uUserValue; // Possible flags about the new input
+};
+
+struct VREvent_Ipd_t
+{
+ float ipdMeters;
+};
+
+struct VREvent_Chaperone_t
+{
+ uint64_t m_nPreviousUniverse;
+ uint64_t m_nCurrentUniverse;
+};
+
+/** Not actually used for any events */
+struct VREvent_Reserved_t
+{
+ uint64_t reserved0;
+ uint64_t reserved1;
+};
+
+struct VREvent_PerformanceTest_t
+{
+ uint32_t m_nFidelityLevel;
+};
+
+struct VREvent_SeatedZeroPoseReset_t
+{
+ bool bResetBySystemMenu;
+};
+
+/** If you change this you must manually update openvr_interop.cs.py */
+typedef union
+{
+ VREvent_Reserved_t reserved;
+ VREvent_Controller_t controller;
+ VREvent_Mouse_t mouse;
+ VREvent_Scroll_t scroll;
+ VREvent_Process_t process;
+ VREvent_Notification_t notification;
+ VREvent_Overlay_t overlay;
+ VREvent_Status_t status;
+ VREvent_Keyboard_t keyboard;
+ VREvent_Ipd_t ipd;
+ VREvent_Chaperone_t chaperone;
+ VREvent_PerformanceTest_t performanceTest;
+ VREvent_TouchPadMove_t touchPadMove;
+ VREvent_SeatedZeroPoseReset_t seatedZeroPoseReset;
+} VREvent_Data_t;
+
+/** An event posted by the server to all running applications */
+struct VREvent_t
+{
+ uint32_t eventType; // EVREventType enum
+ TrackedDeviceIndex_t trackedDeviceIndex;
+ float eventAgeSeconds;
+ // event data must be the end of the struct as its size is variable
+ VREvent_Data_t data;
+};
+
+
+/** The mesh to draw into the stencil (or depth) buffer to perform
+* early stencil (or depth) kills of pixels that will never appear on the HMD.
+* This mesh draws on all the pixels that will be hidden after distortion.
+*
+* If the HMD does not provide a visible area mesh pVertexData will be
+* NULL and unTriangleCount will be 0. */
+struct HiddenAreaMesh_t
+{
+ const HmdVector2_t *pVertexData;
+ uint32_t unTriangleCount;
+};
+
+
+/** Identifies what kind of axis is on the controller at index n. Read this type
+* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n );
+*/
+enum EVRControllerAxisType
+{
+ k_eControllerAxis_None = 0,
+ k_eControllerAxis_TrackPad = 1,
+ k_eControllerAxis_Joystick = 2,
+ k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis
+};
+
+
+/** contains information about one axis on the controller */
+struct VRControllerAxis_t
+{
+ float x; // Ranges from -1.0 to 1.0 for joysticks and track pads. Ranges from 0.0 to 1.0 for triggers were 0 is fully released.
+ float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers.
+};
+
+
+/** the number of axes in the controller state */
+static const uint32_t k_unControllerStateAxisCount = 5;
+
+
+/** Holds all the state of a controller at one moment in time. */
+struct VRControllerState001_t
+{
+ // If packet num matches that on your prior call, then the controller state hasn't been changed since
+ // your last call and there is no need to process it
+ uint32_t unPacketNum;
+
+ // bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask
+ uint64_t ulButtonPressed;
+ uint64_t ulButtonTouched;
+
+ // Axis data for the controller's analog inputs
+ VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ];
+};
+
+
+typedef VRControllerState001_t VRControllerState_t;
+
+
+/** determines how to provide output to the application of various event processing functions. */
+enum EVRControllerEventOutputType
+{
+ ControllerEventOutput_OSEvents = 0,
+ ControllerEventOutput_VREvents = 1,
+};
+
+
+
+/** Collision Bounds Style */
+enum ECollisionBoundsStyle
+{
+ COLLISION_BOUNDS_STYLE_BEGINNER = 0,
+ COLLISION_BOUNDS_STYLE_INTERMEDIATE,
+ COLLISION_BOUNDS_STYLE_SQUARES,
+ COLLISION_BOUNDS_STYLE_ADVANCED,
+ COLLISION_BOUNDS_STYLE_NONE,
+
+ COLLISION_BOUNDS_STYLE_COUNT
+};
+
+/** Allows the application to customize how the overlay appears in the compositor */
+struct Compositor_OverlaySettings
+{
+ uint32_t size; // sizeof(Compositor_OverlaySettings)
+ bool curved, antialias;
+ float scale, distance, alpha;
+ float uOffset, vOffset, uScale, vScale;
+ float gridDivs, gridWidth, gridScale;
+ HmdMatrix44_t transform;
+};
+
+/** used to refer to a single VR overlay */
+typedef uint64_t VROverlayHandle_t;
+
+static const VROverlayHandle_t k_ulOverlayHandleInvalid = 0;
+
+/** Errors that can occur around VR overlays */
+enum EVROverlayError
+{
+ VROverlayError_None = 0,
+
+ VROverlayError_UnknownOverlay = 10,
+ VROverlayError_InvalidHandle = 11,
+ VROverlayError_PermissionDenied = 12,
+ VROverlayError_OverlayLimitExceeded = 13, // No more overlays could be created because the maximum number already exist
+ VROverlayError_WrongVisibilityType = 14,
+ VROverlayError_KeyTooLong = 15,
+ VROverlayError_NameTooLong = 16,
+ VROverlayError_KeyInUse = 17,
+ VROverlayError_WrongTransformType = 18,
+ VROverlayError_InvalidTrackedDevice = 19,
+ VROverlayError_InvalidParameter = 20,
+ VROverlayError_ThumbnailCantBeDestroyed = 21,
+ VROverlayError_ArrayTooSmall = 22,
+ VROverlayError_RequestFailed = 23,
+ VROverlayError_InvalidTexture = 24,
+ VROverlayError_UnableToLoadFile = 25,
+ VROVerlayError_KeyboardAlreadyInUse = 26,
+ VROverlayError_NoNeighbor = 27,
+};
+
+/** enum values to pass in to VR_Init to identify whether the application will
+* draw a 3D scene. */
+enum EVRApplicationType
+{
+ VRApplication_Other = 0, // Some other kind of application that isn't covered by the other entries
+ VRApplication_Scene = 1, // Application will submit 3D frames
+ VRApplication_Overlay = 2, // Application only interacts with overlays
+ VRApplication_Background = 3, // Application should not start SteamVR if it's not already running, and should not
+ // keep it running if everything else quits.
+ VRApplication_Utility = 4, // Init should not try to load any drivers. The application needs access to utility
+ // interfaces (like IVRSettings and IVRApplications) but not hardware.
+};
+
+
+/** error codes for firmware */
+enum EVRFirmwareError
+{
+ VRFirmwareError_None = 0,
+ VRFirmwareError_Success = 1,
+ VRFirmwareError_Fail = 2,
+};
+
+
+/** error codes for notifications */
+enum EVRNotificationError
+{
+ VRNotificationError_OK = 0,
+ VRNotificationError_InvalidNotificationId = 100,
+ VRNotificationError_NotificationQueueFull = 101,
+ VRNotificationError_InvalidOverlayHandle = 102,
+};
+
+
+/** error codes returned by Vr_Init */
+
+// Please add adequate error description to https://developer.valvesoftware.com/w/index.php?title=Category:SteamVRHelp
+enum EVRInitError
+{
+ VRInitError_None = 0,
+ VRInitError_Unknown = 1,
+
+ VRInitError_Init_InstallationNotFound = 100,
+ VRInitError_Init_InstallationCorrupt = 101,
+ VRInitError_Init_VRClientDLLNotFound = 102,
+ VRInitError_Init_FileNotFound = 103,
+ VRInitError_Init_FactoryNotFound = 104,
+ VRInitError_Init_InterfaceNotFound = 105,
+ VRInitError_Init_InvalidInterface = 106,
+ VRInitError_Init_UserConfigDirectoryInvalid = 107,
+ VRInitError_Init_HmdNotFound = 108,
+ VRInitError_Init_NotInitialized = 109,
+ VRInitError_Init_PathRegistryNotFound = 110,
+ VRInitError_Init_NoConfigPath = 111,
+ VRInitError_Init_NoLogPath = 112,
+ VRInitError_Init_PathRegistryNotWritable = 113,
+ VRInitError_Init_AppInfoInitFailed = 114,
+ VRInitError_Init_Retry = 115, // Used internally to cause retries to vrserver
+ VRInitError_Init_InitCanceledByUser = 116, // The calling application should silently exit. The user canceled app startup
+ VRInitError_Init_AnotherAppLaunching = 117,
+ VRInitError_Init_SettingsInitFailed = 118,
+ VRInitError_Init_ShuttingDown = 119,
+ VRInitError_Init_TooManyObjects = 120,
+ VRInitError_Init_NoServerForBackgroundApp = 121,
+ VRInitError_Init_NotSupportedWithCompositor = 122,
+ VRInitError_Init_NotAvailableToUtilityApps = 123,
+
+ VRInitError_Driver_Failed = 200,
+ VRInitError_Driver_Unknown = 201,
+ VRInitError_Driver_HmdUnknown = 202,
+ VRInitError_Driver_NotLoaded = 203,
+ VRInitError_Driver_RuntimeOutOfDate = 204,
+ VRInitError_Driver_HmdInUse = 205,
+ VRInitError_Driver_NotCalibrated = 206,
+ VRInitError_Driver_CalibrationInvalid = 207,
+ VRInitError_Driver_HmdDisplayNotFound = 208,
+
+ VRInitError_IPC_ServerInitFailed = 300,
+ VRInitError_IPC_ConnectFailed = 301,
+ VRInitError_IPC_SharedStateInitFailed = 302,
+ VRInitError_IPC_CompositorInitFailed = 303,
+ VRInitError_IPC_MutexInitFailed = 304,
+ VRInitError_IPC_Failed = 305,
+
+ VRInitError_Compositor_Failed = 400,
+ VRInitError_Compositor_D3D11HardwareRequired = 401,
+
+ VRInitError_VendorSpecific_UnableToConnectToOculusRuntime = 1000,
+
+ VRInitError_VendorSpecific_HmdFound_CantOpenDevice = 1101,
+ VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart = 1102,
+ VRInitError_VendorSpecific_HmdFound_NoStoredConfig = 1103,
+ VRInitError_VendorSpecific_HmdFound_ConfigTooBig = 1104,
+ VRInitError_VendorSpecific_HmdFound_ConfigTooSmall = 1105,
+ VRInitError_VendorSpecific_HmdFound_UnableToInitZLib = 1106,
+ VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion = 1107,
+ VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart = 1108,
+ VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart = 1109,
+ VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext = 1110,
+ VRInitError_VendorSpecific_HmdFound_UserDataAddressRange = 1111,
+ VRInitError_VendorSpecific_HmdFound_UserDataError = 1112,
+ VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck = 1113,
+
+ VRInitError_Steam_SteamInstallationNotFound = 2000,
+
+};
+
+#pragma pack( pop )
+
+// figure out how to import from the VR API dll
+#if defined(_WIN32)
+
+#ifdef VR_API_EXPORT
+#define VR_INTERFACE extern "C" __declspec( dllexport )
+#else
+#define VR_INTERFACE extern "C" __declspec( dllimport )
+#endif
+
+#elif defined(GNUC) || defined(COMPILER_GCC) || defined(__APPLE__)
+
+#ifdef VR_API_EXPORT
+#define VR_INTERFACE extern "C" __attribute__((visibility("default")))
+#else
+#define VR_INTERFACE extern "C"
+#endif
+
+#else
+#error "Unsupported Platform."
+#endif
+
+
+#if defined( _WIN32 )
+#define VR_CALLTYPE __cdecl
+#else
+#define VR_CALLTYPE
+#endif
+
+}
+
+#endif // _INCLUDE_VRTYPES_H
+
+
+// vrtrackedcameratypes.h
+#ifndef _VRTRACKEDCAMERATYPES_H
+#define _VRTRACKEDCAMERATYPES_H
+
+namespace vr
+{
+
+#if defined(__linux__) || defined(__APPLE__)
+ // The 32-bit version of gcc has the alignment requirement for uint64 and double set to
+ // 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
+ // The 64-bit version of gcc has the alignment requirement for these types set to
+ // 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
+ // The 64-bit structure packing has to match the 32-bit structure packing for each platform.
+ #pragma pack( push, 4 )
+#else
+ #pragma pack( push, 8 )
+#endif
+
+enum ECameraVideoStreamFormat
+{
+ CVS_FORMAT_UNKNOWN = 0,
+ CVS_FORMAT_RAW10 = 1, // 10 bits per pixel
+ CVS_FORMAT_NV12 = 2, // 12 bits per pixel
+ CVS_FORMAT_RGB24 = 3, // 24 bits per pixel
+ CVS_MAX_FORMATS
+};
+
+enum ECameraCompatibilityMode
+{
+ CAMERA_COMPAT_MODE_BULK_DEFAULT = 0,
+ CAMERA_COMPAT_MODE_BULK_64K_DMA,
+ CAMERA_COMPAT_MODE_BULK_16K_DMA,
+ CAMERA_COMPAT_MODE_BULK_8K_DMA,
+ CAMERA_COMPAT_MODE_ISO_52FPS,
+ CAMERA_COMPAT_MODE_ISO_50FPS,
+ CAMERA_COMPAT_MODE_ISO_48FPS,
+ CAMERA_COMPAT_MODE_ISO_46FPS,
+ CAMERA_COMPAT_MODE_ISO_44FPS,
+ CAMERA_COMPAT_MODE_ISO_42FPS,
+ CAMERA_COMPAT_MODE_ISO_40FPS,
+ CAMERA_COMPAT_MODE_ISO_35FPS,
+ CAMERA_COMPAT_MODE_ISO_30FPS,
+ MAX_CAMERA_COMPAT_MODES
+};
+
+#ifdef _MSC_VER
+#define VR_CAMERA_DECL_ALIGN( x ) __declspec( align( x ) )
+#else
+#define VR_CAMERA_DECL_ALIGN( x ) //
+#endif
+
+VR_CAMERA_DECL_ALIGN( 8 ) struct CameraVideoStreamFrame_t
+{
+ ECameraVideoStreamFormat m_nStreamFormat;
+
+ uint32_t m_nWidth;
+ uint32_t m_nHeight;
+
+ uint32_t m_nImageDataSize; // Based on stream format, width, height
+
+ uint32_t m_nFrameSequence; // Starts from 0 when stream starts.
+
+ uint32_t m_nBufferIndex; // Identifies which buffer the image data is hosted
+ uint32_t m_nBufferCount; // Total number of configured buffers
+
+ uint32_t m_nExposureTime;
+
+ uint32_t m_nISPFrameTimeStamp; // Driver provided time stamp per driver centric time base
+ uint32_t m_nISPReferenceTimeStamp;
+ uint32_t m_nSyncCounter;
+
+ uint32_t m_nCamSyncEvents;
+ double m_flReferenceCamSyncTime;
+
+ double m_flFrameElapsedTime; // Starts from 0 when stream starts. In seconds.
+ double m_flFrameDeliveryRate;
+
+ double m_flFrameCaptureTime_DriverAbsolute; // In USB time, via AuxEvent
+ double m_flFrameCaptureTime_ServerRelative; // In System time within the server
+ uint64_t m_nFrameCaptureTicks_ServerAbsolute; // In system ticks within the server
+ double m_flFrameCaptureTime_ClientRelative; // At the client, relative to when the frame was exposed/captured.
+
+ bool m_bPoseIsValid; // Supplied by HMD layer when used as a tracked camera
+ vr::HmdMatrix34_t m_matDeviceToAbsoluteTracking;
+
+ float m_Pad[4];
+
+ void *m_pImageData;
+};
+
+#pragma pack( pop )
+
+}
+
+#endif // _VRTRACKEDCAMERATYPES_H
+// ivrsettings.h
+namespace vr
+{
+ enum EVRSettingsError
+ {
+ VRSettingsError_None = 0,
+ VRSettingsError_IPCFailed = 1,
+ VRSettingsError_WriteFailed = 2,
+ VRSettingsError_ReadFailed = 3,
+ };
+
+ // The maximum length of a settings key
+ static const uint32_t k_unMaxSettingsKeyLength = 128;
+
+ class IVRSettings
+ {
+ public:
+ virtual const char *GetSettingsErrorNameFromEnum( EVRSettingsError eError ) = 0;
+
+ // Returns true if file sync occurred (force or settings dirty)
+ virtual bool Sync( bool bForce = false, EVRSettingsError *peError = nullptr ) = 0;
+
+ virtual bool GetBool( const char *pchSection, const char *pchSettingsKey, bool bDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetBool( const char *pchSection, const char *pchSettingsKey, bool bValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual int32_t GetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetInt32( const char *pchSection, const char *pchSettingsKey, int32_t nValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual float GetFloat( const char *pchSection, const char *pchSettingsKey, float flDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetFloat( const char *pchSection, const char *pchSettingsKey, float flValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void GetString( const char *pchSection, const char *pchSettingsKey, char *pchValue, uint32_t unValueLen, const char *pchDefaultValue, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void SetString( const char *pchSection, const char *pchSettingsKey, const char *pchValue, EVRSettingsError *peError = nullptr ) = 0;
+
+ virtual void RemoveSection( const char *pchSection, EVRSettingsError *peError = nullptr ) = 0;
+ virtual void RemoveKeyInSection( const char *pchSection, const char *pchSettingsKey, EVRSettingsError *peError = nullptr ) = 0;
+ };
+
+ //-----------------------------------------------------------------------------
+ // steamvr keys
+
+ static const char * const k_pch_SteamVR_Section = "steamvr";
+ static const char * const k_pch_SteamVR_RequireHmd_String = "requireHmd";
+ static const char * const k_pch_SteamVR_ForcedDriverKey_String = "forcedDriver";
+ static const char * const k_pch_SteamVR_ForcedHmdKey_String = "forcedHmd";
+ static const char * const k_pch_SteamVR_DisplayDebug_Bool = "displayDebug";
+ static const char * const k_pch_SteamVR_DebugProcessPipe_String = "debugProcessPipe";
+ static const char * const k_pch_SteamVR_EnableDistortion_Bool = "enableDistortion";
+ static const char * const k_pch_SteamVR_DisplayDebugX_Int32 = "displayDebugX";
+ static const char * const k_pch_SteamVR_DisplayDebugY_Int32 = "displayDebugY";
+ static const char * const k_pch_SteamVR_SendSystemButtonToAllApps_Bool= "sendSystemButtonToAllApps";
+ static const char * const k_pch_SteamVR_LogLevel_Int32 = "loglevel";
+ static const char * const k_pch_SteamVR_IPD_Float = "ipd";
+ static const char * const k_pch_SteamVR_Background_String = "background";
+ static const char * const k_pch_SteamVR_GridColor_String = "gridColor";
+ static const char * const k_pch_SteamVR_PlayAreaColor_String = "playAreaColor";
+ static const char * const k_pch_SteamVR_ActivateMultipleDrivers_Bool = "activateMultipleDrivers";
+ static const char * const k_pch_SteamVR_PowerOffOnExit_Bool = "powerOffOnExit";
+ static const char * const k_pch_SteamVR_StandbyAppRunningTimeout_Float = "standbyAppRunningTimeout";
+ static const char * const k_pch_SteamVR_StandbyNoAppTimeout_Float = "standbyNoAppTimeout";
+ static const char * const k_pch_SteamVR_DirectMode_Bool = "directMode";
+ static const char * const k_pch_SteamVR_DirectModeEdidVid_Int32 = "directModeEdidVid";
+ static const char * const k_pch_SteamVR_DirectModeEdidPid_Int32 = "directModeEdidPid";
+ static const char * const k_pch_SteamVR_UsingSpeakers_Bool = "usingSpeakers";
+ static const char * const k_pch_SteamVR_SpeakersForwardYawOffsetDegrees_Float = "speakersForwardYawOffsetDegrees";
+ static const char * const k_pch_SteamVR_BaseStationPowerManagement_Bool = "basestationPowerManagement";
+ static const char * const k_pch_SteamVR_NeverKillProcesses_Bool = "neverKillProcesses";
+
+ //-----------------------------------------------------------------------------
+ // lighthouse keys
+
+ static const char * const k_pch_Lighthouse_Section = "driver_lighthouse";
+ static const char * const k_pch_Lighthouse_DisableIMU_Bool = "disableimu";
+ static const char * const k_pch_Lighthouse_UseDisambiguation_String = "usedisambiguation";
+ static const char * const k_pch_Lighthouse_DisambiguationDebug_Int32 = "disambiguationdebug";
+
+ static const char * const k_pch_Lighthouse_PrimaryBasestation_Int32 = "primarybasestation";
+ static const char * const k_pch_Lighthouse_LighthouseName_String = "lighthousename";
+ static const char * const k_pch_Lighthouse_MaxIncidenceAngleDegrees_Float = "maxincidenceangledegrees";
+ static const char * const k_pch_Lighthouse_UseLighthouseDirect_Bool = "uselighthousedirect";
+ static const char * const k_pch_Lighthouse_DBHistory_Bool = "dbhistory";
+ static const char * const k_pch_Lighthouse_OriginOffsetX_Float = "originoffsetx";
+ static const char * const k_pch_Lighthouse_OriginOffsetY_Float = "originoffsety";
+ static const char * const k_pch_Lighthouse_OriginOffsetZ_Float = "originoffsetz";
+ static const char * const k_pch_Lighthouse_HeadingOffset_Float = "headingoffset";
+
+ //-----------------------------------------------------------------------------
+ // null keys
+
+ static const char * const k_pch_Null_Section = "driver_null";
+ static const char * const k_pch_Null_EnableNullDriver_Bool = "enable";
+ static const char * const k_pch_Null_SerialNumber_String = "serialNumber";
+ static const char * const k_pch_Null_ModelNumber_String = "modelNumber";
+ static const char * const k_pch_Null_WindowX_Int32 = "windowX";
+ static const char * const k_pch_Null_WindowY_Int32 = "windowY";
+ static const char * const k_pch_Null_WindowWidth_Int32 = "windowWidth";
+ static const char * const k_pch_Null_WindowHeight_Int32 = "windowHeight";
+ static const char * const k_pch_Null_RenderWidth_Int32 = "renderWidth";
+ static const char * const k_pch_Null_RenderHeight_Int32 = "renderHeight";
+ static const char * const k_pch_Null_SecondsFromVsyncToPhotons_Float = "secondsFromVsyncToPhotons";
+ static const char * const k_pch_Null_DisplayFrequency_Float = "displayFrequency";
+
+ //-----------------------------------------------------------------------------
+ // user interface keys
+ static const char * const k_pch_UserInterface_Section = "userinterface";
+ static const char * const k_pch_UserInterface_StatusAlwaysOnTop_Bool = "StatusAlwaysOnTop";
+
+ //-----------------------------------------------------------------------------
+ // notification keys
+ static const char * const k_pch_Notifications_Section = "notifications";
+ static const char * const k_pch_Notifications_DoNotDisturb_Bool = "DoNotDisturb";
+
+ //-----------------------------------------------------------------------------
+ // keyboard keys
+ static const char * const k_pch_Keyboard_Section = "keyboard";
+ static const char * const k_pch_Keyboard_TutorialCompletions = "TutorialCompletions";
+
+ //-----------------------------------------------------------------------------
+ // perf keys
+ static const char * const k_pch_Perf_Section = "perfcheck";
+ static const char * const k_pch_Perf_HeuristicActive_Bool = "heuristicActive";
+ static const char * const k_pch_Perf_NotifyInHMD_Bool = "warnInHMD";
+ static const char * const k_pch_Perf_NotifyOnlyOnce_Bool = "warnOnlyOnce";
+ static const char * const k_pch_Perf_AllowTimingStore_Bool = "allowTimingStore";
+ static const char * const k_pch_Perf_SaveTimingsOnExit_Bool = "saveTimingsOnExit";
+ static const char * const k_pch_Perf_TestData_Float = "perfTestData";
+
+ //-----------------------------------------------------------------------------
+ // camera keys
+ static const char * const k_pch_Camera_Section = "camera";
+
+ //-----------------------------------------------------------------------------
+
+ static const char * const IVRSettings_Version = "IVRSettings_001";
+
+ //-----------------------------------------------------------------------------
+ // audio keys
+ static const char * const k_pch_audio_Section = "audio";
+ static const char * const k_pch_audio_OnPlaybackDevice_String = "onPlaybackDevice";
+ static const char * const k_pch_audio_OnRecordDevice_String = "onRecordDevice";
+ static const char * const k_pch_audio_OffPlaybackDevice_String = "offPlaybackDevice";
+ static const char * const k_pch_audio_OffRecordDevice_String = "offRecordDevice";
+ static const char * const k_pch_audio_VIVEHDMIGain = "viveHDMIGain";
+} // namespace vr
+
+// iservertrackeddevicedriver.h
+namespace vr
+{
+
+
+struct DriverPoseQuaternion_t
+{
+ double w, x, y, z;
+};
+
+struct DriverPose_t
+{
+ /* Time offset of this pose, in seconds from the actual time of the pose,
+ * relative to the time of the PoseUpdated() call made by the driver.
+ */
+ double poseTimeOffset;
+
+ /* Generally, the pose maintained by a driver
+ * is in an inertial coordinate system different
+ * from the world system of x+ right, y+ up, z+ back.
+ * Also, the driver is not usually tracking the "head" position,
+ * but instead an internal IMU or another reference point in the HMD.
+ * The following two transforms transform positions and orientations
+ * to app world space from driver world space,
+ * and to HMD head space from driver local body space.
+ *
+ * We maintain the driver pose state in its internal coordinate system,
+ * so we can do the pose prediction math without having to
+ * use angular acceleration. A driver's angular acceleration is generally not measured,
+ * and is instead calculated from successive samples of angular velocity.
+ * This leads to a noisy angular acceleration values, which are also
+ * lagged due to the filtering required to reduce noise to an acceptable level.
+ */
+ vr::HmdQuaternion_t qWorldFromDriverRotation;
+ double vecWorldFromDriverTranslation[ 3 ];
+
+ vr::HmdQuaternion_t qDriverFromHeadRotation;
+ double vecDriverFromHeadTranslation[ 3 ];
+
+ /* State of driver pose, in meters and radians. */
+ /* Position of the driver tracking reference in driver world space
+ * +[0] (x) is right
+ * +[1] (y) is up
+ * -[2] (z) is forward
+ */
+ double vecPosition[ 3 ];
+
+ /* Velocity of the pose in meters/second */
+ double vecVelocity[ 3 ];
+
+ /* Acceleration of the pose in meters/second */
+ double vecAcceleration[ 3 ];
+
+ /* Orientation of the tracker, represented as a quaternion */
+ vr::HmdQuaternion_t qRotation;
+
+ /* Angular velocity of the pose in axis-angle
+ * representation. The direction is the angle of
+ * rotation and the magnitude is the angle around
+ * that axis in radians/second. */
+ double vecAngularVelocity[ 3 ];
+
+ /* Angular acceleration of the pose in axis-angle
+ * representation. The direction is the angle of
+ * rotation and the magnitude is the angle around
+ * that axis in radians/second^2. */
+ double vecAngularAcceleration[ 3 ];
+
+ ETrackingResult result;
+
+ bool poseIsValid;
+ bool willDriftInYaw;
+ bool shouldApplyHeadModel;
+ bool deviceIsConnected;
+};
+
+
+// ----------------------------------------------------------------------------------------------
+// Purpose: Represents a single tracked device in a driver
+// ----------------------------------------------------------------------------------------------
+class ITrackedDeviceServerDriver
+{
+public:
+
+ // ------------------------------------
+ // Management Methods
+ // ------------------------------------
+ /** This is called before an HMD is returned to the application. It will always be
+ * called before any display or tracking methods. Memory and processor use by the
+ * ITrackedDeviceServerDriver object should be kept to a minimum until it is activated.
+ * The pose listener is guaranteed to be valid until Deactivate is called, but
+ * should not be used after that point. */
+ virtual EVRInitError Activate( uint32_t unObjectId ) = 0;
+
+ /** This is called when The VR system is switching from this Hmd being the active display
+ * to another Hmd being the active display. The driver should clean whatever memory
+ * and thread use it can when it is deactivated */
+ virtual void Deactivate() = 0;
+
+ /** Handles a request from the system to power off this device */
+ virtual void PowerOff() = 0;
+
+ /** Requests a component interface of the driver for device-specific functionality. The driver should return NULL
+ * if the requested interface or version is not supported. */
+ virtual void *GetComponent( const char *pchComponentNameAndVersion ) = 0;
+
+ /** A VR Client has made this debug request of the driver. The set of valid requests is entirely
+ * up to the driver and the client to figure out, as is the format of the response. Responses that
+ * exceed the length of the supplied buffer should be truncated and null terminated */
+ virtual void DebugRequest( const char *pchRequest, char *pchResponseBuffer, uint32_t unResponseBufferSize ) = 0;
+
+ // ------------------------------------
+ // Tracking Methods
+ // ------------------------------------
+ virtual DriverPose_t GetPose() = 0;
+
+ // ------------------------------------
+ // Property Methods
+ // ------------------------------------
+
+ /** Returns a bool property. If the property is not available this function will return false. */
+ virtual bool GetBoolTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a float property. If the property is not available this function will return 0. */
+ virtual float GetFloatTrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns an int property. If the property is not available this function will return 0. */
+ virtual int32_t GetInt32TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a uint64 property. If the property is not available this function will return 0. */
+ virtual uint64_t GetUint64TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */
+ virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( ETrackedDeviceProperty prop, ETrackedPropertyError *pError ) = 0;
+
+ /** Returns a string property. If the property is not available this function will return 0 and pError will be
+ * set to an error. Otherwise it returns the length of the number of bytes necessary to hold this string including
+ * the trailing null. If the buffer is too small the error will be TrackedProp_BufferTooSmall. Strings will
+ * generally fit in buffers of k_unTrackingStringSize characters. Drivers may not return strings longer than
+ * k_unMaxPropertyStringSize. */
+ virtual uint32_t GetStringTrackedDeviceProperty( ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError ) = 0;
+
+};
+
+
+
+static const char *ITrackedDeviceServerDriver_Version = "ITrackedDeviceServerDriver_004";
+
+}
+// ivrdisplaycomponent.h
+namespace vr
+{
+
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: The display component on a single tracked device
+ // ----------------------------------------------------------------------------------------------
+ class IVRDisplayComponent
+ {
+ public:
+
+ // ------------------------------------
+ // Display Methods
+ // ------------------------------------
+
+ /** Size and position that the window needs to be on the VR display. */
+ virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** Returns true if the display is extending the desktop. */
+ virtual bool IsDisplayOnDesktop( ) = 0;
+
+ /** Returns true if the display is real and not a fictional display. */
+ virtual bool IsDisplayRealDisplay( ) = 0;
+
+ /** Suggested size for the intermediate render target that the distortion pulls from. */
+ virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** Gets the viewport in the frame buffer to draw the output of the distortion into */
+ virtual void GetEyeOutputViewport( EVREye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
+
+ /** The components necessary to build your own projection matrix in case your
+ * application is doing something fancy like infinite Z */
+ virtual void GetProjectionRaw( EVREye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0;
+
+ /** Returns the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in
+ * the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. */
+ virtual DistortionCoordinates_t ComputeDistortion( EVREye eEye, float fU, float fV ) = 0;
+
+ // -----------------------------------
+ // Direct mode methods
+ // -----------------------------------
+
+ /** Specific to Oculus compositor support, textures supplied must be created using this method. */
+ virtual void CreateSwapTextureSet( uint32_t unPid, uint32_t unFormat, uint32_t unWidth, uint32_t unHeight, void *(*pSharedTextureHandles)[2] ) {}
+
+ /** Used to textures created using CreateSwapTextureSet. Only one of the set's handles needs to be used to destroy the entire set. */
+ virtual void DestroySwapTextureSet( void *pSharedTextureHandle ) {}
+
+ /** Used to purge all texture sets for a given process. */
+ virtual void DestroyAllSwapTextureSets( uint32_t unPid ) {}
+
+ /** Call once per layer to draw for this frame. One shared texture handle per eye. Textures must be created
+ * using CreateSwapTextureSet and should be alternated per frame. Call Present once all layers have been submitted. */
+ virtual void SubmitLayer( void *pSharedTextureHandles[ 2 ], const vr::VRTextureBounds_t( &bounds )[ 2 ], const vr::HmdMatrix34_t *pPose ) {}
+
+ /** Submits queued layers for display. */
+ virtual void Present( void *hSyncTexture ) {}
+
+ };
+
+ static const char *IVRDisplayComponent_Version = "IVRDisplayComponent_001";
+
+}
+
+// ivrcontrollercomponent.h
+namespace vr
+{
+
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: Controller access on a single tracked device.
+ // ----------------------------------------------------------------------------------------------
+ class IVRControllerComponent
+ {
+ public:
+
+ // ------------------------------------
+ // Controller Methods
+ // ------------------------------------
+
+ /** Gets the current state of a controller. */
+ virtual VRControllerState_t GetControllerState( ) = 0;
+
+ /** Returns a uint64 property. If the property is not available this function will return 0. */
+ virtual bool TriggerHapticPulse( uint32_t unAxisId, uint16_t usPulseDurationMicroseconds ) = 0;
+
+ };
+
+
+
+ static const char *IVRControllerComponent_Version = "IVRControllerComponent_001";
+
+}
+// ivrcameracomponent.h
+namespace vr
+{
+
+ //-----------------------------------------------------------------------------
+ //-----------------------------------------------------------------------------
+ class ICameraVideoSinkCallback
+ {
+ public:
+ virtual void OnCameraVideoSinkCallback() = 0;
+ };
+
+ // ----------------------------------------------------------------------------------------------
+ // Purpose: The camera on a single tracked device
+ // ----------------------------------------------------------------------------------------------
+ class IVRCameraComponent
+ {
+ public:
+ // ------------------------------------
+ // Camera Methods
+ // ------------------------------------
+ virtual bool HasCamera() = 0;
+ virtual bool GetCameraFirmwareDescription( char *pBuffer, uint32_t nBufferLen ) = 0;
+ virtual bool GetCameraFrameDimensions( vr::ECameraVideoStreamFormat nVideoStreamFormat, uint32_t *pWidth, uint32_t *pHeight ) = 0;
+ virtual bool GetCameraFrameBufferingRequirements( int *pDefaultFrameQueueSize, uint32_t *pFrameBufferDataSize ) = 0;
+ virtual bool SetCameraFrameBuffering( int nFrameBufferCount, void **ppFrameBuffers, uint32_t nFrameBufferDataSize ) = 0;
+ virtual bool SetCameraVideoStreamFormat( vr::ECameraVideoStreamFormat nVideoStreamFormat ) = 0;
+ virtual vr::ECameraVideoStreamFormat GetCameraVideoStreamFormat() = 0;
+ virtual bool StartVideoStream() = 0;
+ virtual void StopVideoStream() = 0;
+ virtual bool IsVideoStreamActive() = 0;
+ virtual float GetVideoStreamElapsedTime() = 0;
+ virtual const vr::CameraVideoStreamFrame_t *GetVideoStreamFrame() = 0;
+ virtual void ReleaseVideoStreamFrame( const vr::CameraVideoStreamFrame_t *pFrameImage ) = 0;
+ virtual bool SetAutoExposure( bool bEnable ) = 0;
+ virtual bool PauseVideoStream() = 0;
+ virtual bool ResumeVideoStream() = 0;
+ virtual bool IsVideoStreamPaused() = 0;
+ virtual bool GetCameraDistortion( float flInputU, float flInputV, float *pflOutputU, float *pflOutputV ) = 0;
+ virtual bool GetCameraProjection( float flWidthPixels, float flHeightPixels, float flZNear, float flZFar, vr::HmdMatrix44_t *pProjection ) = 0;
+ virtual bool GetRecommendedCameraUndistortion( uint32_t *pUndistortionWidthPixels, uint32_t *pUndistortionHeightPixels ) = 0;
+ virtual bool SetCameraUndistortion( uint32_t nUndistortionWidthPixels, uint32_t nUndistortionHeightPixels ) = 0;
+ virtual bool GetCameraFirmwareVersion( uint64_t *pFirmwareVersion ) = 0;
+ virtual bool SetFrameRate( int nISPFrameRate, int nSensorFrameRate ) = 0;
+ virtual bool SetCameraVideoSinkCallback( vr::ICameraVideoSinkCallback *pCameraVideoSinkCallback ) = 0;
+ virtual bool GetCameraCompatibilityMode( vr::ECameraCompatibilityMode *pCameraCompatibilityMode ) = 0;
+ virtual bool SetCameraCompatibilityMode( vr::ECameraCompatibilityMode nCameraCompatibilityMode ) = 0;
+ };
+
+ static const char *IVRCameraComponent_Version = "IVRCameraComponent_001";
+}
+// itrackeddevicedriverprovider.h
+namespace vr
+{
+
+class ITrackedDeviceServerDriver;
+struct TrackedDeviceDriverInfo_t;
+struct DriverPose_t;
+
+class IDriverLog
+{
+public:
+ /** Writes a log message to the log file prefixed with the driver name */
+ virtual void Log( const char *pchLogMessage ) = 0;
+};
+
+/** This interface is provided by vrserver to allow the driver to notify
+* the system when something changes about a device. These changes must
+* not change the serial number or class of the device because those values
+* are permanently associated with the device's index. */
+class IServerDriverHost
+{
+public:
+ /** Notifies the server that a tracked device has been added. If this function returns true
+ * the server will call Activate on the device. If it returns false some kind of error
+ * has occurred and the device will not be activated. */
+ virtual bool TrackedDeviceAdded( const char *pchDeviceSerialNumber ) = 0;
+
+ /** Notifies the server that a tracked device's pose has been updated */
+ virtual void TrackedDevicePoseUpdated( uint32_t unWhichDevice, const DriverPose_t & newPose ) = 0;
+
+ /** Notifies the server that the property cache for the specified device should be invalidated */
+ virtual void TrackedDevicePropertiesChanged( uint32_t unWhichDevice ) = 0;
+
+ /** Notifies the server that vsync has occurred on the the display attached to the device. This is
+ * only permitted on devices of the HMD class. */
+ virtual void VsyncEvent( double vsyncTimeOffsetSeconds ) = 0;
+
+ /** notifies the server that the button was pressed */
+ virtual void TrackedDeviceButtonPressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was unpressed */
+ virtual void TrackedDeviceButtonUnpressed( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was pressed */
+ virtual void TrackedDeviceButtonTouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server that the button was unpressed */
+ virtual void TrackedDeviceButtonUntouched( uint32_t unWhichDevice, EVRButtonId eButtonId, double eventTimeOffset ) = 0;
+
+ /** notifies the server than a controller axis changed */
+ virtual void TrackedDeviceAxisUpdated( uint32_t unWhichDevice, uint32_t unWhichAxis, const VRControllerAxis_t & axisState ) = 0;
+
+ /** Notifies the server that the MC image has been updated for the display attached to the device. This is
+ * only permitted on devices of the HMD class. */
+ virtual void MCImageUpdated() = 0;
+
+ /** always returns a pointer to a valid interface pointer of IVRSettings */
+ virtual IVRSettings *GetSettings( const char *pchInterfaceVersion ) = 0;
+
+ /** Notifies the server that the physical IPD adjustment has been moved on the HMD */
+ virtual void PhysicalIpdSet( uint32_t unWhichDevice, float fPhysicalIpdMeters ) = 0;
+
+ /** Notifies the server that the proximity sensor on the specified device */
+ virtual void ProximitySensorState( uint32_t unWhichDevice, bool bProximitySensorTriggered ) = 0;
+
+ /** Sends a vendor specific event (VREvent_VendorSpecific_Reserved_Start..VREvent_VendorSpecific_Reserved_End */
+ virtual void VendorSpecificEvent( uint32_t unWhichDevice, vr::EVREventType eventType, const VREvent_Data_t & eventData, double eventTimeOffset ) = 0;
+
+ /** Returns true if SteamVR is exiting */
+ virtual bool IsExiting() = 0;
+};
+
+
+/** This interface must be implemented in each driver. It will be loaded in vrserver.exe */
+class IServerTrackedDeviceProvider
+{
+public:
+ /** initializes the driver. This will be called before any other methods are called.
+ * If Init returns anything other than VRInitError_None the driver DLL will be unloaded.
+ *
+ * pDriverHost will never be NULL, and will always be a pointer to a IServerDriverHost interface
+ *
+ * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user
+ * config files.
+ * pchDriverInstallDir - The absolute path of the root directory for the driver.
+ */
+ virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IServerDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+
+ /** cleans up the driver right before it is unloaded */
+ virtual void Cleanup() = 0;
+
+ /** returns the number of HMDs that this driver manages that are physically connected. */
+ virtual uint32_t GetTrackedDeviceCount() = 0;
+
+ /** returns a single HMD */
+ virtual ITrackedDeviceServerDriver *GetTrackedDeviceDriver( uint32_t unWhich, const char *pchInterfaceVersion ) = 0;
+
+ /** returns a single HMD by ID */
+ virtual ITrackedDeviceServerDriver* FindTrackedDeviceDriver( const char *pchId, const char *pchInterfaceVersion ) = 0;
+
+ /** Allows the driver do to some work in the main loop of the server. */
+ virtual void RunFrame() = 0;
+
+
+ // ------------ Power State Functions ----------------------- //
+
+ /** Returns true if the driver wants to block Standby mode. */
+ virtual bool ShouldBlockStandbyMode() = 0;
+
+ /** Called when the system is entering Standby mode. The driver should switch itself into whatever sort of low-power
+ * state it has. */
+ virtual void EnterStandby() = 0;
+
+ /** Called when the system is leaving Standby mode. The driver should switch itself back to
+ full operation. */
+ virtual void LeaveStandby() = 0;
+
+};
+
+
+static const char *IServerTrackedDeviceProvider_Version = "IServerTrackedDeviceProvider_002";
+
+
+/** This interface is provided by vrclient to allow the driver call back and query various information */
+class IClientDriverHost
+{
+public:
+ /** Returns the device class of a tracked device. If there has not been a device connected in this slot
+ * since the application started this function will return TrackedDevice_Invalid. For previous detected
+ * devices the function will return the previously observed device class.
+ *
+ * To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check
+ * the device class. Every device with something other than TrackedDevice_Invalid is associated with an
+ * actual tracked device. */
+ virtual ETrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
+
+ /** Returns true if there is a device connected in this slot. */
+ virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
+
+ /** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */
+ virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */
+ virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */
+ virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */
+ virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** Returns a string property. If the device index is not valid or the property is not a float type this function will
+ * return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
+ * null. Strings will generally fit in buffers of k_unTrackingStringSize characters. */
+ virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, ETrackedDeviceProperty prop, char *pchValue, uint32_t unBufferSize, ETrackedPropertyError *pError = 0L ) = 0;
+
+ /** always returns a pointer to a valid interface pointer of IVRSettings */
+ virtual IVRSettings *GetSettings( const char *pchInterfaceVersion ) = 0;
+};
+
+
+
+/** This interface must be implemented in each driver. It will be loaded in vrclient.dll */
+class IClientTrackedDeviceProvider
+{
+public:
+ /** initializes the driver. This will be called before any other methods are called,
+ * except BIsHmdPresent(). BIsHmdPresent is called outside of the Init/Cleanup pair.
+ * If Init returns anything other than VRInitError_None the driver DLL will be unloaded.
+ *
+ * pDriverHost will never be NULL, and will always be a pointer to a IClientDriverHost interface
+ *
+ * pchUserDriverConfigDir - The absolute path of the directory where the driver should store user
+ * config files.
+ * pchDriverInstallDir - The absolute path of the root directory for the driver.
+ */
+ virtual EVRInitError Init( IDriverLog *pDriverLog, vr::IClientDriverHost *pDriverHost, const char *pchUserDriverConfigDir, const char *pchDriverInstallDir ) = 0;
+
+ /** cleans up the driver right before it is unloaded */
+ virtual void Cleanup() = 0;
+
+ /** Called when the client needs to inform an application if an HMD is attached that uses
+ * this driver. This method should be as lightweight as possible and should have no side effects
+ * such as hooking process functions or leaving resources loaded. Init will not be called before
+ * this method and Cleanup will not be called after it.
+ */
+ virtual bool BIsHmdPresent( const char *pchUserConfigDir ) = 0;
+
+ /** called when the client inits an HMD to let the client driver know which one is in use */
+ virtual EVRInitError SetDisplayId( const char *pchDisplayId ) = 0;
+
+ /** Returns the stencil mesh information for the current HMD. If this HMD does not have a stencil mesh the vertex data and count will be
+ * NULL and 0 respectively. This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering
+ * each eye's view. The pixels covered by this mesh will never be seen by the user after the lens distortion is applied and based on visibility to the panels.
+ * This will improve perf by letting the GPU early-reject pixels the user will never see before running the pixel shader.
+ * NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye.
+ */
+ virtual HiddenAreaMesh_t GetHiddenAreaMesh( EVREye eEye ) = 0;
+
+ /** Get the MC image for the current HMD.
+ * Returns the size in bytes of the buffer required to hold the specified resource. */
+ virtual uint32_t GetMCImage( uint32_t *pImgWidth, uint32_t *pImgHeight, uint32_t *pChannels, void *pDataBuffer, uint32_t unBufferLen ) = 0;
+};
+
+static const char *IClientTrackedDeviceProvider_Version = "IClientTrackedDeviceProvider_003";
+
+}// End
+
+#endif // _OPENVR_DRIVER_API
+
+
diff --git a/4.Software/GeekIMUDriver 1.1/Src/quaternion.cpp b/4.Software/GeekIMUDriver 1.1/Src/quaternion.cpp
new file mode 100644
index 0000000..3bba066
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/quaternion.cpp
@@ -0,0 +1,266 @@
+#include "quaternion.h"
+#include "math.h"
+#include "stdio.h"
+
+#define PI 3.141592f
+
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v)
+{
+ Quaternion q;
+ /*把angle转换为弧度*/
+ angle = PI*angle/(180.0f);
+ q.w = cos(angle/2.0f);
+ q.x = v.x * sin(angle/2);
+ q.y = v.y * sin(angle/2);
+ q.z = v.z * sin(angle/2);
+ return q;
+}
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,_Quaternion q2)
+{
+ Quaternion q;
+ float mod;
+ /*按照四元数乘法计算系数*/
+ q.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.x = q1.w * q2.x + q1.x * q2.w - q1.y * q2.z + q1.z * q2.y; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.y = q1.w * q2.y + q1.y * q2.w + q1.x * q2.z - q1.z * q2.x; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+ q.z = q1.w * q2.z + q1.z * q2.w + q1.y * q2.x - q1.x * q2.y; //按照3D数学基础:图形与游戏开发 中四元数修改的定义
+
+ // //按照四元数乘法标准计算法,实际不用
+ //q.w = q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z;
+ //q.x = q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y;
+ //q.y = q1.w * q2.y - q1.x * q2.z + q1.y * q2.w + q1.z * q2.x;
+ //q.z = q1.w * q2.z + q1.x * q2.y - q1.y * q2.x + q1.z * q2.w;
+
+ mod = QuaternionMod(q);
+ q.w = q.w/mod; q.x = q.x/mod; q.y = q.y/mod; q.z = q.z/mod;
+ return q;
+}
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1)
+{
+ Quaternion q;
+ /*按照四元数乘法计算系数*/
+ q.w = q1.w;
+ q.x = -q1.x;
+ q.y = -q1.y;
+ q.z = -q1.z;
+ return q;
+}
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1)
+{
+ float mod;
+ /*按照四元数乘法计算系数*/
+ mod = q1.w * q1.w + q1.x * q1.x +
+ q1.y * q1.y + q1.z * q1.z;
+ mod = sqrt(mod);
+ return mod;
+}
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1)
+{
+ Quaternion q;
+ /*计算四元数模的平方*/
+ float mod2 = QuaternionMod(q1);
+ /* 按照公式: *q^-1 = (q*)/(|q|)^2 */
+ q = QuaternionConjugate(q1);
+ q.w = q.w / mod2;
+ q.x = q.x / mod2;
+ q.y = q.y / mod2;
+ q.z = q.z / mod2;
+ return q;
+}
+
+void DisplayQuaternion(Quaternion q)
+{
+ float q0,q1,q2,q3;
+ q0 = q.w; q1 = q.x; q2 = q.y; q3 = q.z;
+ printf("DisplayQuaternion ::w = %f x = %f y = %f z = %f\n",q.w,q.x,q.y,q.z);
+}
+
+/*欧拉角转四元数*/
+Quaternion EulerAnglesToQuaternion(EulerAngles e)
+{
+ Quaternion q;
+ e.Pitch = e.Pitch/(180.00f/3.141592f);
+ e.Yaw = e.Yaw/ (180.00f/3.141592f);
+ e.Roll = e.Roll/ (180.00f/3.141592f);
+ // 按照Qz*Qy*Qx 产生四元数
+ /*w*/
+ q.w = (float)(cos(0.5*e.Roll)*cos(0.5*e.Pitch)*cos(0.5*e.Yaw) - sin(0.5*e.Roll)*sin(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*x 绕x轴旋转是pitch*/
+ q.x = (float)(cos(0.5*e.Roll)*sin(0.5*e.Pitch)*cos(0.5*e.Yaw) - sin(0.5*e.Roll)*cos(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*y 绕y轴旋转是roll*/
+ q.y = (float)(sin(0.5*e.Roll)*cos(0.5*e.Pitch)*cos(0.5*e.Yaw) + cos(0.5*e.Roll)*sin(0.5*e.Pitch)*sin(0.5*e.Yaw));
+ /*z 绕z轴旋转是Yaw*/
+ q.z = (float)(cos(0.5*e.Roll)*cos(0.5*e.Pitch)*sin(0.5*e.Yaw) + sin(0.5*e.Roll)*sin(0.5*e.Pitch)*cos(0.5*e.Yaw));
+ return q;
+}
+
+EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer)
+{
+ EulerAngles e;
+ /*Pitch 在D3D坐标系中被认为是绕x轴旋转,Roll绕z旋转,Yaw是绕y旋转*/
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(y*z-w*x))* (180.0f /PI);
+ e.Yaw = atan2(x*z + w*y,0.5f - x*x - y*y)* (180.0f /PI);
+ e.Roll = atan2(x*y + w*z,0.5f - x*x - z*z)* (180.0f /PI);
+
+ return e;
+}
+
+
+void DisplayEulerAngles(EulerAngles e)
+{
+ printf("DisplayEulerAngles::Yaw=%f,Pitch=%f,Roll=%f\n",e.Yaw,e.Pitch,e.Roll);
+}
+
+void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll)
+{
+ (*e).Pitch = Pitch; (*e).Roll = Roll;(*e).Yaw = Yaw;
+}
+
+
+EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll)
+{
+ EulerAngles e;
+ (e).Pitch = Pitch; (e).Roll = Roll;(e).Yaw = Yaw;
+ return e;
+}
+
+Vector3 SetVector3(float x,float y,float z)
+{
+ Vector3 v;
+ v.x = x;
+ v.y = y;
+ v.z = z;
+ return v;
+}
+
+
+bool QuaternionEqual(Quaternion q1,Quaternion q2)
+{
+ if(fabsf(q1.w-q2.w)<0.0001f&&
+ fabsf(q1.x-q2.x)<0.0001f&&
+ fabsf(q1.y-q2.y)<0.0001f&&
+ fabsf(q1.z-q2.z)<0.0001f)return true;
+ return false;
+}
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz)
+{
+ float qw,qx,qy,qz;
+ static float q0 = 1.0f,q1 = 0.0f,q2 = 0.0f,q3 = 0.0f;
+ float halfT = 1.0f;
+
+ Quaternion q;
+ qw = (-q1*gx - q2*gy - q3*gz)*halfT; /*利用一阶龙格库塔法对四元数进行更新*/
+ qx = ( q0*gx + q2*gz - q3*gy)*halfT;
+ qy = ( q0*gy - q1*gz + q3*gx)*halfT;
+ qz = ( q0*gz + q1*gy - q2*gx)*halfT;
+
+ q0 = q0 + qw;
+ q1 = q1 + qx;
+ q2 = q2 + qy;
+ q3 = q3 + qz;
+
+ q.w = q0;
+ q.x = q1;
+ q.y = q2;
+ q.z = q3;
+
+
+ float mod2 = QuaternionMod(q); /*求模*/
+
+ q.w = q.w / mod2;
+ q.x = q.x / mod2;
+ q.y = q.y / mod2;
+ q.z = q.z / mod2;
+
+ return q;
+}
+
+
+/*把四元数转换为旋转矩阵*/
+Matrix3 QuaternionToMatrix(Quaternion q)
+{
+ Matrix3 mMatrix;
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ mMatrix.m[0][0] = 1 - 2*y*y -2*z*z;
+ mMatrix.m[0][1] = 2*x*y + 2*w*z;
+ mMatrix.m[0][2] = 2*x*y - 2*w*y;
+
+ mMatrix.m[1][0] = 2*x*y - 2*w*z;
+ mMatrix.m[1][1] = 1 - 2*x*x -2*z*z;
+ mMatrix.m[1][2] = 2*y*z + 2*w*x;
+
+ mMatrix.m[2][0] = 2*x*z + 2*w*z;
+ mMatrix.m[2][1] = 2*y*z - 2*w*x;
+ mMatrix.m[2][2] = 1 - 2*x*x -2*y*y;
+ return mMatrix;
+}
+
+/* 给定旋转矩阵以及向量,返回旋转后的向量*/
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec)
+{
+ MVector3 mResult;
+ int j;
+ for(j=0;j<3;j++)
+ {
+ mResult.v[j] = mMatrix.m[j][0]*vec.v[0] +
+ mMatrix.m[j][1]*vec.v[1] +
+ mMatrix.m[j][2]*vec.v[2];
+ }
+ return mResult;
+}
+
+
+
+
+/*************************************************************************
+
+* 描 述 : 把标准笛卡尔坐标系下的四元数转换到欧拉角显示。
+ 这里的变换公式为物体-惯性四元数转换到欧拉角
+
+**************************************************************************/
+EulerAngles MathQuaternionToEulerAngles(Quaternion q)
+{
+ EulerAngles e;
+ /*标准笛卡尔坐标系中,我们认为绕z轴为Yaw,绕x轴为Roll,绕y轴为Pitch*/
+ float w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(z*x-w*y))* (180.0f /PI);
+ e.Yaw = atan2(y*x + w*z,0.5f - y*y - z*z)* (180.0f /PI);
+ e.Roll = atan2(y*z + w*x,0.5f - y*y - x*x)* (180.0f /PI);
+
+ return e;
+}
+/*************************************************************************
+
+* 描 述 : 把D3D坐标系下的四元数转换到欧拉角显示。
+ 这里的变换公式为物体-惯性四元数转换到欧拉角
+
+**************************************************************************/
+EulerAngles D3DQuaternionToEulerAngles(Quaternion q)
+{
+ EulerAngles e;
+ /*Pitch 在D3D坐标系中被认为是绕x轴旋转,Roll绕z旋转,Yaw是绕y旋转*/
+ double w,x,y,z;
+ w = q.w; x = q.x; y = q.y; z = q.z;
+
+ e.Pitch = asin(-2.0f*(y*z-w*x))* (180.0f /PI);
+ e.Yaw = atan2(x*z + w*y,0.5f - x*x - y*y)* (180.0f /PI);
+ e.Roll = atan2(x*y + w*z,0.5f - x*x - z*z)* (180.0f /PI);
+
+ return e;
+}
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/quaternion.h b/4.Software/GeekIMUDriver 1.1/Src/quaternion.h
new file mode 100644
index 0000000..b0236f3
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/quaternion.h
@@ -0,0 +1,136 @@
+#ifndef _QUATERNION_H_
+#define _QUATERNION_H_
+
+
+typedef struct _Quaternion
+{
+ float w,x,y,z;
+}Quaternion;
+
+
+typedef struct _Vector3
+{
+ float x,y,z;
+}Vector3;
+
+typedef struct _EulerAngles{
+ float Yaw;
+ float Roll;
+ float Pitch;
+}EulerAngles;
+
+typedef struct _MVector3
+{
+ float v[3];
+}MVector3;
+
+
+typedef struct _Matrix3
+{
+ float m[3][3];
+}Matrix3;
+
+
+
+#ifdef __cplusplus
+extern "C"{
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v);
+
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,Quaternion q2);
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1);
+
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1);
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1);
+
+void DisplayQuaternion(Quaternion q);
+
+Quaternion EulerAnglesToQuaternion(EulerAngles e);
+
+//EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer);
+
+void DisplayEulerAngles(EulerAngles e);
+
+//void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll);
+
+EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll);
+
+/*判断两个四元数是否相等,相等返回ture,否则返回false*/
+bool QuaternionEqual(Quaternion q1,Quaternion q2);
+
+
+Vector3 SetVector3(float x,float y,float z);
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz);
+
+
+Matrix3 QuaternionToMatrix(Quaternion q);
+
+
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec);
+
+EulerAngles MathQuaternionToEulerAngles(Quaternion q);
+
+
+
+}
+
+#else
+
+/*给定一个绕单位向量(x,y,z)绕此单位向量旋转angle角度,创建四元数*/
+Quaternion CreateQuaternion(float angle,Vector3 v);
+
+/*计算两个四元数相乘,返回相乘的结果*/
+Quaternion QuaternionMulti(Quaternion q1,Quaternion q2);
+
+/*给定四元数求该四元数的共轭四元数*/
+Quaternion QuaternionConjugate(Quaternion q1);
+
+/*给定四元数求该四元数的模*/
+float QuaternionMod(Quaternion q1);
+
+/*给定四元数求该四元数的逆*/
+Quaternion QuaternionInversion(Quaternion q1);
+
+void DisplayQuaternion(Quaternion q);
+
+Quaternion EulerAnglesToQuaternion(EulerAngles e);
+
+//EulerAngles QuaternionToEulerAngles(Quaternion q,bool useRefer);
+
+void DisplayEulerAngles(EulerAngles e);
+
+void SetEulerAngles(EulerAngles *e,float Yaw,float Pitch,float Roll);
+
+//EulerAngles SetEulerAngles(float Yaw,float Pitch,float Roll);
+
+/*判断两个四元数是否相等,相等返回ture,否则返回false*/
+//bool QuaternionEqual(Quaternion q1,Quaternion q2);
+
+
+Vector3 SetVector3(float x,float y,float z);
+
+Quaternion CreateQuaternionByGyro(float gx,float gy,float gz);
+
+
+Matrix3 QuaternionToMatrix(Quaternion q);
+
+
+MVector3 ComputeRotate(Matrix3 mMatrix,MVector3 vec);
+
+EulerAngles MathQuaternionToEulerAngles(Quaternion q);
+
+
+#endif
+
+
+
+
+#endif
\ No newline at end of file
diff --git a/4.Software/GeekIMUDriver 1.1/Src/sensor.h b/4.Software/GeekIMUDriver 1.1/Src/sensor.h
new file mode 100644
index 0000000..e69de29
diff --git a/4.Software/GeekIMUDriver 1.1/Src/usbport.h b/4.Software/GeekIMUDriver 1.1/Src/usbport.h
new file mode 100644
index 0000000..59498d3
--- /dev/null
+++ b/4.Software/GeekIMUDriver 1.1/Src/usbport.h
@@ -0,0 +1,40 @@
+#include
+#include
+#include "hidsdi.h"
+#include "hidclass.h"
+#include "hidpddi.h"
+#include "hidport.h"
+#include "SetupAPI.h"
+#include
+#include "malloc.h"
+
+#pragma comment(lib,"setupapi.lib")
+#pragma comment(lib,"hid.lib")
+#pragma comment(lib,"comctl32.lib")
+
+#ifndef BULKUSBH_INC
+#define BULKUSBH_INC
+
+#define BULKUSB_IOCTL_INDEX 0x0000
+
+#define IOCTL_BULKUSB_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \
+0x0000, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_RESET_DEVICE CTL_CODE(FILE_DEVICE_UNKNOWN, \
+0x0001, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+#define IOCTL_BULKUSB_RESET_PIPE CTL_CODE(FILE_DEVICE_UNKNOWN,
+0x0002, \
+METHOD_BUFFERED, \
+FILE_ANY_ACCESS)
+
+extern HANDLE open_file(char *filename);
+extern int GetUsbPath(char *path);
+extern int WriteUsb(HANDLE hUsb, char *Outbuff, int len);
+extern int ReadUsb(HANDLE hUsb, BYTE inbuff[], DWORD &nBytesRead, int nToRead);
+
+#endif
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7e7d314
--- /dev/null
+++ b/README.md
@@ -0,0 +1,38 @@
+锘# **GeekIMU**
+
+鏇存柊鏃ユ湡锛2022-09-13
+
+### 涓銆佹杩
+
+GeeKIMU 鏄竴涓潪甯哥簿鑷村皬宸х殑imu妯″潡锛岄噰鐢∣culus鐩稿悓鐨勯檧铻轰华鍜岀鍔涜銆傚叾涓檧铻轰华閲囩敤MPU6500锛岃岀鍔涜鍒欓噰鐢↙IS3MDL銆備紶鎰熷櫒鐨勬暟鎹緭鍑洪噰鐢║SB-HID鍗忚銆傜敱浜嶮PU6500鍜孡IS3MDL閮芥敮鎸佺鍔涜锛屾墍浠ュ彲浠ュ湪鏋佺煭鐨勬椂闂村唴瀹屾垚IMU鏁版嵁鐨勯噰鏍枫傛湰椤圭洰鏃ㄥ湪涓哄IMU鎰熷叴瓒g殑浜烘彁渚涗竴浜涘府鍔╋紝鍑忓皯閲嶅鍐欓┍鍔ㄧ殑楹荤儲銆
+
+纭欢鍔熻兘鎻忚堪锛1銆佷笁杞村姞閫熷害璁°侀檧铻轰华銆佺鍔涜
+
+### 浜屻佽蒋浠跺姛鑳斤細
+
+1. windows USB-HID 1000Hz 椹卞姩锛岄噰鐢╒isual Studio缂栬瘧锛岃幏鍙栧師濮婭MU鐨勬暟鎹
+2. 閲囩敤C# + OpenGL 瀹炵幇3D鍥惧舰鐣岄潰鏍″噯纾佸姏璁″苟鍐欏叆鍙傛暟鍒癝TM32
+3. 杞欢GUI鍙戦佸懡浠よ缃檧铻轰华闈欐鏍″噯
+4. 3D濮挎佹樉绀
+
+
+
+### 涓夈佸叾浠栫敤閫旓細
+
+1. ROS绯荤粺IMU鏁版嵁婧
+2. AHRS绠楁硶浠跨湡璋冭瘯锛屽EFK绠楁硶闆跺亸浼拌
+3. Oculus VR & SteamVR
+
+
+
+### 鍥涖佺幆澧冮厤缃拰浣跨敤
+
+鐩墠鍦╳indows 10浠ュ強windows11浣跨敤鍧囨甯革紝鐢变簬璇isul studio 宸ョ▼閲囩敤VS2012缂栬瘧锛屾墍浠ラ渶瑕乿s2012鐨勮繍琛屽簱锛屾殏鏃犲叾浠栭棶棰樸傜‖浠禤CB鎵撴牱缁忚繃楠岃瘉锛屾祴璇曟甯稿伐浣溿
+
+### 鍥涖佹妧鏈鏍
+
+闄铻轰华 锛歁PU6500
+纾佸姏璁 锛歀IS3MDL
+閫氫俊鏂瑰紡锛歎SB-HID
+瑙g畻棰戠巼锛氭渶楂1000Hz
+