diff --git a/basic-geometry/basic-geometry.vcxproj b/basic-geometry/basic-geometry.vcxproj
index bd39f43..8984b17 100644
--- a/basic-geometry/basic-geometry.vcxproj
+++ b/basic-geometry/basic-geometry.vcxproj
@@ -26,8 +26,9 @@
+
-
+
@@ -52,8 +53,9 @@
+
-
+
diff --git a/basic-geometry/basic-geometry.vcxproj.filters b/basic-geometry/basic-geometry.vcxproj.filters
index 4f47928..b855491 100644
--- a/basic-geometry/basic-geometry.vcxproj.filters
+++ b/basic-geometry/basic-geometry.vcxproj.filters
@@ -90,10 +90,13 @@
Файлы заголовков
-
+
Файлы заголовков
-
+
+ Файлы заголовков
+
+
Файлы заголовков
@@ -152,14 +155,17 @@
Исходные файлы
-
- Исходные файлы
-
Исходные файлы
Исходные файлы
+
+ Исходные файлы
+
+
+ Исходные файлы
+
\ No newline at end of file
diff --git a/basic-geometry/dual-quaternion.c b/basic-geometry/dual-quaternion.c
index a0a1d22..8cfeede 100644
--- a/basic-geometry/dual-quaternion.c
+++ b/basic-geometry/dual-quaternion.c
@@ -8,3 +8,15 @@ extern inline void bgc_fp64_dual_quaternion_copy(BGC_FP64_DualQuaternion* destin
extern inline void bgc_fp32_dual_quaternion_swap(BGC_FP32_DualQuaternion* first, BGC_FP32_DualQuaternion* second);
extern inline void bgc_fp64_dual_quaternion_swap(BGC_FP64_DualQuaternion* first, BGC_FP64_DualQuaternion* second);
+
+extern inline void bgc_fp32_dual_quaternion_convert_to_fp64(BGC_FP64_DualQuaternion* destination, const BGC_FP32_DualQuaternion* source);
+extern inline void bgc_fp64_dual_quaternion_convert_to_fp32(BGC_FP32_DualQuaternion* destination, const BGC_FP64_DualQuaternion* source);
+
+extern inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* first, const BGC_FP32_DualQuaternion* second);
+extern inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* first, const BGC_FP64_DualQuaternion* second);
+
+extern inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* base_quaternion, const BGC_FP32_DualQuaternion* scalable_quaternion, const float scale);
+extern inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* base_quaternion, const BGC_FP64_DualQuaternion* scalable_quaternion, const double scale);
+
+extern inline void bgc_fp32_dual_quaternion_subtract(BGC_FP32_DualQuaternion* difference, const BGC_FP32_DualQuaternion* minuend, const BGC_FP32_DualQuaternion* subtrahend);
+extern inline void bgc_fp64_dual_quaternion_subtract(BGC_FP64_DualQuaternion* difference, const BGC_FP64_DualQuaternion* minuend, const BGC_FP64_DualQuaternion* subtrahend);
diff --git a/basic-geometry/dual-quaternion.h b/basic-geometry/dual-quaternion.h
index d7961a9..12b3343 100644
--- a/basic-geometry/dual-quaternion.h
+++ b/basic-geometry/dual-quaternion.h
@@ -55,4 +55,60 @@ inline void bgc_fp64_dual_quaternion_swap(BGC_FP64_DualQuaternion* first, BGC_FP
bgc_fp64_quaternion_swap(&first->dual, &second->dual);
}
+// ================== Convert =================== //
+
+inline void bgc_fp32_dual_quaternion_convert_to_fp64(BGC_FP64_DualQuaternion* destination, const BGC_FP32_DualQuaternion* source)
+{
+ bgc_fp32_quaternion_convert_to_fp64(&destination->real, &source->real);
+ bgc_fp32_quaternion_convert_to_fp64(&destination->dual, &source->dual);
+}
+
+inline void bgc_fp64_dual_quaternion_convert_to_fp32(BGC_FP32_DualQuaternion* destination, const BGC_FP64_DualQuaternion* source)
+{
+ bgc_fp64_quaternion_convert_to_fp32(&destination->real, &source->real);
+ bgc_fp64_quaternion_convert_to_fp32(&destination->dual, &source->dual);
+}
+
+// ==================== Add ===================== //
+
+inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* first, const BGC_FP32_DualQuaternion* second)
+{
+ bgc_fp32_quaternion_add(&sum->real, &first->real, &second->real);
+ bgc_fp32_quaternion_add(&sum->dual, &first->dual, &second->dual);
+}
+
+inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* first, const BGC_FP64_DualQuaternion* second)
+{
+ bgc_fp64_quaternion_add(&sum->real, &first->real, &second->real);
+ bgc_fp64_quaternion_add(&sum->dual, &first->dual, &second->dual);
+}
+
+// ================= Add Scaled ================= //
+
+inline void bgc_fp32_dual_quaternion_add(BGC_FP32_DualQuaternion* sum, const BGC_FP32_DualQuaternion* base_quaternion, const BGC_FP32_DualQuaternion* scalable_quaternion, const float scale)
+{
+ bgc_fp32_quaternion_add_scaled(&sum->real, &base_quaternion->real, &scalable_quaternion->real, scale);
+ bgc_fp32_quaternion_add_scaled(&sum->dual, &base_quaternion->dual, &scalable_quaternion->dual, scale);
+}
+
+inline void bgc_fp64_dual_quaternion_add(BGC_FP64_DualQuaternion* sum, const BGC_FP64_DualQuaternion* base_quaternion, const BGC_FP64_DualQuaternion* scalable_quaternion, const double scale)
+{
+ bgc_fp64_quaternion_add_scaled(&sum->real, &base_quaternion->real, &scalable_quaternion->real, scale);
+ bgc_fp64_quaternion_add_scaled(&sum->dual, &base_quaternion->dual, &scalable_quaternion->dual, scale);
+}
+
+// ================== Subtract ================== //
+
+inline void bgc_fp32_dual_quaternion_subtract(BGC_FP32_DualQuaternion* difference, const BGC_FP32_DualQuaternion* minuend, const BGC_FP32_DualQuaternion* subtrahend)
+{
+ bgc_fp32_quaternion_subtract(&difference->real, &minuend->real, &subtrahend->real);
+ bgc_fp32_quaternion_subtract(&difference->dual, &minuend->dual, &subtrahend->dual);
+}
+
+inline void bgc_fp64_dual_quaternion_subtract(BGC_FP64_DualQuaternion* difference, const BGC_FP64_DualQuaternion* minuend, const BGC_FP64_DualQuaternion* subtrahend)
+{
+ bgc_fp64_quaternion_subtract(&difference->real, &minuend->real, &subtrahend->real);
+ bgc_fp64_quaternion_subtract(&difference->dual, &minuend->dual, &subtrahend->dual);
+}
+
#endif