Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYimingWu <xp8110@outlook.com>2021-12-25 17:23:41 +0300
committerYimingWu <xp8110@outlook.com>2021-12-25 17:23:41 +0300
commit581ca8f7639597f8e58294cef39ee3e13015dc78 (patch)
tree63c9fb63bcde72ebc7024195984c53e65d098ab6
parentd2bf60cc17a961789d7c415fc3d2af14afa50f62 (diff)
Nurbs: Trying to get opencascade backend to make nurbs, not working yet.nurbs-opencascade
-rw-r--r--CMakeLists.txt2
-rw-r--r--build_files/cmake/Modules/FindOpenCascade.cmake157
-rw-r--r--build_files/cmake/macros.cmake4
-rw-r--r--build_files/cmake/platform/platform_unix.cmake5
-rw-r--r--source/blender/blenkernel/CMakeLists.txt18
-rw-r--r--source/blender/blenkernel/intern/curve.cc232
6 files changed, 418 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5c5b5eb317e..c1f31850807 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -699,6 +699,8 @@ if(UNIX AND NOT APPLE)
mark_as_advanced(WITH_CXX11_ABI)
endif()
+option(WITH_OPENCASCADE "Enable opencascade for curve" ON)
+
# Installation process.
option(POSTINSTALL_SCRIPT "Run given CMake script after installation process" OFF)
mark_as_advanced(POSTINSTALL_SCRIPT)
diff --git a/build_files/cmake/Modules/FindOpenCascade.cmake b/build_files/cmake/Modules/FindOpenCascade.cmake
new file mode 100644
index 00000000000..0b5a9eeeba6
--- /dev/null
+++ b/build_files/cmake/Modules/FindOpenCascade.cmake
@@ -0,0 +1,157 @@
+# This script finds OpenCASCADE Technology libraries.
+# The script requires:
+# OpenCASCADE_DIR - root OCCT folder or folder with CMake configuration files
+#
+# Script will define the following variables on success:
+# OpenCASCADE_FOUND - package is successfully found
+# OpenCASCADE_INCLUDE_DIR - directory with headers
+# OpenCASCADE_LIBRARY_DIR - directory with libraries for linker
+# OpenCASCADE_BINARY_DIR - directory with DLLs
+include(FindPackageHandleStandardArgs)
+
+# MY_PLATFORM variable
+math (EXPR MY_BITNESS "32 + 32*(${CMAKE_SIZEOF_VOID_P}/8)")
+if (WIN32)
+ set (MY_PLATFORM "win${MY_BITNESS}")
+elseif(APPLE)
+ set (MY_PLATFORM "mac")
+else()
+ set (MY_PLATFORM "lin")
+endif()
+
+# MY_PLATFORM_AND_COMPILER variable
+if (MSVC)
+ if (MSVC90)
+ set (MY_COMPILER vc9)
+ elseif (MSVC10)
+ set (MY_COMPILER vc10)
+ elseif (MSVC11)
+ set (MY_COMPILER vc11)
+ elseif (MSVC12)
+ set (MY_COMPILER vc12)
+ elseif (MSVC14)
+ set (MY_COMPILER vc14)
+ else()
+ set (MY_COMPILER vc15)
+ message (WARNING "Unknown msvc version. $$MY_COMPILER is used")
+ endif()
+elseif (DEFINED CMAKE_COMPILER_IS_GNUCC)
+ set (MY_COMPILER gcc)
+elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX)
+ set (MY_COMPILER gcc)
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ set (MY_COMPILER clang)
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
+ set (MY_COMPILER icc)
+else()
+ set (MY_COMPILER ${CMAKE_GENERATOR})
+ string (REGEX REPLACE " " "" COMPILER ${MY_COMPILER})
+endif()
+set (MY_PLATFORM_AND_COMPILER "${MY_PLATFORM}/${MY_COMPILER}")
+
+set (OpenCASCADE_DIR "" CACHE PATH "Path to Open CASCADE libraries.")
+
+# default paths
+set (OpenCASCADE_INCLUDE_DIR "${OpenCASCADE_DIR}/inc")
+set (OpenCASCADE_LIBRARY_DIR "${OpenCASCADE_DIR}/${MY_PLATFORM_AND_COMPILER}/lib")
+set (OpenCASCADE_BINARY_DIR "${OpenCASCADE_DIR}/${MY_PLATFORM_AND_COMPILER}/bin")
+
+# complete list of OCCT Toolkits (copy-paste from adm/UDLIST, since installed OCCT does not include UDLIST)
+set (OpenCASCADE_TKLIST "")
+set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKernel TKMath) # FoundationClasses
+set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKG2d TKG3d TKGeomBase TKBRep) # ModelingData
+set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKGeomAlgo TKTopAlgo TKPrim TKBO TKBool TKHLR TKFillet TKOffset TKFeat TKMesh TKXMesh TKShHealing) # ModelingAlgorithms
+set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKService TKV3d TKOpenGl TKMeshVS TKIVtk TKD3DHost) # Visualization
+set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKCDF TKLCAF TKCAF TKBinL TKXmlL TKBin TKXml TKStdL TKStd TKTObj TKBinTObj TKXmlTObj TKVCAF) # ApplicationFramework
+set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKXSBase TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP TKIGES TKXCAF TKXDEIGES TKXDESTEP TKSTL TKVRML TKXmlXCAF TKBinXCAF TKRWMesh) # DataExchange
+set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKDraw TKViewerTest) # Draw
+
+# validate location of OCCT libraries and headers
+set (OpenCASCADE_INCLUDE_DIR_FOUND)
+set (OpenCASCADE_LIBRARY_DIR_FOUND)
+set (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND)
+set (OpenCASCADE_IMPLIB_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX})
+set (OpenCASCADE_SHAREDLIB_RELEASE_FOUND)
+set (OpenCASCADE_SHAREDLIB_DEBUG_FOUND)
+if (EXISTS "${OpenCASCADE_INCLUDE_DIR}/Standard.hxx")
+ set (OpenCASCADE_INCLUDE_DIR_FOUND ON)
+endif()
+
+if (EXISTS "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_LIBRARY_DIR_FOUND ON)
+elseif (NOT WIN32 AND EXISTS "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_LIBRARY_DIR_FOUND ON)
+ set (OpenCASCADE_IMPLIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
+endif()
+
+if (EXISTS "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND ON)
+elseif (NOT WIN32 AND EXISTS "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND ON)
+ set (OpenCASCADE_IMPLIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
+elseif (OpenCASCADE_LIBRARY_DIR_FOUND)
+ message (STATUS "Only release OpenCASCADE libraries have been found")
+endif()
+
+if (NOT OpenCASCADE_LIBRARY_DIR_FOUND AND OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND)
+ set (OpenCASCADE_LIBRARY_DIR_FOUND ON)
+ message (WARNING "Only debug OpenCASCADE libraries have been found")
+endif()
+
+if (WIN32)
+ if (EXISTS "${OpenCASCADE_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_SHAREDLIB_RELEASE_FOUND ON)
+ endif()
+ if (EXISTS "${OpenCASCADE_BINARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_SHAREDLIB_DEBUG_FOUND ON)
+ endif()
+else()
+ if (EXISTS "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_SHAREDLIB_RELEASE_FOUND ON)
+ endif()
+ if (EXISTS "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set (OpenCASCADE_SHAREDLIB_DEBUG_FOUND ON)
+ endif()
+endif()
+
+if (OpenCASCADE_INCLUDE_DIR_FOUND AND OpenCASCADE_LIBRARY_DIR_FOUND)
+ set (OpenCASCADE_FOUND ON)
+ set (OpenCASCADE_INSTALL_PREFIX ${OpenCASCADE_DIR})
+
+ # Define OCCT toolkits so that CMake can put absolute paths to linker;
+ # the library existance is not checked here, since modules can be disabled.
+ foreach (aLibIter ${OpenCASCADE_TKLIST})
+ add_library (${aLibIter} SHARED IMPORTED)
+
+ set_property (TARGET ${aLibIter} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
+ set_target_properties (${aLibIter} PROPERTIES IMPORTED_IMPLIB_RELEASE "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${OpenCASCADE_IMPLIB_SUFFIX}")
+ if (OpenCASCADE_SHAREDLIB_RELEASE_FOUND)
+ if (WIN32)
+ set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_RELEASE "${OpenCASCADE_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ else()
+ set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_RELEASE "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ endif()
+ endif()
+
+ if (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND)
+ set_property (TARGET ${aLibIter} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
+ set_target_properties (${aLibIter} PROPERTIES IMPORTED_IMPLIB_DEBUG "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${OpenCASCADE_IMPLIB_SUFFIX}")
+ if (OpenCASCADE_SHAREDLIB_DEBUG_FOUND)
+ if (WIN32)
+ set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_DEBUG "${OpenCASCADE_BINARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ else()
+ set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_DEBUG "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ endif()
+ endif()
+ endif()
+ endforeach()
+else()
+ # fallback searching for CMake configs
+ if (NOT "${OpenCASCADE_DIR}" STREQUAL "")
+ set (anOcctDirBak "${OpenCASCADE_DIR}")
+ find_package (OpenCASCADE CONFIG QUIET PATHS "${OpenCASCADE_DIR}" NO_DEFAULT_PATH)
+ set (OpenCASCADE_DIR "${anOcctDirBak}" CACHE PATH "Path to Open CASCADE libraries." FORCE)
+ else()
+ find_package (OpenCASCADE CONFIG QUIET)
+ endif()
+endif()
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 34c2c9a684d..81119b83316 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -596,6 +596,10 @@ function(SETUP_LIBDIRS)
link_directories(${GMP_LIBPATH})
endif()
+ if(WITH_OPENCASCADE)
+ link_directories(${OpenCASCADE_LIBRARY_DIR})
+ endif()
+
if(WIN32 AND NOT UNIX)
link_directories(${PTHREADS_LIBPATH})
endif()
diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake
index 2f1a622c63d..8605e00684a 100644
--- a/build_files/cmake/platform/platform_unix.cmake
+++ b/build_files/cmake/platform/platform_unix.cmake
@@ -738,3 +738,8 @@ if(WITH_COMPILER_CCACHE)
set(WITH_COMPILER_CCACHE OFF)
endif()
endif()
+
+if(WITH_OPENCASCADE)
+ find_package_wrapper(OpenCascade REQUIRED)
+endif()
+
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 02aef4ef79e..d57d24f98b2 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -791,6 +791,24 @@ if(WITH_GMP)
)
endif()
+if(WITH_OPENCASCADE)
+ add_definitions(-DWITH_OPENCASCADE)
+
+ list(APPEND INC_SYS
+ ${OpenCASCADE_INCLUDE_DIR}
+ )
+ SET(OpenCASCADE_LIBS
+ TKTObjDRAW.a TKQADraw.a TKXDEDRAW.a TKDCAF.a TKDCAF.a TKXSDRAW.a
+ TKViewerTest.a TKTopTest.a TKDraw.a TKXDESTEP.a TKBinXCAF.a TKXmlXCAF.a TKXDEIGES.a TKXCAF.a TKIGES.a TKSTEP.a TKSTEP209.a TKSTEPAttr.a
+ TKSTEPBase.a TKXSBase.a TKStd.a TKStdL.a TKSTL.a TKXml.a TKBin.a TKXmlL.a TKBinL.a TKCAF.a TKXCAF.a TKLCAF.a TKCDF.a TKMeshVS.a TKOpenGl.a TKV3d.a TKService.a
+ TKXMesh.a TKMesh.a TKOffset.a TKFeat.a TKFillet.a TKHLR.a TKBool.a TKBO.a TKShHealing.a TKPrim.a TKTopAlgo.a TKGeomAlgo.a TKBRep.a
+ TKGeomBase.a TKG3d.a TKG2d.a TKMath.a TKernel.a
+ )
+ list(APPEND LIB
+ ${OpenCASCADE_LIBS}
+ )
+endif()
+
# # Warnings as errors, this is too strict!
# if(MSVC)
# string(APPEND CMAKE_C_FLAGS " /WX")
diff --git a/source/blender/blenkernel/intern/curve.cc b/source/blender/blenkernel/intern/curve.cc
index dc2527f9b62..bee9a9ea923 100644
--- a/source/blender/blenkernel/intern/curve.cc
+++ b/source/blender/blenkernel/intern/curve.cc
@@ -67,6 +67,35 @@
#include "BLO_read_write.h"
+/* opencascade includes */
+
+#include <IGESCAFControl_Reader.hxx>
+#include <STEPCAFControl_Reader.hxx>
+#include <Standard_Stream.hxx>
+#include <Standard_TypeDef.hxx>
+#include <StlAPI_Writer.hxx>
+#include <iostream>
+
+#include <IMeshData_Status.hxx>
+#include <IMeshTools_Parameters.hxx>
+
+#include <BRepBuilderAPI.hxx>
+#include <BRepTools.hxx>
+#include <BRep_Tool.hxx>
+#include <Geom_BSplineSurface.hxx>
+#include <TColStd_Array1OfInteger.hxx>
+#include <TColStd_Array1OfReal.hxx>
+#include <TColgp_Array2OfPnt.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <TopoDS_Vertex.hxx>
+
+#include <BRepMesh_IncrementalMesh.hxx>
+#include <Geom_BSplineCurve.hxx>
+#include <Geom_Curve.hxx>
+#include <Geom_TrimmedCurve.hxx>
+#include <NCollection_Array1.hxx>
+
/* globals */
/* local */
@@ -1391,6 +1420,209 @@ void BKE_nurb_makeFaces(const Nurb *nu, float *coord_array, int rowstride, int r
return;
}
+ /* An example code I got somewhere on the Internet, this works... */
+
+ TColgp_Array2OfPnt poles(0, 7, 0, 5); // ucol,vrow
+ TColStd_Array1OfReal UKnots(0, 12);
+ TColStd_Array1OfReal VKnots(0, 10);
+
+ TColStd_Array1OfReal UKnots1(0, 5);
+ TColStd_Array1OfReal VKnots1(0, 3);
+ UKnots1.SetValue(0, 0);
+ UKnots1.SetValue(1, 1);
+ UKnots1.SetValue(2, 2);
+ UKnots1.SetValue(3, 3);
+ UKnots1.SetValue(4, 4);
+ UKnots1.SetValue(5, 5);
+ VKnots1.SetValue(0, 0);
+ VKnots1.SetValue(1, 1);
+ VKnots1.SetValue(2, 2);
+ VKnots1.SetValue(3, 3);
+ TColStd_Array1OfInteger UMults(0, 5);
+ UMults.SetValue(0, 4);
+ UMults.SetValue(1, 1);
+ UMults.SetValue(2, 1);
+ UMults.SetValue(3, 1);
+ UMults.SetValue(4, 1);
+ UMults.SetValue(5, 4);
+ TColStd_Array1OfInteger VMults(0, 3);
+ VMults.SetValue(0, 4);
+ VMults.SetValue(1, 1);
+ VMults.SetValue(2, 1);
+ VMults.SetValue(3, 4);
+ int n = 7; //(ctr pnts-1)
+ int k = 4; // degree+1
+ int n1 = 5;
+ int k1 = 4;
+ int t = 0;
+ int a = 0;
+ int b = 0;
+
+ for (int j = 0; j <= n + k; j++) {
+ if (j < k) {
+ t = 0;
+ a++;
+ UKnots.SetValue(a, t);
+ }
+
+ if (k <= j && j <= n) {
+ t = j - k + 1;
+ a++;
+ UKnots.SetValue(a, t);
+ }
+
+ if (j > n) {
+ t = n - k + 2;
+ a++;
+ UKnots.SetValue(a, t);
+ }
+ }
+ UKnots.SetValue(a, t);
+
+ for (int s = 0; s <= n1 + k1; s++) {
+ if (s < k1) {
+ t = 0;
+ b++;
+ VKnots.SetValue(b, t);
+ }
+
+ if (k1 <= s && s <= n1) {
+ t = s - k1 + 1;
+ b++;
+ VKnots.SetValue(b, t);
+ }
+
+ if (s > n1) {
+ t = n1 - k1 + 2;
+ b++;
+ VKnots.SetValue(b, t);
+ }
+ }
+ /*
+ knots = [knots ; t];
+ end
+
+ knots_matrix = knots;
+ */
+ // gp_Pnt P;
+ // poles.SetValue(1,1,P);
+ // poles.SetValue(1,1,P);
+ poles.SetValue(0, 0, gp_Pnt(0, 0, 0));
+ poles.SetValue(1, 0, gp_Pnt(0.4, 0, 0));
+ poles.SetValue(2, 0, gp_Pnt(0.8, 0, 0));
+ poles.SetValue(3, 0, gp_Pnt(1.2, 0, 0));
+ poles.SetValue(4, 0, gp_Pnt(1.6, 0, 0));
+ poles.SetValue(5, 0, gp_Pnt(2.0, 0, 0));
+ poles.SetValue(6, 0, gp_Pnt(2.5, 0, 0));
+ poles.SetValue(7, 0, gp_Pnt(3, 0, 0));
+
+ poles.SetValue(0, 1, gp_Pnt(0, 0.4, 0));
+ poles.SetValue(1, 1, gp_Pnt(0.4, 0.4, 0.2));
+ poles.SetValue(2, 1, gp_Pnt(0.8, 0.4, 0.3));
+ poles.SetValue(3, 1, gp_Pnt(1.2, 0.4, 0.1));
+ poles.SetValue(4, 1, gp_Pnt(1.6, 0.4, 0));
+ poles.SetValue(5, 1, gp_Pnt(2.0, 0.4, 0.2));
+ poles.SetValue(6, 1, gp_Pnt(2.5, 0.4, 0.1));
+ poles.SetValue(7, 1, gp_Pnt(3, 0.4, 0));
+
+ poles.SetValue(0, 2, gp_Pnt(0, 0.8, 0));
+ poles.SetValue(1, 2, gp_Pnt(0.4, 0.8, 0.5));
+ poles.SetValue(2, 2, gp_Pnt(0.8, 0.8, 0.6));
+ poles.SetValue(3, 2, gp_Pnt(1.2, 0.8, 0.2));
+ poles.SetValue(4, 2, gp_Pnt(1.6, 0.8, 0.0));
+ poles.SetValue(5, 2, gp_Pnt(2.0, 0.8, 0));
+ poles.SetValue(6, 2, gp_Pnt(2.5, 0.8, 0.3));
+ poles.SetValue(7, 2, gp_Pnt(3, 0.8, 0));
+
+ poles.SetValue(0, 3, gp_Pnt(0, 1.2, 0));
+ poles.SetValue(1, 3, gp_Pnt(0.4, 1.2, 0.4));
+ poles.SetValue(2, 3, gp_Pnt(0.8, 1.2, 0.4));
+ poles.SetValue(3, 3, gp_Pnt(1.2, 1.2, 0.2));
+ poles.SetValue(4, 3, gp_Pnt(1.6, 1.2, 0.0));
+ poles.SetValue(5, 3, gp_Pnt(2.0, 1.2, 0.0));
+ poles.SetValue(6, 3, gp_Pnt(2.5, 1.2, 0.5));
+ poles.SetValue(7, 3, gp_Pnt(3, 1.2, 0));
+
+ poles.SetValue(0, 4, gp_Pnt(0, 1.6, 0));
+ poles.SetValue(1, 4, gp_Pnt(0.4, 1.6, 0.3));
+ poles.SetValue(2, 4, gp_Pnt(0.8, 1.6, 0.2));
+ poles.SetValue(3, 4, gp_Pnt(1.2, 1.6, 0.1));
+ poles.SetValue(4, 4, gp_Pnt(1.6, 1.6, 0.3));
+ poles.SetValue(5, 4, gp_Pnt(2.0, 1.6, 0.2));
+ poles.SetValue(6, 4, gp_Pnt(2.5, 1.6, 0.1));
+ poles.SetValue(7, 4, gp_Pnt(3, 1.6, 0));
+
+ poles.SetValue(0, 5, gp_Pnt(0, 2.0, 0));
+ poles.SetValue(1, 5, gp_Pnt(0.4, 2.0, 0));
+ poles.SetValue(2, 5, gp_Pnt(0.8, 2.0, 0));
+ poles.SetValue(3, 5, gp_Pnt(1.2, 2.0, 0));
+ poles.SetValue(4, 5, gp_Pnt(1.6, 2.0, 0));
+ poles.SetValue(5, 5, gp_Pnt(2.0, 2.0, 0));
+ poles.SetValue(6, 5, gp_Pnt(2.5, 2.0, 0));
+ poles.SetValue(7, 5, gp_Pnt(3, 2.0, 0));
+
+ Geom_BSplineSurface Surf(poles,
+ UKnots1,
+ VKnots1,
+ UMults,
+ VMults,
+ 3,
+ 3,
+ Standard_False,
+ Standard_False); // = new Geom_BSplineSurface();
+ // TopoDS_Shape sh=Surf;
+ // Handle(Geom_Surf) plz= new Geom_Surf(Surf);
+ // Handle (AIS_Shape) ais= new AIS_Shape(sh);
+ // Surf.Bounds(0,2,0,1);
+ // myAISContext->DisplayAll(1,1);//>Display(Surf);
+
+ /* XXXXX: My code does not work........ */
+ /* try to get cascade surface construction to work... not yet working it will crash. */
+
+ TColgp_Array2OfPnt poles = TColgp_Array2OfPnt(0, nu->pntsu, 0, nu->pntsv);
+ TColStd_Array1OfReal uknots = TColStd_Array1OfReal(0, nu->orderu + nu->pntsu);
+ TColStd_Array1OfReal vknots = TColStd_Array1OfReal(0, nu->orderv + nu->pntsv);
+ TColStd_Array1OfInteger umults = TColStd_Array1OfInteger(0, nu->orderu + nu->pntsu);
+ TColStd_Array1OfInteger vmults = TColStd_Array1OfInteger(0, nu->orderv + nu->pntsv);
+ for (int u = 0; u < nu->pntsu; u++) {
+ for (int v = 0; v < nu->pntsv; v++) {
+ BPoint *bp = &nu->bp[u * nu->pntsu + v];
+ poles.SetValue(u, v, gp_Pnt(bp->vec[0], bp->vec[1], bp->vec[2]));
+ printf("pt uv %d %d %f %f %f\n ", u, v, bp->vec[0], bp->vec[1], bp->vec[2]);
+ }
+ }
+ printf("pts uv %d %d\n ", nu->pntsu, nu->pntsv);
+ printf("order uv %d %d\n ", nu->orderu, nu->orderv);
+ for (int u = 0; u < nu->orderu + nu->pntsu; u++) {
+ uknots.SetValue(u, nu->knotsu[u]);
+ printf("%f ", nu->knotsu[u]);
+ }
+ printf("\n");
+ for (int v = 0; v < nu->orderv + nu->pntsv; v++) {
+ vknots.SetValue(v, nu->knotsv[v]);
+ printf("%f ", nu->knotsv[v]);
+ }
+ printf("\n");
+ for (int u = 0; u < nu->orderu + nu->pntsu; u++) {
+ umults.SetValue(u, 0);
+ }
+ umults.SetValue(0, 4);
+ umults.SetValue(nu->orderu + nu->pntsu - 1, 4);
+ for (int v = 0; v < nu->orderv + nu->pntsv; v++) {
+ vmults.SetValue(v, 0);
+ }
+ vmults.SetValue(0, 4);
+ vmults.SetValue(nu->orderv + nu->pntsv - 1, 4);
+ Geom_BSplineSurface surface = Geom_BSplineSurface(poles,
+ uknots,
+ vknots,
+ umults,
+ vmults,
+ nu->orderu - 1,
+ nu->orderv - 1,
+ Standard_False,
+ Standard_False);
+
/* allocate and initialize */
len = totu * totv;
if (len == 0) {