Compare commits
1 Commits
CR31457_1
...
CR0_IntSeg
Author | SHA1 | Date | |
---|---|---|---|
|
cb2e41f927 |
@@ -930,9 +930,6 @@ if (WIN32)
|
||||
OCCT_CONFIGURE ("adm/templates/env.${SCRIPT_EXT}.in" "env.${SCRIPT_EXT}")
|
||||
# install env script
|
||||
install (FILES "${CMAKE_BINARY_DIR}/env.${SCRIPT_EXT}" DESTINATION "${INSTALL_DIR_SCRIPT}")
|
||||
# copy build.bat and install.bat scripts to CMake binary folder
|
||||
OCCT_COPY_FILE_OR_DIR ("adm/templates/build.bat" "${CMAKE_BINARY_DIR}")
|
||||
OCCT_COPY_FILE_OR_DIR ("adm/templates/install.bat" "${CMAKE_BINARY_DIR}")
|
||||
else()
|
||||
set (SUB_ENV_NAME "env.${SCRIPT_EXT}")
|
||||
set (SUB_ENV_BUILD_NAME "env.install.${SCRIPT_EXT}")
|
||||
|
@@ -3,7 +3,6 @@ StdResource
|
||||
SHMessage
|
||||
Textures
|
||||
Shaders
|
||||
XRResources
|
||||
XSMessage
|
||||
XSTEPResource
|
||||
XmlOcafResource
|
||||
|
24
adm/UDLIST
@@ -108,7 +108,6 @@ n BRepMesh
|
||||
n BRepMeshData
|
||||
n BRepOffset
|
||||
n BRepOffsetAPI
|
||||
n BRepPreviewAPI
|
||||
n BRepPrim
|
||||
n BRepPrimAPI
|
||||
n BRepProj
|
||||
@@ -202,7 +201,6 @@ n InterfaceGraphic
|
||||
n AIS
|
||||
n Aspect
|
||||
n DsgPrs
|
||||
n PrsDim
|
||||
n Graphic3d
|
||||
n Image
|
||||
n Media
|
||||
@@ -216,13 +214,13 @@ n SelectBasics
|
||||
n SelectMgr
|
||||
n StdPrs
|
||||
n StdSelect
|
||||
n TColQuantity
|
||||
n V3d
|
||||
n WNT
|
||||
n Xw
|
||||
n Cocoa
|
||||
r Textures
|
||||
r Shaders
|
||||
r XRResources
|
||||
t TKMeshVS
|
||||
t TKOpenGl
|
||||
t TKD3DHost
|
||||
@@ -445,23 +443,3 @@ t TKRWMesh
|
||||
n RWGltf
|
||||
n RWMesh
|
||||
n RWObj
|
||||
n DFBrowser
|
||||
n DFBrowserPane
|
||||
n DFBrowserPaneXDE
|
||||
n ShapeView
|
||||
n TInspector
|
||||
n TInspectorAPI
|
||||
x TInspectorEXE
|
||||
t TKDFBrowser
|
||||
t TKShapeView
|
||||
t TKTInspector
|
||||
t TKTInspectorAPI
|
||||
t TKToolsDraw
|
||||
t TKTreeModel
|
||||
t TKView
|
||||
t TKVInspector
|
||||
n ToolsDraw
|
||||
n TreeModel
|
||||
n View
|
||||
n ViewControl
|
||||
n VInspector
|
||||
|
@@ -2,28 +2,19 @@
|
||||
|
||||
# execute FindBISON script by "find_package (Bison)" is required to define BISON_TARGET macro
|
||||
|
||||
# delete obsolete 3RDPARTY_BISON_EXECUTABLE cache variable (not used anymore)
|
||||
unset (3RDPARTY_BISON_EXECUTABLE CACHE)
|
||||
|
||||
# delete BISON_EXECUTABLE cache variable if it is empty, otherwise find_package will fail
|
||||
# without reasonable diagnostic
|
||||
if (NOT BISON_EXECUTABLE)
|
||||
unset (BISON_EXECUTABLE CACHE)
|
||||
if (NOT DEFINED 3RDPARTY_BISON_EXECUTABLE)
|
||||
set (3RDPARTY_BISON_EXECUTABLE "" CACHE FILEPATH "The path to the bison command")
|
||||
endif()
|
||||
|
||||
# Add paths to 3rdparty subfolders containing name "bison" to CMAKE_PROGRAM_PATH variable to make
|
||||
# these paths searhed by find_package
|
||||
if (3RDPARTY_DIR)
|
||||
file (GLOB BISON_PATHS LIST_DIRECTORIES true "${3RDPARTY_DIR}/*bison*/")
|
||||
foreach (candidate_path ${BISON_PATHS})
|
||||
if (IS_DIRECTORY ${candidate_path})
|
||||
list (APPEND CMAKE_PROGRAM_PATH ${candidate_path})
|
||||
endif()
|
||||
endforeach()
|
||||
# BISON_EXECUTABLE is required by BISON_TARGET macro and should be defined
|
||||
set (BISON_EXECUTABLE "${3RDPARTY_BISON_EXECUTABLE}" CACHE FILEPATH "path to the bison executable" FORCE)
|
||||
|
||||
find_package (BISON)
|
||||
|
||||
if (BISON_FOUND)
|
||||
set (3RDPARTY_BISON_EXECUTABLE "${BISON_EXECUTABLE}" CACHE FILEPATH "The Path to the bison command" FORCE)
|
||||
endif()
|
||||
|
||||
find_package (BISON 2.7)
|
||||
|
||||
if (NOT BISON_FOUND OR NOT BISON_EXECUTABLE OR NOT EXISTS "${BISON_EXECUTABLE}")
|
||||
list (APPEND 3RDPARTY_NOT_INCLUDED BISON_EXECUTABLE)
|
||||
if (NOT 3RDPARTY_BISON_EXECUTABLE OR NOT EXISTS "${3RDPARTY_BISON_EXECUTABLE}")
|
||||
list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_BISON_EXECUTABLE)
|
||||
endif()
|
@@ -2,28 +2,19 @@
|
||||
|
||||
# execute FindFLEX script by "find_package (Flex)" is required to define FLEX_TARGET macro
|
||||
|
||||
# delete obsolete 3RDPARTY_FLEX_EXECUTABLE cache variable (not used anymore)
|
||||
unset (3RDPARTY_FLEX_EXECUTABLE CACHE)
|
||||
|
||||
# delete FLEX_EXECUTABLE cache variable if it is empty, otherwise find_package will fail
|
||||
# without reasonable diagnostic
|
||||
if (NOT FLEX_EXECUTABLE)
|
||||
unset (FLEX_EXECUTABLE CACHE)
|
||||
if (NOT DEFINED 3RDPARTY_FLEX_EXECUTABLE)
|
||||
set (3RDPARTY_FLEX_EXECUTABLE "" CACHE FILEPATH "The Path to the flex command")
|
||||
endif()
|
||||
|
||||
# Add paths to 3rdparty subfolders containing name "flex" to CMAKE_PROGRAM_PATH variable to make
|
||||
# these paths searhed by find_package
|
||||
if (3RDPARTY_DIR)
|
||||
file (GLOB FLEX_PATHS LIST_DIRECTORIES true "${3RDPARTY_DIR}/*flex*")
|
||||
foreach (candidate_path ${FLEX_PATHS})
|
||||
if (IS_DIRECTORY ${candidate_path})
|
||||
list (APPEND CMAKE_PROGRAM_PATH ${candidate_path})
|
||||
endif()
|
||||
endforeach()
|
||||
# FLEX_EXECUTABLE is required by FLEX_TARGET macro and should be defined
|
||||
set (FLEX_EXECUTABLE "${3RDPARTY_FLEX_EXECUTABLE}" CACHE FILEPATH "path to the flex executable" FORCE)
|
||||
|
||||
find_package (FLEX)
|
||||
|
||||
if (FLEX_FOUND)
|
||||
set (3RDPARTY_FLEX_EXECUTABLE "${FLEX_EXECUTABLE}" CACHE FILEPATH "The Path to the flex command" FORCE)
|
||||
endif()
|
||||
|
||||
find_package (FLEX 2.5.3)
|
||||
|
||||
if (NOT FLEX_FOUND OR NOT FLEX_EXECUTABLE OR NOT EXISTS "${FLEX_EXECUTABLE}")
|
||||
list (APPEND 3RDPARTY_NOT_INCLUDED FLEX_EXECUTABLE)
|
||||
if (NOT 3RDPARTY_FLEX_EXECUTABLE OR NOT EXISTS "${3RDPARTY_FLEX_EXECUTABLE}")
|
||||
list (APPEND 3RDPARTY_NOT_INCLUDED 3RDPARTY_FLEX_EXECUTABLE)
|
||||
endif()
|
@@ -111,31 +111,34 @@ elseif (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMP
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
|
||||
if (APPLE)
|
||||
# CLang can be used with both libstdc++ and libc++, however on OS X libstdc++ is outdated.
|
||||
set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ ${CMAKE_CXX_FLAGS}")
|
||||
elseif(NOT WIN32)
|
||||
# CLang for Windows (at least CLang 8.0 distributed with VS 2019)
|
||||
# does not support option "-std=c++0x"
|
||||
set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
|
||||
if(MINGW)
|
||||
# Set default release optimization option to O2 instead of O3, since in
|
||||
# some OCCT related examples, this gives significantly smaller binaries
|
||||
# at comparable performace with MinGW-w64.
|
||||
string (REGEX MATCH "-O3" IS_O3_CXX "${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
if (IS_O3_CXX)
|
||||
string (REGEX REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
|
||||
else()
|
||||
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
|
||||
endif()
|
||||
# Optimize size of binaries
|
||||
set (CMAKE_SHARED_LINKER_FLAGS "-Wl,-s ${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
elseif(MINGW)
|
||||
|
||||
set (CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}")
|
||||
add_definitions(-D_WIN32_WINNT=0x0501)
|
||||
# workaround bugs in mingw with vtable export
|
||||
set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")
|
||||
|
||||
# Require C++11
|
||||
set (CMAKE_CXX_FLAGS "-std=gnu++0x ${CMAKE_CXX_FLAGS}")
|
||||
# Optimize size of binaries
|
||||
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
|
||||
set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
|
||||
elseif ("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang")
|
||||
if (APPLE)
|
||||
# CLang can be used with both libstdc++ and libc++, however on OS X libstdc++ is outdated.
|
||||
set (CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++ ${CMAKE_CXX_FLAGS}")
|
||||
else()
|
||||
set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
|
||||
endif()
|
||||
elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX)
|
||||
# Require C++11
|
||||
set (CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
|
||||
# Optimize size of binaries
|
||||
endif()
|
||||
|
||||
# Optimize size of binaries
|
||||
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR MINGW)
|
||||
set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
|
||||
set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
|
||||
endif()
|
||||
|
@@ -57,110 +57,117 @@ foreach (OCCT_PACKAGE ${USED_PACKAGES})
|
||||
set (OCCT_PACKAGE_NAME "${OCCT_PACKAGE}")
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE_NAME}_DLL")
|
||||
endif()
|
||||
|
||||
set (SOURCE_FILES)
|
||||
set (HEADER_FILES)
|
||||
|
||||
# Generate Flex and Bison files
|
||||
if (${BUILD_YACCLEX})
|
||||
# flex files
|
||||
OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX)
|
||||
list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN)
|
||||
|
||||
# bison files
|
||||
OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON)
|
||||
list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN)
|
||||
|
||||
if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0)
|
||||
|
||||
list (SORT SOURCE_FILES_FLEX)
|
||||
list (SORT SOURCE_FILES_BISON)
|
||||
|
||||
math (EXPR SOURCE_FILES_FLEX_LEN "${SOURCE_FILES_FLEX_LEN} - 1")
|
||||
foreach (FLEX_FILE_INDEX RANGE ${SOURCE_FILES_FLEX_LEN})
|
||||
|
||||
list (GET SOURCE_FILES_FLEX ${FLEX_FILE_INDEX} CURRENT_FLEX_FILE)
|
||||
get_filename_component (CURRENT_FLEX_FILE_NAME ${CURRENT_FLEX_FILE} NAME_WE)
|
||||
|
||||
list (GET SOURCE_FILES_BISON ${FLEX_FILE_INDEX} CURRENT_BISON_FILE)
|
||||
get_filename_component (CURRENT_BISON_FILE_NAME ${CURRENT_BISON_FILE} NAME_WE)
|
||||
|
||||
string (COMPARE EQUAL ${CURRENT_FLEX_FILE_NAME} ${CURRENT_BISON_FILE_NAME} ARE_FILES_EQUAL)
|
||||
|
||||
if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL})
|
||||
set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.c)
|
||||
set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.c)
|
||||
BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${BISON_OUTPUT_FILE} COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME} -l")
|
||||
FLEX_TARGET (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${FLEX_OUTPUT_FILE} COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME} -L")
|
||||
ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME})
|
||||
|
||||
list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE})
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# header files
|
||||
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES")
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h")
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
|
||||
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
|
||||
if(APPLE)
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
|
||||
endif()
|
||||
# TKService contains platform-dependent packages: Xw and WNT
|
||||
if ((WIN32 AND "${OCCT_PACKAGE}" STREQUAL "Xw") OR (NOT WIN32 AND "${OCCT_PACKAGE}" STREQUAL "WNT"))
|
||||
# do nothing
|
||||
else()
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h")
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
|
||||
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
|
||||
if (WIN32)
|
||||
list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE_NAME}_DLL")
|
||||
endif()
|
||||
|
||||
set (SOURCE_FILES)
|
||||
set (HEADER_FILES)
|
||||
|
||||
# Generate Flex and Bison files
|
||||
if (${BUILD_YACCLEX})
|
||||
|
||||
# flex files
|
||||
OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX)
|
||||
list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN)
|
||||
|
||||
# bison files
|
||||
OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON)
|
||||
list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN)
|
||||
|
||||
if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0)
|
||||
|
||||
list (SORT SOURCE_FILES_FLEX)
|
||||
list (SORT SOURCE_FILES_BISON)
|
||||
|
||||
math (EXPR SOURCE_FILES_FLEX_LEN "${SOURCE_FILES_FLEX_LEN} - 1")
|
||||
foreach (FLEX_FILE_INDEX RANGE ${SOURCE_FILES_FLEX_LEN})
|
||||
|
||||
list (GET SOURCE_FILES_FLEX ${FLEX_FILE_INDEX} CURRENT_FLEX_FILE)
|
||||
get_filename_component (CURRENT_FLEX_FILE_NAME ${CURRENT_FLEX_FILE} NAME_WE)
|
||||
|
||||
list (GET SOURCE_FILES_BISON ${FLEX_FILE_INDEX} CURRENT_BISON_FILE)
|
||||
get_filename_component (CURRENT_BISON_FILE_NAME ${CURRENT_BISON_FILE} NAME_WE)
|
||||
|
||||
string (COMPARE EQUAL ${CURRENT_FLEX_FILE_NAME} ${CURRENT_BISON_FILE_NAME} ARE_FILES_EQUAL)
|
||||
|
||||
if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL})
|
||||
set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.c)
|
||||
set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.c)
|
||||
BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${BISON_OUTPUT_FILE} COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME}")
|
||||
FLEX_TARGET (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${FLEX_OUTPUT_FILE} COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME}")
|
||||
ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME})
|
||||
|
||||
list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE})
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# header files
|
||||
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES")
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h")
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
|
||||
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
|
||||
if(APPLE)
|
||||
file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
|
||||
endif()
|
||||
else()
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h")
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx")
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx")
|
||||
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c")
|
||||
if(APPLE)
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
list (APPEND HEADER_FILES ${HEADER_FILES_M} ${HEADER_FILES_LXX} ${SOURCE_FILES_GXX})
|
||||
list (APPEND SOURCE_FILES ${SOURCE_FILES_C})
|
||||
if(APPLE)
|
||||
file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm")
|
||||
list (APPEND SOURCE_FILES ${SOURCE_FILES_M})
|
||||
endif()
|
||||
|
||||
foreach(HEADER_FILE ${HEADER_FILES})
|
||||
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
list (APPEND USED_INCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
else()
|
||||
list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
foreach(SOURCE_FILE ${SOURCE_FILES})
|
||||
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
list (APPEND USED_SRCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
else()
|
||||
list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if (USE_QT)
|
||||
FIND_AND_INSTALL_QT_RESOURCES (${OCCT_PACKAGE} RESOURCE_FILES)
|
||||
#message("Qt Resource files are: ${QT_RESOURCE_FILES} in ${OCCT_PACKAGE}")
|
||||
endif(USE_QT)
|
||||
|
||||
#message("Resource files are: ${RESOURCE_FILES} in ${OCCT_PACKAGE}")
|
||||
foreach(RESOURCE_FILE ${RESOURCE_FILES})
|
||||
SOURCE_GROUP ("Resource Files\\${OCCT_PACKAGE_NAME}" FILES "${RESOURCE_FILE}")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
list (APPEND HEADER_FILES ${HEADER_FILES_M} ${HEADER_FILES_LXX} ${SOURCE_FILES_GXX})
|
||||
list (APPEND SOURCE_FILES ${SOURCE_FILES_C})
|
||||
if(APPLE)
|
||||
list (APPEND SOURCE_FILES ${SOURCE_FILES_M})
|
||||
endif()
|
||||
|
||||
foreach(HEADER_FILE ${HEADER_FILES})
|
||||
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
list (APPEND USED_INCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
else()
|
||||
list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
foreach(SOURCE_FILE ${SOURCE_FILES})
|
||||
if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
list (APPEND USED_SRCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
else()
|
||||
list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if (USE_QT)
|
||||
FIND_AND_INSTALL_QT_RESOURCES (${OCCT_PACKAGE} RESOURCE_FILES)
|
||||
#message("Qt Resource files are: ${QT_RESOURCE_FILES} in ${OCCT_PACKAGE}")
|
||||
endif(USE_QT)
|
||||
|
||||
#message("Resource files are: ${RESOURCE_FILES} in ${OCCT_PACKAGE}")
|
||||
foreach(RESOURCE_FILE ${RESOURCE_FILES})
|
||||
SOURCE_GROUP ("Resource Files\\${OCCT_PACKAGE_NAME}" FILES "${RESOURCE_FILE}")
|
||||
endforeach()
|
||||
endforeach()
|
||||
string (REGEX REPLACE ";" " " PRECOMPILED_DEFS "${PRECOMPILED_DEFS}")
|
||||
|
||||
@@ -323,7 +330,7 @@ endif()
|
||||
|
||||
# Update list of used VTK libraries if OpenGL2 Rendering BackEnd is used.
|
||||
# Add VTK_OPENGL2_BACKEND definition.
|
||||
if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2" OR IS_VTK_9XX)
|
||||
if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2")
|
||||
add_definitions(-DVTK_OPENGL2_BACKEND)
|
||||
foreach (VTK_EXCLUDE_LIBRARY vtkRenderingOpenGL vtkRenderingFreeTypeOpenGL)
|
||||
list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "${VTK_EXCLUDE_LIBRARY}" IS_VTK_OPENGL_FOUND)
|
||||
@@ -347,9 +354,6 @@ else()
|
||||
endif()
|
||||
|
||||
if (BUILD_SHARED_LIBS)
|
||||
if(IS_VTK_9XX)
|
||||
string (REGEX REPLACE "vtk" "VTK::" USED_TOOLKITS_BY_CURRENT_PROJECT "${USED_TOOLKITS_BY_CURRENT_PROJECT}")
|
||||
endif()
|
||||
target_link_libraries (${PROJECT_NAME} ${USED_TOOLKITS_BY_CURRENT_PROJECT} ${USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT})
|
||||
endif()
|
||||
|
||||
|
@@ -7,8 +7,7 @@ if (NOT DEFINED ${3RDPARTY_QT_DIR} AND ${3RDPARTY_QT_DIR} STREQUAL "")
|
||||
FIND_PRODUCT_DIR ("${3RDPARTY_DIR}" Qt 3RDPARTY_QT_DIR_NAME)
|
||||
|
||||
if (NOT DEFINED ${3RDPARTY_QT_DIR_NAME} AND ${3RDPARTY_QT_DIR_NAME} STREQUAL "")
|
||||
set (3RDPARTY_QT_DIR "" CACHE PATH "The directory containing qt")
|
||||
message (FATAL_ERROR "Could not find used third-party product: 3RDPARTY_QT_DIR")
|
||||
message (FATAL_ERROR "... Qt root directory was not found")
|
||||
endif()
|
||||
|
||||
# Combine directory name with absolute path and show in GUI
|
||||
@@ -33,9 +32,3 @@ if (NOT ${Qt5_FOUND})
|
||||
else()
|
||||
#message (STATUS "Qt5 cmake configuration")
|
||||
endif()
|
||||
|
||||
if (3RDPARTY_QT_DIR OR EXISTS "${3RDPARTY_QT_DIR}")
|
||||
list (APPEND 3RDPARTY_DLL_DIRS "${3RDPARTY_QT_DIR}/bin")
|
||||
else()
|
||||
list (APPEND 3RDPARTY_NO_DLLS 3RDPARTY_QT_DLL_DIR)
|
||||
endif()
|
||||
|
@@ -66,15 +66,10 @@ if (3RDPARTY_VTK_DIR AND EXISTS "${3RDPARTY_VTK_DIR}")
|
||||
set (ENV{VTK_DIR} ${CACHED_VTK_DIR})
|
||||
endif()
|
||||
|
||||
unset (IS_VTK_9XX)
|
||||
if (VTK_FOUND)
|
||||
message ("VTK version (${VTK_VERSION})")
|
||||
if(VTK_MAJOR_VERSION EQUAL 8 AND VTK_MINOR_VERSION GREATER 9 OR VTK_MAJOR_VERSION GREATER 8)
|
||||
set (IS_VTK_9XX 1)
|
||||
else()
|
||||
# add compiler flags, preprocessor definitions, include and link dirs
|
||||
include (${VTK_USE_FILE})
|
||||
endif()
|
||||
|
||||
# add compiler flags, preprocessor definitions, include and link dirs
|
||||
include (${VTK_USE_FILE})
|
||||
|
||||
if (VTK_LIBRARIES)
|
||||
|
||||
@@ -86,83 +81,79 @@ if (VTK_FOUND)
|
||||
# endif()
|
||||
|
||||
foreach (VTK_LIBRARY ${VTK_LIBRARIES})
|
||||
if (IS_VTK_9XX)
|
||||
string (REGEX MATCH "^VTK::" IS_VTK_LIBRARY ${VTK_LIBRARY})
|
||||
else()
|
||||
string (REGEX MATCH "^vtk" IS_VTK_LIBRARY ${VTK_LIBRARY})
|
||||
endif()
|
||||
if (NOT IS_VTK_LIBRARY OR NOT TARGET ${VTK_LIBRARY})
|
||||
continue()
|
||||
endif()
|
||||
|
||||
# get paths from corresponding variables
|
||||
if (${VTK_LIBRARY}_INCLUDE_DIRS AND EXISTS "${${VTK_LIBRARY}_INCLUDE_DIRS}")
|
||||
list (APPEND 3RDPARTY_VTK_INCLUDE_DIRS "${${VTK_LIBRARY}_INCLUDE_DIRS}")
|
||||
endif()
|
||||
|
||||
if (${VTK_LIBRARY}_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_LIBRARY_DIRS}")
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_LIBRARY_DIRS}")
|
||||
endif()
|
||||
|
||||
if (${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}")
|
||||
list (APPEND 3RDPARTY_VTK_DLL_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}")
|
||||
if (NOT WIN32)
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}")
|
||||
string (REGEX MATCH "^vtk" IS_VTK_LIBRARY ${VTK_LIBRARY})
|
||||
if (IS_VTK_LIBRARY AND TARGET ${VTK_LIBRARY})
|
||||
# get paths from corresponding variables
|
||||
if (${VTK_LIBRARY}_INCLUDE_DIRS AND EXISTS "${${VTK_LIBRARY}_INCLUDE_DIRS}")
|
||||
list (APPEND 3RDPARTY_VTK_INCLUDE_DIRS "${${VTK_LIBRARY}_INCLUDE_DIRS}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# get paths from corresponding properties
|
||||
get_target_property (TARGET_VTK_IMPORT_CONFS ${VTK_LIBRARY} IMPORTED_CONFIGURATIONS)
|
||||
if (TARGET_VTK_IMPORT_CONFS)
|
||||
list (GET TARGET_VTK_IMPORT_CONFS 0 CHOSEN_IMPORT_CONF)
|
||||
|
||||
# todo: choose configuration in connection with the build type
|
||||
#if (CMAKE_BUILD_TYPE)
|
||||
# foreach (IMPORT_CONF ${TARGET_VTK_IMPORT_CONFS})
|
||||
# endforeach()
|
||||
#endif()
|
||||
|
||||
# Work-around against link failure in case if VTK contains dependency
|
||||
# on DirectX: its run-time is always present on Windows, but SDK can
|
||||
# be absent on current workstation, while not actually needed for
|
||||
# OCCT linking.
|
||||
# VTK 6.1 for VC 10
|
||||
get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF})
|
||||
if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES)
|
||||
string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
if (HARDCODED_D3D9_LIB)
|
||||
message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}")
|
||||
|
||||
list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB})
|
||||
set_target_properties (${VTK_LIBRARY} PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF} "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
if (${VTK_LIBRARY}_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_LIBRARY_DIRS}")
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_LIBRARY_DIRS}")
|
||||
endif()
|
||||
endif()
|
||||
# VTK 6.1 for VC 12, 14
|
||||
get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} INTERFACE_LINK_LIBRARIES)
|
||||
if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES)
|
||||
string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
if (HARDCODED_D3D9_LIB)
|
||||
message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}")
|
||||
|
||||
list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB})
|
||||
set_target_properties (${VTK_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
if (${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS AND EXISTS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}")
|
||||
list (APPEND 3RDPARTY_VTK_DLL_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}")
|
||||
if (NOT WIN32)
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${${VTK_LIBRARY}_RUNTIME_LIBRARY_DIRS}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
get_target_property (TARGET_PROPERTY_IMP_PATH ${VTK_LIBRARY} IMPORTED_IMPLIB_${CHOSEN_IMPORT_CONF})
|
||||
if(TARGET_PROPERTY_IMP_PATH AND EXISTS "${TARGET_PROPERTY_IMP_PATH}")
|
||||
get_filename_component (TARGET_PROPERTY_IMP_DIR "${TARGET_PROPERTY_IMP_PATH}" PATH)
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_IMP_DIR}")
|
||||
endif()
|
||||
# get paths from corresponding properties
|
||||
get_target_property (TARGET_VTK_IMPORT_CONFS ${VTK_LIBRARY} IMPORTED_CONFIGURATIONS)
|
||||
|
||||
get_target_property (TARGET_PROPERTY_LOCATION_PATH ${VTK_LIBRARY} IMPORTED_LOCATION_${CHOSEN_IMPORT_CONF})
|
||||
if(TARGET_PROPERTY_LOCATION_PATH AND EXISTS "${TARGET_PROPERTY_LOCATION_PATH}")
|
||||
get_filename_component (TARGET_PROPERTY_LOCATION_DIR "${TARGET_PROPERTY_LOCATION_PATH}" PATH)
|
||||
if (TARGET_VTK_IMPORT_CONFS)
|
||||
list (GET TARGET_VTK_IMPORT_CONFS 0 CHOSEN_IMPORT_CONF)
|
||||
|
||||
if (WIN32)
|
||||
list (APPEND 3RDPARTY_VTK_DLL_DIRS "${TARGET_PROPERTY_LOCATION_DIR}")
|
||||
else()
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_LOCATION_DIR}")
|
||||
# todo: choose configuration in connection with the build type
|
||||
#if (CMAKE_BUILD_TYPE)
|
||||
# foreach (IMPORT_CONF ${TARGET_VTK_IMPORT_CONFS})
|
||||
# endforeach()
|
||||
#endif()
|
||||
|
||||
# Work-around against link failure in case if VTK contains dependency
|
||||
# on DirectX: its run-time is always present on Windows, but SDK can
|
||||
# be absent on current workstation, while not actually needed for
|
||||
# OCCT linking.
|
||||
# VTK 6.1 for VC 10
|
||||
get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF})
|
||||
if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES)
|
||||
string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
if (HARDCODED_D3D9_LIB)
|
||||
message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}")
|
||||
|
||||
list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB})
|
||||
set_target_properties (${VTK_LIBRARY} PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES_${CHOSEN_IMPORT_CONF} "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
# VTK 6.1 for VC 12, 14
|
||||
get_target_property (TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${VTK_LIBRARY} INTERFACE_LINK_LIBRARIES)
|
||||
if(TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES)
|
||||
string (REGEX MATCH "[^;]*d3d[0-9]+[.]lib" HARDCODED_D3D9_LIB "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
if (HARDCODED_D3D9_LIB)
|
||||
message (STATUS "Warning: ${HARDCODED_D3D9_LIB} has been removed from imported dependencies of ${VTK_LIBRARY}")
|
||||
|
||||
list (REMOVE_ITEM TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES ${HARDCODED_D3D9_LIB})
|
||||
set_target_properties (${VTK_LIBRARY} PROPERTIES INTERFACE_LINK_LIBRARIES "${TARGET_PROPERTY_IMP_LINK_INTERFACE_LIBRARIES}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
get_target_property (TARGET_PROPERTY_IMP_PATH ${VTK_LIBRARY} IMPORTED_IMPLIB_${CHOSEN_IMPORT_CONF})
|
||||
if(TARGET_PROPERTY_IMP_PATH AND EXISTS "${TARGET_PROPERTY_IMP_PATH}")
|
||||
get_filename_component (TARGET_PROPERTY_IMP_DIR "${TARGET_PROPERTY_IMP_PATH}" PATH)
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_IMP_DIR}")
|
||||
endif()
|
||||
|
||||
get_target_property (TARGET_PROPERTY_LOCATION_PATH ${VTK_LIBRARY} IMPORTED_LOCATION_${CHOSEN_IMPORT_CONF})
|
||||
if(TARGET_PROPERTY_LOCATION_PATH AND EXISTS "${TARGET_PROPERTY_LOCATION_PATH}")
|
||||
get_filename_component (TARGET_PROPERTY_LOCATION_DIR "${TARGET_PROPERTY_LOCATION_PATH}" PATH)
|
||||
|
||||
if (WIN32)
|
||||
list (APPEND 3RDPARTY_VTK_DLL_DIRS "${TARGET_PROPERTY_LOCATION_DIR}")
|
||||
else()
|
||||
list (APPEND 3RDPARTY_VTK_LIBRARY_DIRS "${TARGET_PROPERTY_LOCATION_DIR}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
@@ -196,7 +187,6 @@ if (VTK_FOUND)
|
||||
endif()
|
||||
endif()
|
||||
# endif()
|
||||
endif()
|
||||
|
||||
if (3RDPARTY_VTK_INCLUDE_DIR AND EXISTS "${3RDPARTY_VTK_INCLUDE_DIR}")
|
||||
list (APPEND 3RDPARTY_INCLUDE_DIRS ${3RDPARTY_VTK_INCLUDE_DIR})
|
||||
|
@@ -82,11 +82,6 @@ if { ! [catch {exec vswhere.exe -version "\[16.0,16.99\]" -latest -requires Micr
|
||||
lappend ::SYS_VC_LIST "vc142-uwp"
|
||||
lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat"
|
||||
}
|
||||
if { ! [catch {exec vswhere.exe -version "\[16.0,16.99\]" -latest -requires Microsoft.VisualStudio.Component.VC.ClangCL -property installationPath} res] } {
|
||||
lappend ::SYS_VS_LIST "Visual Studio 2019 (16, toolset ClangCL)"
|
||||
lappend ::SYS_VC_LIST "vclang"
|
||||
lappend ::SYS_VCVARS_LIST "$res\\VC\\vcvarsall.bat"
|
||||
}
|
||||
|
||||
# detect installed Visual Studio instances from global environment
|
||||
if { [info exists ::env(VS140COMNTOOLS)] } {
|
||||
@@ -187,9 +182,6 @@ proc wokdep:gui:UpdateList {} {
|
||||
if { "$::HAVE_FFMPEG" == "true" } {
|
||||
wokdep:SearchFFmpeg anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
if { "$::HAVE_OPENVR" == "true" } {
|
||||
wokdep:SearchOpenVR anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
if { "$::HAVE_TBB" == "true" } {
|
||||
wokdep:SearchTBB anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
@@ -201,11 +193,7 @@ proc wokdep:gui:UpdateList {} {
|
||||
}
|
||||
|
||||
if { "$::HAVE_ZLIB" == "true" } {
|
||||
set aCheckLib "z"
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
set aCheckLib "zlib"
|
||||
}
|
||||
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "zlib" "zlib.h" "$aCheckLib" {"zlib"}
|
||||
wokdep:SearchStandardLibrary anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs "zlib" "zlib.h" "zlib" {"zlib"}
|
||||
}
|
||||
if { "$::HAVE_LIBLZMA" == "true" } {
|
||||
set aCheckLib "lzma"
|
||||
@@ -226,14 +214,9 @@ proc wokdep:gui:UpdateList {} {
|
||||
wokdep:SearchRapidJson anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
|
||||
if {"$::BUILD_Inspector" == "true" } {
|
||||
set ::CHECK_QT "true"
|
||||
if { "$::CHECK_QT4" == "true" } {
|
||||
wokdep:SearchQt4 anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
|
||||
if { "$::CHECK_QT" == "true" } {
|
||||
wokdep:SearchQt anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
|
||||
if { "$::CHECK_JDK" == "true" } {
|
||||
wokdep:SearchJDK anIncErrs anLib32Errs anLib64Errs anBin32Errs anBin64Errs
|
||||
}
|
||||
@@ -475,8 +458,6 @@ checkbutton .myFrame.myChecks.myFImageCheck -offvalue "false" -onvalue "true
|
||||
ttk::label .myFrame.myChecks.myFImageLbl -text "Use FreeImage"
|
||||
checkbutton .myFrame.myChecks.myTbbCheck -offvalue "false" -onvalue "true" -variable HAVE_TBB -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myTbbLbl -text "Use Intel TBB"
|
||||
checkbutton .myFrame.myChecks.myOpenVrCheck -offvalue "false" -onvalue "true" -variable HAVE_OPENVR -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myOpenVrLbl -text "Use OpenVR"
|
||||
if { "$::tcl_platform(os)" != "Darwin" } {
|
||||
checkbutton .myFrame.myChecks.myGlesCheck -offvalue "false" -onvalue "true" -variable HAVE_GLES2 -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myGlesLbl -text "Use OpenGL ES"
|
||||
@@ -504,16 +485,11 @@ ttk::label .myFrame.myChecks.myLzmaLbl -text "Use liblzma"
|
||||
checkbutton .myFrame.myChecks.myE57Check -offvalue "false" -onvalue "true" -variable HAVE_E57 -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myE57Lbl -text "Use E57"
|
||||
|
||||
checkbutton .myFrame.myChecks.myQtCheck -offvalue "false" -onvalue "true" -variable CHECK_QT -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myQtLbl -text "Search Qt"
|
||||
checkbutton .myFrame.myChecks.myQt4Check -offvalue "false" -onvalue "true" -variable CHECK_QT4 -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myQt4Lbl -text "Search Qt4"
|
||||
checkbutton .myFrame.myChecks.myJDKCheck -offvalue "false" -onvalue "true" -variable CHECK_JDK -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myJDKLbl -text "Search JDK"
|
||||
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
checkbutton .myFrame.myChecks.myInspectorBuild -offvalue "false" -onvalue "true" -variable BUILD_Inspector -command wokdep:gui:UpdateList
|
||||
ttk::label .myFrame.myChecks.myInspectorLbl -text "Build Inspector"
|
||||
}
|
||||
|
||||
# Additional headers search paths
|
||||
ttk::label .myFrame.myIncLbl -text "Additional headers search paths:" -padding {5 5 80 5}
|
||||
scrollbar .myFrame.myIncScrl -command ".myFrame.myIncList yview"
|
||||
@@ -617,8 +593,8 @@ if { "$::tcl_platform(os)" != "Darwin" } {
|
||||
grid .myFrame.myChecks.myZLibCheck -row $aCheckRowIter -column 6 -sticky e
|
||||
grid .myFrame.myChecks.myZLibLbl -row $aCheckRowIter -column 7 -sticky w
|
||||
|
||||
grid .myFrame.myChecks.myQtCheck -row $aCheckRowIter -column 12 -sticky e
|
||||
grid .myFrame.myChecks.myQtLbl -row $aCheckRowIter -column 13 -sticky w
|
||||
grid .myFrame.myChecks.myQt4Check -row $aCheckRowIter -column 12 -sticky e
|
||||
grid .myFrame.myChecks.myQt4Lbl -row $aCheckRowIter -column 13 -sticky w
|
||||
|
||||
incr aCheckRowIter
|
||||
grid .myFrame.myChecks.myFFmpegCheck -row $aCheckRowIter -column 0 -sticky e
|
||||
@@ -640,16 +616,9 @@ grid .myFrame.myChecks.myJDKLbl -row $aCheckRowIter -column 13 -sticky w
|
||||
incr aCheckRowIter
|
||||
grid .myFrame.myChecks.myRapidJsonCheck -row $aCheckRowIter -column 0 -sticky e
|
||||
grid .myFrame.myChecks.myRapidJsonLbl -row $aCheckRowIter -column 1 -sticky w
|
||||
grid .myFrame.myChecks.myOpenVrCheck -row $aCheckRowIter -column 4 -sticky e
|
||||
grid .myFrame.myChecks.myOpenVrLbl -row $aCheckRowIter -column 5 -sticky w
|
||||
grid .myFrame.myChecks.myE57Check -row $aCheckRowIter -column 6 -sticky e
|
||||
grid .myFrame.myChecks.myE57Lbl -row $aCheckRowIter -column 7 -sticky w
|
||||
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
grid .myFrame.myChecks.myInspectorBuild -row $aCheckRowIter -column 12 -sticky e
|
||||
grid .myFrame.myChecks.myInspectorLbl -row $aCheckRowIter -column 13 -sticky w
|
||||
}
|
||||
|
||||
incr aCheckRowIter
|
||||
|
||||
# Additional headers search paths
|
||||
|
@@ -68,7 +68,7 @@ if { [info exists ::env(SHORTCUT_HEADERS)] } {
|
||||
}
|
||||
|
||||
# fetch environment variables (e.g. set by custom.sh or custom.bat) and set them as tcl variables with the same name
|
||||
set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENVR HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo BUILD_Inspector}
|
||||
set THE_ENV_VARIABLES {HAVE_FREEIMAGE HAVE_FFMPEG HAVE_TBB HAVE_GLES2 HAVE_D3D HAVE_VTK HAVE_ZLIB HAVE_LIBLZMA HAVE_E57 HAVE_RAPIDJSON HAVE_OPENCL CHECK_QT4 CHECK_JDK MACOSX_USE_GLX HAVE_RelWithDebInfo}
|
||||
foreach anEnvIter $THE_ENV_VARIABLES {
|
||||
set ${anEnvIter} "false"
|
||||
if { [info exists ::env(${anEnvIter})] } {
|
||||
@@ -241,11 +241,7 @@ proc wokdep:Preferred {theList theCmpl theArch} {
|
||||
|
||||
# keep only two first digits in "vc141"
|
||||
if { ! [regexp {^vc[0-9][0-9]} $theCmpl aCmpl] } {
|
||||
if { [regexp {^vclang} $theCmpl] } {
|
||||
set aCmpl vc14
|
||||
} else {
|
||||
set aCmpl $theCmpl
|
||||
}
|
||||
set aCmpl $theCmpl
|
||||
}
|
||||
|
||||
set aShortList {}
|
||||
@@ -625,59 +621,6 @@ proc wokdep:SearchFFmpeg {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBi
|
||||
return "$isFound"
|
||||
}
|
||||
|
||||
# Search OpenVR SDK placement
|
||||
proc wokdep:SearchOpenVR {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} {
|
||||
upvar $theErrInc anErrInc
|
||||
upvar $theErrLib32 anErrLib32
|
||||
upvar $theErrLib64 anErrLib64
|
||||
upvar $theErrBin32 anErrBin32
|
||||
upvar $theErrBin64 anErrBin64
|
||||
|
||||
set isFound "true"
|
||||
set anOpenVrHPath [wokdep:SearchHeader "openvr.h"]
|
||||
if { "$anOpenVrHPath" == "" } {
|
||||
set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{openvr}*] "$::VCVER" "$::ARCH" ]
|
||||
if { "$aPath" != "" && [file exists "$aPath/include/openvr.h"] } {
|
||||
lappend ::CSF_OPT_INC "$aPath/include"
|
||||
} elseif { "$aPath" != "" && [file exists "$aPath/headers/openvr.h"] } {
|
||||
lappend ::CSF_OPT_INC "$aPath/headers"
|
||||
} else {
|
||||
lappend anErrInc "Error: 'openvr.h' not found (OpenVR)"
|
||||
set isFound "false"
|
||||
}
|
||||
}
|
||||
|
||||
set aPlatform "unknown"
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
set aPlatform "win"
|
||||
} elseif { "$::tcl_platform(os)" == "Darwin" } {
|
||||
set aPlatform "osx"
|
||||
} elseif { "$::tcl_platform(os)" == "Linux" } {
|
||||
set aPlatform "linux"
|
||||
}
|
||||
|
||||
foreach anArchIter {64 32} {
|
||||
set anOpenVrLibPath [wokdep:SearchLib "openvr_api" "$anArchIter"]
|
||||
if { "$anOpenVrLibPath" == "" } {
|
||||
set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{openvr}*] "$::VCVER" "$anArchIter" ]
|
||||
set anOpenVrLibPath [wokdep:SearchLib "openvr_api" "$anArchIter" "$aPath/lib/${aPlatform}${anArchIter}"]
|
||||
set anOpenVrLibPath2 [wokdep:SearchLib "openvr_api" "$anArchIter" "$aPath/lib"]
|
||||
if { "$anOpenVrLibPath" != "" } {
|
||||
lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib/${aPlatform}${anArchIter}"
|
||||
lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin/${aPlatform}${anArchIter}"
|
||||
} elseif { "$anOpenVrLibPath2" != "" } {
|
||||
lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib"
|
||||
lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin"
|
||||
} else {
|
||||
lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}openvr_api.${::SYS_LIB_SUFFIX}' not found (OpenVR)"
|
||||
if { "$::ARCH" == "$anArchIter"} { set isFound "false" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "$isFound"
|
||||
}
|
||||
|
||||
# Search TBB library placement
|
||||
proc wokdep:SearchTBB {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} {
|
||||
upvar $theErrInc anErrInc
|
||||
@@ -688,11 +631,7 @@ proc wokdep:SearchTBB {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64
|
||||
|
||||
# keep only two first digits in "vc141"
|
||||
if { ! [regexp {^vc[0-9][0-9]} ${::VCVER} aVcLib] } {
|
||||
if { [regexp {^vclang} ${::VCVER}] } {
|
||||
set aVcLib vc14
|
||||
} else {
|
||||
set aVcLib ${::VCVER}
|
||||
}
|
||||
set aVcLib ${::VCVER}
|
||||
}
|
||||
|
||||
set isFound "true"
|
||||
@@ -1075,8 +1014,8 @@ proc wokdep:SearchVTK {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64
|
||||
return "$isFound"
|
||||
}
|
||||
|
||||
# Search Qt libraries placement
|
||||
proc wokdep:SearchQt {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} {
|
||||
# Search Qt4 libraries placement
|
||||
proc wokdep:SearchQt4 {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64} {
|
||||
upvar $theErrInc anErrInc
|
||||
upvar $theErrLib32 anErrLib32
|
||||
upvar $theErrLib64 anErrLib64
|
||||
@@ -1084,46 +1023,53 @@ proc wokdep:SearchQt {theErrInc theErrLib32 theErrLib64 theErrBin32 theErrBin64}
|
||||
upvar $theErrBin64 anErrBin64
|
||||
|
||||
set isFound "true"
|
||||
set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt}*] "$::VCVER" "$::ARCH" ]
|
||||
set aQMsgBoxHPath [wokdep:SearchHeader "QtGui/qguiapplication.h"]
|
||||
set aQMsgBoxHPath [wokdep:SearchHeader "QtGui/qmessagebox.h"]
|
||||
if { "$aQMsgBoxHPath" == "" } {
|
||||
if { "$aPath" != "" && [file exists "$aPath/include/QtGui/qguiapplication.h"] } {
|
||||
set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$::ARCH" ]
|
||||
if { "$aPath" != "" && [file exists "$aPath/include/QtGui/qmessagebox.h"] } {
|
||||
lappend ::CSF_OPT_INC "$aPath/include"
|
||||
lappend ::CSF_OPT_INC "$aPath/include/Qt"
|
||||
lappend ::CSF_OPT_INC "$aPath/include/QtGui"
|
||||
lappend ::CSF_OPT_INC "$aPath/include/QtCore"
|
||||
lappend ::CSF_OPT_INC "$aPath/include/QtWidgets"
|
||||
lappend ::CSF_OPT_INC "$aPath/include/QtXml"
|
||||
} else {
|
||||
lappend anErrInc "Error: 'QtGui/qguiapplication.h' not found"
|
||||
if { [file exists "/usr/include/qt4/QtGui/qmessagebox.h"] } {
|
||||
lappend ::CSF_OPT_INC "/usr/include/qt4"
|
||||
lappend ::CSF_OPT_INC "/usr/include/qt4/Qt"
|
||||
lappend ::CSF_OPT_INC "/usr/include/qt4/QtGui"
|
||||
lappend ::CSF_OPT_INC "/usr/include/qt4/QtCore"
|
||||
} else {
|
||||
lappend anErrInc "Error: 'QtGui/qmessagebox.h' not found (Qt4)"
|
||||
set isFound "false"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set aQtGuiLibName "QtGui"
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
set aQtGuiLibName "Qt5Gui"
|
||||
set aQtGuiLibName "QtGui4"
|
||||
}
|
||||
|
||||
foreach anArchIter {64 32} {
|
||||
set aQMsgBoxLibPath [wokdep:SearchLib "${aQtGuiLibName}" "$anArchIter"]
|
||||
if { "$aQMsgBoxLibPath" == "" } {
|
||||
set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$anArchIter" ]
|
||||
set aQMsgBoxLibPath [wokdep:SearchLib "${aQtGuiLibName}" "$anArchIter" "$aPath/lib"]
|
||||
if { "$aQMsgBoxLibPath" != "" } {
|
||||
lappend ::CSF_OPT_LIB$anArchIter "$aPath/lib"
|
||||
} else {
|
||||
lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aQtGuiLibName}.${::SYS_LIB_SUFFIX}' not found (Qt)"
|
||||
lappend anErrLib$anArchIter "Error: '${::SYS_LIB_PREFIX}${aQtGuiLibName}.${::SYS_LIB_SUFFIX}' not found (Qt4)"
|
||||
if { "$::ARCH" == "$anArchIter"} { set isFound "false" }
|
||||
}
|
||||
}
|
||||
if { "$::tcl_platform(platform)" == "windows" } {
|
||||
set aQMsgBoxDllPath [wokdep:SearchBin "${aQtGuiLibName}.dll" "$anArchIter"]
|
||||
set aQMsgBoxDllPath [wokdep:SearchBin "QtGui4.dll" "$anArchIter"]
|
||||
if { "$aQMsgBoxDllPath" == "" } {
|
||||
set aQMsgBoxDllPath [wokdep:SearchBin "${aQtGuiLibName}.dll" "$anArchIter" "$aPath/bin"]
|
||||
set aPath [wokdep:Preferred [glob -nocomplain -directory "$::PRODUCTS_PATH" -type d *{qt4}*] "$::VCVER" "$anArchIter" ]
|
||||
set aQMsgBoxDllPath [wokdep:SearchBin "QtGui4.dll" "$anArchIter" "$aPath/bin"]
|
||||
if { "$aQMsgBoxDllPath" != "" } {
|
||||
lappend ::CSF_OPT_BIN$anArchIter "$aPath/bin"
|
||||
} else {
|
||||
lappend anErrBin$anArchIter "Error: '${aQtGuiLibName}.dll' not found (Qt)"
|
||||
lappend anErrBin$anArchIter "Error: 'QtGui4.dll' not found (Qt4)"
|
||||
if { "$::ARCH" == "$anArchIter"} { set isFound "false" }
|
||||
}
|
||||
}
|
||||
|
564
adm/genproj.tcl
2
adm/scripts/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
*custom.bat
|
||||
*custom.sh
|
@@ -1,234 +0,0 @@
|
||||
@echo OFF
|
||||
|
||||
rem Auxiliary script for semi-automated building of OCCT for Android platform.
|
||||
rem android_custom.bat should be configured with paths
|
||||
rem to CMake, 3rd-parties, Android NDK and MinGW make tool.
|
||||
|
||||
set "aCasSrc=%~dp0..\.."
|
||||
set "aBuildRoot=%aCasSrc%\work"
|
||||
|
||||
set aNbJobs=%NUMBER_OF_PROCESSORS%
|
||||
|
||||
rem Paths to 3rd-party tools and libraries
|
||||
set "anNdkPath="
|
||||
set "aFreeType="
|
||||
set "aRapidJson="
|
||||
|
||||
rem Build stages to perform
|
||||
set "toCMake=1"
|
||||
set "toClean=0"
|
||||
set "toMake=1"
|
||||
set "toInstall=1"
|
||||
set "toPack=1"
|
||||
set "isStatic=0"
|
||||
|
||||
rem Minimal Android platform and CPU architectures
|
||||
set "anNdkApiLevel=21"
|
||||
set "anNdkAbiList=armeabi-v7a x86 arm64-v8a x86_64"
|
||||
|
||||
rem OCCT Modules to build
|
||||
set "BUILD_ModelingData=ON"
|
||||
set "BUILD_ModelingAlgorithms=ON"
|
||||
set "BUILD_Visualization=ON"
|
||||
set "BUILD_ApplicationFramework=ON"
|
||||
set "BUILD_DataExchange=ON"
|
||||
|
||||
rem Optional 3rd-party libraries to enable
|
||||
set USE_RAPIDJSON=OFF
|
||||
|
||||
rem Archive tool
|
||||
set "THE_7Z_PARAMS=-t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on"
|
||||
set "THE_7Z_PATH=%ProgramW6432%\7-Zip\7z.exe"
|
||||
|
||||
rem Configuration file
|
||||
if exist "%~dp0android_custom.bat" call "%~dp0android_custom.bat"
|
||||
|
||||
set "aCompiler=gcc"
|
||||
set "aCppLib=gnustl_shared"
|
||||
if not exist "%anNdkPath%/sources/cxx-stl/gnu-libstdc++" (
|
||||
if exist "%anNdkPath%/sources/cxx-stl/llvm-libc++" (
|
||||
set "aCompiler=clang"
|
||||
set "aCppLib=c++_shared"
|
||||
)
|
||||
)
|
||||
set "aLibType=Shared"
|
||||
if ["%isStatic%"] == ["1"] set "aLibType=Static"
|
||||
set "aDestDir=%aBuildRoot%\android-%aCompiler%"
|
||||
|
||||
set "anOcctVerSuffix="
|
||||
set "anOcctVersion=0.0.0"
|
||||
set "aGitBranch="
|
||||
for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_DEVELOPMENT" "%aCasSrc%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVerSuffix=%%i" )
|
||||
for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_COMPLETE" "%aCasSrc%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVersion=%%i" )
|
||||
for /f %%i in ('git symbolic-ref --short HEAD') do ( set "aGitBranch=%%i" )
|
||||
|
||||
for %%s in (%anNdkAbiList%) do (
|
||||
call :cmakeGenerate "%anNdkApiLevel%" "%%s"
|
||||
)
|
||||
|
||||
for /F "skip=1 delims=" %%F in ('
|
||||
wmic PATH Win32_LocalTime GET Day^,Month^,Year /FORMAT:TABLE
|
||||
') do (
|
||||
for /F "tokens=1-3" %%L in ("%%F") do (
|
||||
set DAY00=0%%L
|
||||
set MONTH00=0%%M
|
||||
set YEAR=%%N
|
||||
)
|
||||
)
|
||||
set DAY00=%DAY00:~-2%
|
||||
set MONTH00=%MONTH00:~-2%
|
||||
set "aRevision=-%YEAR%-%MONTH00%-%DAY00%"
|
||||
rem set "aRevision=-%aGitBranch%"
|
||||
set "anArchName=occt-%anOcctVersion%%anOcctVerSuffix%%aRevision%-android"
|
||||
set "aTarget=%aBuildRoot%\%anArchName%"
|
||||
if ["%toPack%"] == ["1"] (
|
||||
echo Creating archive %anArchName%.7z
|
||||
rmdir /S /Q "%aTarget%"
|
||||
if not exist "%aTarget%" ( mkdir "%aTarget%" )
|
||||
if exist "%aBuildRoot%/%anArchName%.7z" del "%aBuildRoot%/%anArchName%.7z"
|
||||
xcopy /S /Y "%aDestDir%\*" "%aTarget%\"
|
||||
|
||||
"%THE_7Z_PATH%" a -r %THE_7Z_PARAMS% "%aBuildRoot%/%anArchName%.7z" "%aTarget%"
|
||||
)
|
||||
if not ["%1"] == ["-nopause"] (
|
||||
pause
|
||||
)
|
||||
|
||||
goto :eof
|
||||
|
||||
:cmakeGenerate
|
||||
set "anApi=%~1"
|
||||
set "anAbi=%~2"
|
||||
set "aPlatformAndCompiler=android-%anAbi%-%aCompiler%"
|
||||
set "aWorkDir=%aBuildRoot%\%aPlatformAndCompiler%-make"
|
||||
set "aLogFile=%aBuildRoot%\build-%aPlatformAndCompiler%.log"
|
||||
if not exist "%aWorkDir%" ( mkdir "%aWorkDir%" )
|
||||
if exist "%aLogFile%" ( del "%aLogFile%" )
|
||||
|
||||
rem include some information about OCCT into archive
|
||||
echo ^<pre^>> "%aWorkDir%\VERSION.html"
|
||||
git status >> "%aWorkDir%\VERSION.html"
|
||||
git log -n 100 >> "%aWorkDir%\VERSION.html"
|
||||
echo ^</pre^>>> "%aWorkDir%\VERSION.html"
|
||||
|
||||
echo Start building OCCT for %aPlatformAndCompiler%
|
||||
echo Start building OCCT for %aPlatformAndCompiler%>> %aLogFile%
|
||||
|
||||
pushd "%aWorkDir%"
|
||||
|
||||
set "aTimeZERO=%TIME%"
|
||||
if ["%toCMake%"] == ["1"] (
|
||||
echo Configuring OCCT for Android %anAbi%, API level %anApi%...
|
||||
cmake -G "MinGW Makefiles" ^
|
||||
-D CMAKE_SYSTEM_NAME:STRING="Android" ^
|
||||
-D CMAKE_ANDROID_NDK="%anNdkPath%" ^
|
||||
-D CMAKE_BUILD_TYPE:STRING="Release" ^
|
||||
-D CMAKE_ANDROID_ARCH_ABI:STRING="%anAbi%" ^
|
||||
-D CMAKE_SYSTEM_VERSION:STRING="%anApi%" ^
|
||||
-D CMAKE_ANDROID_STL_TYPE="%aCppLib%" ^
|
||||
-D BUILD_LIBRARY_TYPE:STRING="%aLibType%" ^
|
||||
-D INSTALL_DIR:PATH="%aDestDir%" ^
|
||||
-D INSTALL_DIR_INCLUDE:STRING="inc" ^
|
||||
-D INSTALL_DIR_LIB:STRING="libs/%anAbi%" ^
|
||||
-D INSTALL_DIR_CMAKE:STRING="libs/%anAbi%/cmake/opencascade" ^
|
||||
-D INSTALL_DIR_RESOURCE:STRING="src" ^
|
||||
-D BUILD_MODULE_FoundationClasses:BOOL="ON" ^
|
||||
-D BUILD_MODULE_ModelingData:BOOL="%BUILD_ModelingData%" ^
|
||||
-D BUILD_MODULE_ModelingAlgorithms:BOOL="%BUILD_ModelingAlgorithms%" ^
|
||||
-D BUILD_MODULE_Visualization:BOOL="%BUILD_Visualization%" ^
|
||||
-D BUILD_MODULE_ApplicationFramework:BOOL="%BUILD_ApplicationFramework%" ^
|
||||
-D BUILD_MODULE_DataExchange:BOOL="%BUILD_DataExchange%" ^
|
||||
-D BUILD_MODULE_Draw:BOOL="OFF" ^
|
||||
-D BUILD_DOC_Overview:BOOL="OFF" ^
|
||||
-D 3RDPARTY_FREETYPE_DIR:PATH="%aFreeType%" ^
|
||||
-D 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="%aFreeType%/include" ^
|
||||
-D 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="%aFreeType%/include" ^
|
||||
-D 3RDPARTY_FREETYPE_LIBRARY_DIR:PATH="%aFreeType%/libs/%anAbi%" ^
|
||||
-D 3RDPARTY_FREETYPE_LIBRARY:FILEPATH="%aFreeType%/libs/%anAbi%/libfreetype.so" ^
|
||||
-D USE_RAPIDJSON:BOOL="%USE_RAPIDJSON%" ^
|
||||
-D 3RDPARTY_RAPIDJSON_DIR:PATH="%aRapidJson%" ^
|
||||
-D 3RDPARTY_RAPIDJSON_INCLUDE_DIR:PATH="%aRapidJson%/include" ^
|
||||
"%aCasSrc%"
|
||||
|
||||
if errorlevel 1 (
|
||||
popd
|
||||
exit /B 1
|
||||
goto :eof
|
||||
)
|
||||
)
|
||||
set aTimeGEN=%TIME%
|
||||
call :computeDuration %aTimeZERO% %aTimeGEN%
|
||||
if ["%toCMake%"] == ["1"] (
|
||||
echo Generation time: %DURATION%
|
||||
echo Generation time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
|
||||
if ["%toClean%"] == ["1"] (
|
||||
mingw32-make clean
|
||||
)
|
||||
|
||||
if ["%toMake%"] == ["1"] (
|
||||
echo Building...
|
||||
mingw32-make -j %aNbJobs% 2>> "%aLogFile%"
|
||||
if errorlevel 1 (
|
||||
type "%aLogFile%"
|
||||
popd
|
||||
exit /B 1
|
||||
goto :eof
|
||||
)
|
||||
type "%aLogFile%"
|
||||
)
|
||||
set aTimeBUILD=%TIME%
|
||||
call :computeDuration %aTimeGEN% %aTimeBUILD%
|
||||
if ["%toMake%"] == ["1"] (
|
||||
echo Building time: %DURATION%
|
||||
echo Building time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
call :computeDuration %aTimeZERO% %aTimeBUILD%
|
||||
if ["%toMake%"] == ["1"] (
|
||||
echo Total building time: %DURATION%
|
||||
echo Total building time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
|
||||
if ["%toInstall%"] == ["1"] (
|
||||
echo Installing into %aDestDir%...
|
||||
mingw32-make install 2>> "%aLogFile%"
|
||||
copy /Y "%aWorkDir%\VERSION.html" "%aDestDir%\VERSION.html"
|
||||
)
|
||||
set "aTimeINSTALL=%TIME%"
|
||||
call :computeDuration "%aTimeBUILD%" "%aTimeINSTALL%"
|
||||
if ["%toInstall%"] == ["1"] (
|
||||
echo Install time: %DURATION%
|
||||
echo Install time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
|
||||
call :computeDuration "%aTimeZERO%" "%aTimeINSTALL%"
|
||||
echo Total time: %DURATION%
|
||||
echo Total time: %DURATION%>> "%aLogFile%"
|
||||
|
||||
popd
|
||||
goto :eof
|
||||
|
||||
:computeDuration
|
||||
set "aTimeFrom=%~1"
|
||||
set "aTimeEnd=%~2"
|
||||
rem handle time before 10AM (win10 - remove empty space at the beginning)
|
||||
if "%aTimeFrom:~0,1%"==" " set "aTimeFrom=%aTimeFrom:~1%"
|
||||
if "%aTimeEnd:~0,1%"==" " set "aTimeEnd=%aTimeEnd:~1%"
|
||||
rem handle time before 10AM (win7 - add 0 at the beginning)
|
||||
if "%aTimeFrom:~1,1%"==":" set "aTimeFrom=0%aTimeFrom%"
|
||||
if "%aTimeEnd:~1,1%"==":" set "aTimeEnd=0%aTimeEnd%"
|
||||
rem convert hours:minutes:seconds:ms into duration
|
||||
set /A aTimeFrom=(1%aTimeFrom:~0,2%-100)*360000 + (1%aTimeFrom:~3,2%-100)*6000 + (1%aTimeFrom:~6,2%-100)*100 + (1%aTimeFrom:~9,2%-100)
|
||||
set /A aTimeEnd= (1%aTimeEnd:~0,2%-100)*360000 + (1%aTimeEnd:~3,2%-100)*6000 + (1%aTimeEnd:~6,2%-100)*100 + (1%aTimeEnd:~9,2%-100)
|
||||
set /A aDurTotalSec=%aTimeEnd%-%aTimeFrom%
|
||||
if %aTimeEnd% LSS %aTimeFrom% set set /A aDurTotalSec=%aTimeFrom%-%aTimeEnd%
|
||||
set /A aDurHH=%aDurTotalSec% / 360000
|
||||
set /A aDurMM=(%aDurTotalSec% - %aDurHH%*360000) / 6000
|
||||
set /A aDurSS=(%aDurTotalSec% - %aDurHH%*360000 - %aDurMM%*6000) / 100
|
||||
if %aDurHH% LSS 10 set aDurHH=0%aDurHH%
|
||||
if %aDurMM% LSS 10 set aDurMM=0%aDurMM%
|
||||
if %aDurSS% LSS 10 set aDurSS=0%aDurSS%
|
||||
|
||||
set "DURATION=%aDurHH%:%aDurMM%:%aDurSS%"
|
||||
goto :eof
|
@@ -1,31 +0,0 @@
|
||||
rem Environment configuration template for android_build.bat (to be renamed as android_custom.bat)
|
||||
|
||||
rem Paths to 3rd-party tools and libraries
|
||||
rem call c:\TDM-GCC-64\mingwvars.bat
|
||||
rem set "PATH=c:\CMake\bin;%PATH%"
|
||||
rem set "anNdkPath=c:/android-ndk-r12"
|
||||
rem set "aFreeType=c:/freetype-2.7.1-android"
|
||||
rem set "aRapidJson=c:/rapidjson-1.1.0"
|
||||
|
||||
rem Uncomment to customize building steps
|
||||
rem set "aBuildRoot=%~dp0..\..\work"
|
||||
rem set "toCMake=1"
|
||||
rem set "toClean=0"
|
||||
rem set "toMake=1"
|
||||
rem set "toInstall=1"
|
||||
rem set "toPack=1"
|
||||
rem set "isStatic=0"
|
||||
|
||||
rem Minimal Android platform and CPU architectures
|
||||
rem set "anNdkApiLevel=21"
|
||||
rem set "anNdkAbiList=arm64-v8a x86_64"
|
||||
|
||||
rem OCCT Modules to build
|
||||
rem set "BUILD_ModelingData=ON"
|
||||
rem set "BUILD_ModelingAlgorithms=ON"
|
||||
rem set "BUILD_Visualization=ON"
|
||||
rem set "BUILD_ApplicationFramework=ON"
|
||||
rem set "BUILD_DataExchange=ON"
|
||||
|
||||
rem Optional 3rd-party libraries to enable
|
||||
rem set USE_RAPIDJSON=ON
|
@@ -1,46 +0,0 @@
|
||||
rem Environment configuration template for cmake_gen.bat (to be renamed as cmake_gen_custom.bat)
|
||||
|
||||
set "OCCT3RDPARTY=%SrcRoot%\..\3rdparty"
|
||||
|
||||
set VS=14
|
||||
set VSDATA=2015
|
||||
|
||||
rem Leave VSPLATFORM empty to build for x86 platform
|
||||
set VSPLATFORM=Win64
|
||||
|
||||
rem ------------------------------------
|
||||
rem Uncomment to customize building steps
|
||||
rem ------------------------------------
|
||||
|
||||
rem set "BUILD_DIR=build-vs%VS%-%VSPLATFORM%"
|
||||
rem set "INSTALL_DIR=%SrcRoot%\install"
|
||||
|
||||
rem set BUILD_DOC_Overview=OFF
|
||||
rem set BUILD_Inspector=OFF
|
||||
rem set BUILD_LIBRARY_TYPE=Shared
|
||||
rem set BUILD_RELEASE_DISABLE_EXCEPTIONS=ON
|
||||
rem set BUILD_WITH_DEBUG=OFF
|
||||
rem set BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON
|
||||
rem set BUILD_USE_PCH=OFF
|
||||
|
||||
rem Use semicolon-separated list of toolkits if you want to disable all modules
|
||||
rem and build only some toolkits.
|
||||
rem set BUILD_ADDITIONAL_TOOLKITS=
|
||||
|
||||
rem Set a directory recognized as a patch for OCCT.
|
||||
rem set BUILD_PATCH=
|
||||
|
||||
rem set BUILD_MODULE_ApplicationFramework=ON
|
||||
rem set BUILD_MODULE_DataExchange=ON
|
||||
rem set BUILD_MODULE_Draw=ON
|
||||
rem set BUILD_MODULE_ModelingAlgorithms=ON
|
||||
rem set BUILD_MODULE_ModelingData=ON
|
||||
rem set BUILD_MODULE_Visualization=ON
|
||||
|
||||
rem set USE_D3D=OFF
|
||||
rem set USE_FFMPEG=OFF
|
||||
rem set USE_FREEIMAGE=OFF
|
||||
rem set USE_GLES2=OFF
|
||||
rem set USE_RAPIDJSON=OFF
|
||||
rem set USE_TBB=OFF
|
||||
rem set USE_VTK=OFF
|
@@ -1,42 +0,0 @@
|
||||
# Environment configuration template for cmake_gen.sh (to be renamed as cmake_gen_custom.sh)
|
||||
|
||||
OCCT3RDPARTY="$SrcRoot/../3rdparty"
|
||||
FREETYPE_DIR="$OCCT3RDPARTY/freetype-2.7.1"
|
||||
|
||||
# ------------------------------------
|
||||
# Uncomment to customize building steps
|
||||
# ------------------------------------
|
||||
|
||||
#BUILD_DIR=build
|
||||
#INSTALL_DIR="$SrcRoot/install"
|
||||
|
||||
#BUILD_DOC_Overview=OFF
|
||||
#BUILD_Inspector=OFF
|
||||
#BUILD_LIBRARY_TYPE=Shared
|
||||
#BUILD_RELEASE_DISABLE_EXCEPTIONS=ON
|
||||
#BUILD_WITH_DEBUG=OFF
|
||||
#BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON
|
||||
|
||||
# Use semicolon-separated list of toolkits if you want to disable all modules
|
||||
# and build only some toolkits.
|
||||
#BUILD_ADDITIONAL_TOOLKITS=
|
||||
|
||||
# Set a directory recognized as a patch for OCCT.
|
||||
#BUILD_PATCH=
|
||||
|
||||
#BUILD_MODULE_ApplicationFramework=ON
|
||||
#BUILD_MODULE_DataExchange=ON
|
||||
#BUILD_MODULE_Draw=ON
|
||||
#BUILD_MODULE_ModelingAlgorithms=ON
|
||||
#BUILD_MODULE_ModelingData=ON
|
||||
#BUILD_MODULE_Visualization=ON
|
||||
|
||||
#USE_FFMPEG=OFF
|
||||
#USE_FREEIMAGE=OFF
|
||||
#USE_GLES2=OFF
|
||||
#USE_RAPIDJSON=OFF
|
||||
#USE_TBB=OFF
|
||||
#USE_VTK=OFF
|
||||
|
||||
# This is to add any additional arguments to cmake
|
||||
#AUX_ARGS=
|
@@ -1,83 +0,0 @@
|
||||
@echo off
|
||||
|
||||
rem Auxiliary script for semi-automated building of OCCT using cmake.
|
||||
rem cmake_custom.bat should be configured with VS version and path to 3rd-parties.
|
||||
rem OCCT3RDPARTY must be specified as mandatory dependency.
|
||||
|
||||
setlocal
|
||||
|
||||
set "SrcRoot=%~dp0..\.."
|
||||
|
||||
set VS=14
|
||||
set VSDATA=2015
|
||||
set VSPLATFORM=Win64
|
||||
set "BUILD_DIR=build-vs%VS%-%VSPLATFORM%"
|
||||
set "INSTALL_DIR=%SrcRoot%\install"
|
||||
|
||||
set BUILD_ADDITIONAL_TOOLKITS=
|
||||
set BUILD_DOC_Overview=OFF
|
||||
set BUILD_Inspector=OFF
|
||||
set BUILD_LIBRARY_TYPE=Shared
|
||||
set BUILD_PATCH=
|
||||
set BUILD_RELEASE_DISABLE_EXCEPTIONS=ON
|
||||
set BUILD_WITH_DEBUG=OFF
|
||||
set BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON
|
||||
set BUILD_USE_PCH=OFF
|
||||
|
||||
set BUILD_MODULE_ApplicationFramework=ON
|
||||
set BUILD_MODULE_DataExchange=ON
|
||||
set BUILD_MODULE_Draw=ON
|
||||
set BUILD_MODULE_ModelingAlgorithms=ON
|
||||
set BUILD_MODULE_ModelingData=ON
|
||||
set BUILD_MODULE_Visualization=ON
|
||||
|
||||
set USE_D3D=OFF
|
||||
set USE_FFMPEG=OFF
|
||||
set USE_FREEIMAGE=OFF
|
||||
set USE_GLES2=OFF
|
||||
set USE_RAPIDJSON=OFF
|
||||
set USE_TBB=OFF
|
||||
set USE_VTK=OFF
|
||||
|
||||
if exist "%~dp0cmake_custom.bat" call "%~dp0cmake_custom.bat"
|
||||
|
||||
if not "%VSPLATFORM%"=="" set "arch_compile=Visual Studio %VS% %VSDATA% %VSPLATFORM%"
|
||||
if "%VSPLATFORM%"=="" set "arch_compile=Visual Studio %VS% %VSDATA%"
|
||||
|
||||
set "INSTALL_DIR=%INSTALL_DIR:\=/%"
|
||||
set "OCCT3RDPARTY=%OCCT3RDPARTY:\=/%"
|
||||
|
||||
set "BUILD_DIR=%SrcRoot%\%BUILD_DIR%"
|
||||
if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%"
|
||||
pushd "%BUILD_DIR%"
|
||||
|
||||
cmake -G "%arch_compile%" ^
|
||||
-D 3RDPARTY_DIR:STRING="%OCCT3RDPARTY%" ^
|
||||
-D BUILD_ADDITIONAL_TOOLKITS:STRING="%BUILD_ADDITIONAL_TOOLKITS%" ^
|
||||
-D BUILD_DOC_Overview:BOOL=%BUILD_DOC_Overview% ^
|
||||
-D BUILD_Inspector:BOOL=%BUILD_Inspector% ^
|
||||
-D BUILD_LIBRARY_TYPE:STRING=%BUILD_LIBRARY_TYPE% ^
|
||||
-D BUILD_MODULE_ApplicationFramework:BOOL=%BUILD_MODULE_ApplicationFramework% ^
|
||||
-D BUILD_MODULE_DataExchange:BOOL=%BUILD_MODULE_DataExchange% ^
|
||||
-D BUILD_MODULE_Draw:BOOL=%BUILD_MODULE_Draw% ^
|
||||
-D BUILD_MODULE_FoundationClasses:BOOL=ON ^
|
||||
-D BUILD_MODULE_ModelingAlgorithms:BOOL=%BUILD_MODULE_ModelingAlgorithms% ^
|
||||
-D BUILD_MODULE_ModelingData:BOOL=%BUILD_MODULE_ModelingData% ^
|
||||
-D BUILD_MODULE_Visualization:BOOL=%BUILD_MODULE_Visualization% ^
|
||||
-D BUILD_PATCH:PATH="%BUILD_PATCH%" ^
|
||||
-D BUILD_RELEASE_DISABLE_EXCEPTIONS:BOOL=%BUILD_RELEASE_DISABLE_EXCEPTIONS% ^
|
||||
-D BUILD_WITH_DEBUG:BOOL=%BUILD_WITH_DEBUG% ^
|
||||
-D BUILD_ENABLE_FPE_SIGNAL_HANDLER:BOOL=%BUILD_ENABLE_FPE_SIGNAL_HANDLER% ^
|
||||
-D BUILD_USE_PCH:BOOL=%BUILD_USE_PCH% ^
|
||||
-D INSTALL_DIR:PATH="%INSTALL_DIR%" ^
|
||||
-D USE_D3D:BOOL=%USE_D3D% ^
|
||||
-D USE_FFMPEG:BOOL=%USE_FFMPEG% ^
|
||||
-D USE_FREEIMAGE:BOOL=%USE_FREEIMAGE% ^
|
||||
-D USE_GLES2:BOOL=%USE_GLES2% ^
|
||||
-D USE_RAPIDJSON:BOOL=%USE_RAPIDJSON% ^
|
||||
-D USE_TBB:BOOL=%USE_TBB% ^
|
||||
-D USE_VTK:BOOL=%USE_VTK% ^
|
||||
"%SrcRoot%"
|
||||
|
||||
popd
|
||||
endlocal
|
@@ -1,86 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Auxiliary script for semi-automated building of OCCT using cmake.
|
||||
# cmake_custom.sh should be configured with path to 3rd-parties.
|
||||
# OCCT3RDPARTY and FREETYPE_DIR must be specified as mandatory dependencies.
|
||||
|
||||
ScriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
SrcRoot="${ScriptDir}/../.."
|
||||
|
||||
INSTALL_DIR="$SrcRoot/install"
|
||||
|
||||
BUILD_DIR=build
|
||||
DEB=
|
||||
CMAKE_BUILD_TYPE=Release
|
||||
if [ "$1" = "-d" ]; then
|
||||
DEB=d
|
||||
BUILD_DIR=${BUILD_DIR}-deb
|
||||
CMAKE_BUILD_TYPE=Debug
|
||||
fi
|
||||
INSTALL_DIR_BIN=lin64/gcc/bin$DEB
|
||||
INSTALL_DIR_LIB=lin64/gcc/lib$DEB
|
||||
|
||||
BUILD_ADDITIONAL_TOOLKITS=
|
||||
BUILD_DOC_Overview=OFF
|
||||
BUILD_Inspector=OFF
|
||||
BUILD_LIBRARY_TYPE=Shared
|
||||
BUILD_PATCH=
|
||||
BUILD_RELEASE_DISABLE_EXCEPTIONS=ON
|
||||
BUILD_WITH_DEBUG=OFF
|
||||
BUILD_ENABLE_FPE_SIGNAL_HANDLER=ON
|
||||
|
||||
BUILD_MODULE_ApplicationFramework=ON
|
||||
BUILD_MODULE_DataExchange=ON
|
||||
BUILD_MODULE_Draw=ON
|
||||
BUILD_MODULE_ModelingAlgorithms=ON
|
||||
BUILD_MODULE_ModelingData=ON
|
||||
BUILD_MODULE_Visualization=ON
|
||||
|
||||
USE_FFMPEG=OFF
|
||||
USE_FREEIMAGE=OFF
|
||||
USE_GLES2=OFF
|
||||
USE_RAPIDJSON=OFF
|
||||
USE_TBB=OFF
|
||||
USE_VTK=OFF
|
||||
AUX_ARGS=
|
||||
|
||||
if [ -f "${ScriptDir}/cmake_custom.sh" ]; then
|
||||
. "${ScriptDir}/cmake_custom.sh"
|
||||
fi
|
||||
|
||||
BUILD_DIR="$SrcRoot/$BUILD_DIR"
|
||||
if [ ! -d "$BUILD_DIR" ]; then mkdir -p "$BUILD_DIR"; fi
|
||||
pushd "$BUILD_DIR"
|
||||
|
||||
cmake -G "Unix Makefiles" \
|
||||
-D CMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE \
|
||||
-D 3RDPARTY_DIR:PATH="$OCCT3RDPARTY" \
|
||||
-D 3RDPARTY_FREETYPE_DIR:PATH="$FREETYPE_DIR" \
|
||||
-D BUILD_ADDITIONAL_TOOLKITS:STRING="$BUILD_ADDITIONAL_TOOLKITS" \
|
||||
-D BUILD_DOC_Overview:BOOL=$BUILD_DOC_Overview \
|
||||
-D BUILD_Inspector:BOOL=$BUILD_Inspector \
|
||||
-D BUILD_LIBRARY_TYPE:STRING=$BUILD_LIBRARY_TYPE \
|
||||
-D BUILD_MODULE_ApplicationFramework:BOOL=$BUILD_MODULE_ApplicationFramework \
|
||||
-D BUILD_MODULE_DataExchange:BOOL=$BUILD_MODULE_DataExchange \
|
||||
-D BUILD_MODULE_Draw:BOOL=$BUILD_MODULE_Draw \
|
||||
-D BUILD_MODULE_FoundationClasses:BOOL=ON \
|
||||
-D BUILD_MODULE_ModelingAlgorithms:BOOL=$BUILD_MODULE_ModelingAlgorithms \
|
||||
-D BUILD_MODULE_ModelingData:BOOL=$BUILD_MODULE_ModelingData \
|
||||
-D BUILD_MODULE_Visualization:BOOL=$BUILD_MODULE_Visualization \
|
||||
-D BUILD_PATCH:PATH="$BUILD_PATCH" \
|
||||
-D BUILD_RELEASE_DISABLE_EXCEPTIONS:BOOL=$BUILD_RELEASE_DISABLE_EXCEPTIONS \
|
||||
-D BUILD_WITH_DEBUG:BOOL=$BUILD_WITH_DEBUG \
|
||||
-D BUILD_ENABLE_FPE_SIGNAL_HANDLER:BOOL=$BUILD_ENABLE_FPE_SIGNAL_HANDLER \
|
||||
-D INSTALL_DIR:PATH="$INSTALL_DIR" \
|
||||
-D INSTALL_DIR_LAYOUT:STRING=Windows \
|
||||
-D INSTALL_DIR_BIN:STRING=$INSTALL_DIR_BIN \
|
||||
-D INSTALL_DIR_LIB:STRING=$INSTALL_DIR_LIB \
|
||||
-D USE_FFMPEG:BOOL=$USE_FFMPEG \
|
||||
-D USE_FREEIMAGE:BOOL=$USE_FREEIMAGE \
|
||||
-D USE_GLES2:BOOL=$USE_GLES2 \
|
||||
-D USE_RAPIDJSON:BOOL=$USE_RAPIDJSON \
|
||||
-D USE_TBB:BOOL=$USE_TBB \
|
||||
-D USE_VTK:BOOL=$USE_VTK \
|
||||
$AUX_ARGS "$SrcRoot"
|
||||
|
||||
popd
|
@@ -1,165 +0,0 @@
|
||||
@echo OFF
|
||||
|
||||
rem Auxiliary script for semi-automated building of OCCT for WASM platform.
|
||||
rem wasm_custom.bat should be configured with paths to CMake, 3rd-parties and Emscripten SDK.
|
||||
rem FreeType should be specified as mandatory dependency.
|
||||
|
||||
set "aSrcRoot=%~dp0..\.."
|
||||
set "aBuildRoot=work"
|
||||
|
||||
set aNbJobs=%NUMBER_OF_PROCESSORS%
|
||||
|
||||
set "toCMake=1"
|
||||
set "toClean=0"
|
||||
set "toMake=1"
|
||||
set "toInstall=1"
|
||||
|
||||
set "BUILD_ModelingData=ON"
|
||||
set "BUILD_ModelingAlgorithms=ON"
|
||||
set "BUILD_Visualization=ON"
|
||||
set "BUILD_ApplicationFramework=ON"
|
||||
set "BUILD_DataExchange=ON"
|
||||
|
||||
rem Configuration file
|
||||
if exist "%~dp0wasm_custom.bat" call "%~dp0wasm_custom.bat"
|
||||
|
||||
call "%EMSDK_ROOT%\emsdk_env.bat"
|
||||
set "aToolchain=%EMSDK%/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
|
||||
|
||||
set "anOcctVerSuffix="
|
||||
set "anOcctVersion=0.0.0"
|
||||
set "aGitBranch="
|
||||
for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_DEVELOPMENT" "%aSrcRoot%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVerSuffix=%%i" )
|
||||
for /f tokens^=2^ delims^=^" %%i in ('findstr /b /c:"#define OCC_VERSION_COMPLETE" "%aSrcRoot%\src\Standard\Standard_Version.hxx"') do ( set "anOcctVersion=%%i" )
|
||||
for /f %%i in ('git symbolic-ref --short HEAD') do ( set "aGitBranch=%%i" )
|
||||
|
||||
call :cmakeGenerate
|
||||
if not ["%1"] == ["-nopause"] (
|
||||
pause
|
||||
)
|
||||
|
||||
goto :eof
|
||||
|
||||
:cmakeGenerate
|
||||
set "aPlatformAndCompiler=wasm"
|
||||
set "aWorkDir=%aSrcRoot%\%aBuildRoot%\%aPlatformAndCompiler%-make"
|
||||
set "aDestDir=%aSrcRoot%\%aBuildRoot%\%aPlatformAndCompiler%"
|
||||
set "aLogFile=%aSrcRoot%\%aBuildRoot%\build-%aPlatformAndCompiler%.log"
|
||||
if not exist "%aWorkDir%" ( mkdir "%aWorkDir%" )
|
||||
if exist "%aLogFile%" ( del "%aLogFile%" )
|
||||
|
||||
rem include some information about OCCT into archive
|
||||
echo ^<pre^>> "%aWorkDir%\VERSION.html"
|
||||
git status >> "%aWorkDir%\VERSION.html"
|
||||
git log -n 100 >> "%aWorkDir%\VERSION.html"
|
||||
echo ^</pre^>>> "%aWorkDir%\VERSION.html"
|
||||
|
||||
echo Start building OCCT for %aPlatformAndCompiler%
|
||||
echo Start building OCCT for %aPlatformAndCompiler%>> %aLogFile%
|
||||
|
||||
pushd "%aWorkDir%"
|
||||
|
||||
set aTimeZERO=%TIME%
|
||||
if ["%toCMake%"] == ["1"] (
|
||||
echo "Configuring OCCT for WASM..."
|
||||
cmake -G "MinGW Makefiles" ^
|
||||
-D CMAKE_TOOLCHAIN_FILE:FILEPATH="%aToolchain%" ^
|
||||
-D CMAKE_BUILD_TYPE:STRING="Release" ^
|
||||
-D BUILD_LIBRARY_TYPE:STRING="Static" ^
|
||||
-D INSTALL_DIR:PATH="%aDestDir%" ^
|
||||
-D INSTALL_DIR_INCLUDE:STRING="inc" ^
|
||||
-D INSTALL_DIR_RESOURCE:STRING="src" ^
|
||||
-D 3RDPARTY_FREETYPE_DIR:PATH="%aFreeType%" ^
|
||||
-D 3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="%aFreeType%/include" ^
|
||||
-D 3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="%aFreeType%/include" ^
|
||||
-D BUILD_MODULE_FoundationClasses:BOOL="ON" ^
|
||||
-D BUILD_MODULE_ModelingData:BOOL="%BUILD_ModelingData%" ^
|
||||
-D BUILD_MODULE_ModelingAlgorithms:BOOL="%BUILD_ModelingAlgorithms%" ^
|
||||
-D BUILD_MODULE_Visualization:BOOL="%BUILD_Visualization%" ^
|
||||
-D BUILD_MODULE_ApplicationFramework:BOOL="%BUILD_ApplicationFramework%" ^
|
||||
-D BUILD_MODULE_DataExchange:BOOL="%BUILD_DataExchange%" ^
|
||||
-D BUILD_MODULE_Draw:BOOL="OFF" ^
|
||||
-D BUILD_DOC_Overview:BOOL="OFF" ^
|
||||
"%aSrcRoot%"
|
||||
|
||||
if errorlevel 1 (
|
||||
popd
|
||||
exit /B 1
|
||||
goto :eof
|
||||
)
|
||||
)
|
||||
set aTimeGEN=%TIME%
|
||||
call :computeDuration %aTimeZERO% %aTimeGEN%
|
||||
if ["%toCMake%"] == ["1"] (
|
||||
echo Generation time: %DURATION%
|
||||
echo Generation time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
|
||||
if "%toClean%"=="1" (
|
||||
mingw32-make clean
|
||||
)
|
||||
|
||||
if "%toMake%"=="1" (
|
||||
echo Building...
|
||||
mingw32-make -j %aNbJobs% 2>> "%aLogFile%"
|
||||
if errorlevel 1 (
|
||||
popd
|
||||
exit /B 1
|
||||
goto :eof
|
||||
)
|
||||
type "%aLogFile%"
|
||||
)
|
||||
set aTimeBUILD=%TIME%
|
||||
call :computeDuration %aTimeGEN% %aTimeBUILD%
|
||||
if "%toMake%"=="1" (
|
||||
echo Building time: %DURATION%
|
||||
echo Building time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
call :computeDuration %aTimeZERO% %aTimeBUILD%
|
||||
if "%toMake%"=="1" (
|
||||
echo Total building time: %DURATION%
|
||||
echo Total building time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
|
||||
if "%toInstall%"=="1" (
|
||||
echo Installing into %aDestDir%...
|
||||
mingw32-make install 2>> "%aLogFile%"
|
||||
copy /Y "%aWorkDir%\VERSION.html" "%aDestDir%\VERSION.html"
|
||||
)
|
||||
set aTimeINSTALL=%TIME%
|
||||
call :computeDuration %aTimeBUILD% %aTimeINSTALL%
|
||||
if "%toInstall%"=="1" (
|
||||
echo Install time: %DURATION%
|
||||
echo Install time: %DURATION%>> "%aLogFile%"
|
||||
)
|
||||
|
||||
call :computeDuration %aTimeZERO% %aTimeINSTALL%
|
||||
echo Total time: %DURATION%
|
||||
echo Total time: %DURATION%>> "%aLogFile%"
|
||||
|
||||
popd
|
||||
goto :eof
|
||||
|
||||
:computeDuration
|
||||
set aTimeFrom=%1
|
||||
set aTimeEnd=%2
|
||||
rem handle time before 10AM (win10 - remove empty space at the beginning)
|
||||
if "%aTimeFrom:~0,1%"==" " set "aTimeFrom=%aTimeFrom:~1%"
|
||||
if "%aTimeEnd:~0,1%"==" " set "aTimeEnd=%aTimeEnd:~1%"
|
||||
rem handle time before 10AM (win7 - add 0 at the beginning)
|
||||
if "%aTimeFrom:~1,1%"==":" set "aTimeFrom=0%aTimeFrom%"
|
||||
if "%aTimeEnd:~1,1%"==":" set "aTimeEnd=0%aTimeEnd%"
|
||||
rem convert hours:minutes:seconds:ms into duration
|
||||
set /A aTimeFrom=(1%aTimeFrom:~0,2%-100)*360000 + (1%aTimeFrom:~3,2%-100)*6000 + (1%aTimeFrom:~6,2%-100)*100 + (1%aTimeFrom:~9,2%-100)
|
||||
set /A aTimeEnd= (1%aTimeEnd:~0,2%-100)*360000 + (1%aTimeEnd:~3,2%-100)*6000 + (1%aTimeEnd:~6,2%-100)*100 + (1%aTimeEnd:~9,2%-100)
|
||||
set /A aDurTotalSec=%aTimeEnd%-%aTimeFrom%
|
||||
if %aTimeEnd% LSS %aTimeFrom% set set /A aDurTotalSec=%aTimeFrom%-%aTimeEnd%
|
||||
set /A aDurHH=%aDurTotalSec% / 360000
|
||||
set /A aDurMM=(%aDurTotalSec% - %aDurHH%*360000) / 6000
|
||||
set /A aDurSS=(%aDurTotalSec% - %aDurHH%*360000 - %aDurMM%*6000) / 100
|
||||
if %aDurHH% LSS 10 set aDurHH=0%aDurHH%
|
||||
if %aDurMM% LSS 10 set aDurMM=0%aDurMM%
|
||||
if %aDurSS% LSS 10 set aDurSS=0%aDurSS%
|
||||
|
||||
set "DURATION=%aDurHH%:%aDurMM%:%aDurSS%"
|
||||
goto :eof
|
@@ -1,126 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Auxiliary script for semi-automated building of OCCT for WASM platform.
|
||||
# wasm_custom.sh should be configured with paths to CMake, 3rd-parties and Emscripten SDK.
|
||||
# FreeType should be specified as mandatory dependency.
|
||||
|
||||
export aScriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||
export aSrcRoot="${aScriptDir}/../.."
|
||||
export aBuildRoot=work
|
||||
|
||||
export aNbJobs=${NUMBER_OF_PROCESSORS}
|
||||
|
||||
export toCMake=1
|
||||
export toClean=0
|
||||
export toMake=1
|
||||
export toInstall=1
|
||||
|
||||
export BUILD_ModelingData=ON
|
||||
export BUILD_ModelingAlgorithms=ON
|
||||
export BUILD_Visualization=ON
|
||||
export BUILD_ApplicationFramework=ON
|
||||
export BUILD_DataExchange=ON
|
||||
|
||||
if [ -f "${aScriptDir}/wasm_custom.sh" ] ; then
|
||||
. "${aScriptDir}/wasm_custom.sh"
|
||||
fi
|
||||
|
||||
. "${EMSDK_ROOT}/emsdk_env.sh"
|
||||
|
||||
export aToolchain="${EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake"
|
||||
|
||||
export aGitBranch=`git symbolic-ref --short HEAD`
|
||||
|
||||
echo "Compilation OCCT branch : $aGitBranch"
|
||||
|
||||
export aPlatformAndCompiler=wasm
|
||||
|
||||
export aWorkDir="${aSrcRoot}/${aBuildRoot}/${aPlatformAndCompiler}-make"
|
||||
if [ ! -d "${aWorkDir}" ]; then
|
||||
mkdir -p "${aWorkDir}"
|
||||
fi
|
||||
|
||||
export aDestDir="${aSrcRoot}/${aBuildRoot}/${aPlatformAndCompiler}"
|
||||
if [ ! -d "${aDestDir}" ]; then
|
||||
mkdir -p "${aDestDir}"
|
||||
fi
|
||||
|
||||
export aLogFile="${aSrcRoot}/${aBuildRoot}/build-${aPlatformAndCompiler}.log"
|
||||
if [ -f "${aLogFile}" ]; then
|
||||
rm "${aLogFile}"
|
||||
fi
|
||||
|
||||
echo Start building OCCT for ${aPlatformAndCompiler}
|
||||
echo Start building OCCT for ${aPlatformAndCompiler}>> "${aLogFile}"
|
||||
|
||||
pushd "${aWorkDir}"
|
||||
pwd
|
||||
echo toCMake=${toCMake}
|
||||
if [ "${toCMake}" = "1" ]; then
|
||||
|
||||
echo "Configuring OCCT for WASM..."
|
||||
echo cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE:FILEPATH="${aToolchain}" \
|
||||
-DCMAKE_BUILD_TYPE:STRING="Release" \
|
||||
-DBUILD_LIBRARY_TYPE:STRING="Static" \
|
||||
-DINSTALL_DIR:PATH="${aDestDir}" \
|
||||
-DINSTALL_DIR_INCLUDE:STRING="inc" \
|
||||
-DINSTALL_DIR_RESOURCE:STRING="src" \
|
||||
-D3RDPARTY_FREETYPE_DIR:PATH="$aFreeType" \
|
||||
-D3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="$aFreeType/include" \
|
||||
-D3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="$aFreeType/include" \
|
||||
-DBUILD_MODULE_FoundationClasses:BOOL="ON" \
|
||||
-DBUILD_MODULE_ModelingData:BOOL="${BUILD_ModelingData}" \
|
||||
-DBUILD_MODULE_ModelingAlgorithms:BOOL="${BUILD_ModelingAlgorithms}" \
|
||||
-DBUILD_MODULE_Visualization:BOOL="${BUILD_Visualization}" \
|
||||
-DBUILD_MODULE_ApplicationFramework:BOOL="${BUILD_ApplicationFramework}" \
|
||||
-DBUILD_MODULE_DataExchange:BOOL="${BUILD_DataExchange}" \
|
||||
-DBUILD_MODULE_Draw:BOOL="OFF" \
|
||||
-DBUILD_DOC_Overview:BOOL="OFF" "${aSrcRoot}"
|
||||
|
||||
cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE:FILEPATH="${aToolchain}" \
|
||||
-DCMAKE_BUILD_TYPE:STRING="Release" \
|
||||
-DBUILD_LIBRARY_TYPE:STRING="Static" \
|
||||
-DINSTALL_DIR:PATH="${aDestDir}" \
|
||||
-DINSTALL_DIR_INCLUDE:STRING="inc" \
|
||||
-DINSTALL_DIR_RESOURCE:STRING="src" \
|
||||
-D3RDPARTY_FREETYPE_DIR:PATH="$aFreeType" \
|
||||
-D3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2:FILEPATH="$aFreeType/include" \
|
||||
-D3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build:FILEPATH="$aFreeType/include" \
|
||||
-DBUILD_MODULE_FoundationClasses:BOOL="ON" \
|
||||
-DBUILD_MODULE_ModelingData:BOOL="${BUILD_ModelingData}" \
|
||||
-DBUILD_MODULE_ModelingAlgorithms:BOOL="${BUILD_ModelingAlgorithms}" \
|
||||
-DBUILD_MODULE_Visualization:BOOL="${BUILD_Visualization}" \
|
||||
-DBUILD_MODULE_ApplicationFramework:BOOL="${BUILD_ApplicationFramework}" \
|
||||
-DBUILD_MODULE_DataExchange:BOOL="${BUILD_DataExchange}" \
|
||||
-DBUILD_MODULE_Draw:BOOL="OFF" \
|
||||
-DBUILD_DOC_Overview:BOOL="OFF" "${aSrcRoot}"
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Problem during configuration"
|
||||
popd
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
if [ "${toClean}" = "1" ]; then
|
||||
make clean
|
||||
fi
|
||||
|
||||
if [ "${toMake}" = "1" ]; then
|
||||
echo Building...
|
||||
make -j ${aNbJobs} 2>> "${aLogFile}"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Problem during make operation"
|
||||
popd
|
||||
exit 1
|
||||
fi
|
||||
echo "${aLogFile}"
|
||||
fi
|
||||
|
||||
if [ "${toInstall}" = "1" ]; then
|
||||
echo Installing into ${aDestDir}
|
||||
make install 2>> "${aLogFile}"
|
||||
fi
|
||||
|
||||
popd
|
@@ -1,16 +0,0 @@
|
||||
rem Environment configuration template for occ_build_wasm.bat (to be renamed as wasm_custom_env.bat)
|
||||
set "aFreeType=%aSrcRoot%\..\3rdparty\freetype-2.7.1-wasm"
|
||||
set "EMSDK_ROOT=%aSrcRoot%\..\emsdk"
|
||||
|
||||
rem Uncomment to customize building steps
|
||||
rem set "aBuildRoot=work"
|
||||
rem set "toCMake=1"
|
||||
rem set "toClean=0"
|
||||
rem set "toMake=1"
|
||||
rem set "toInstall=1"
|
||||
|
||||
rem set "BUILD_ModelingData=ON"
|
||||
rem set "BUILD_ModelingAlgorithms=ON"
|
||||
rem set "BUILD_Visualization=ON"
|
||||
rem set "BUILD_ApplicationFramework=ON"
|
||||
rem set "BUILD_DataExchange=ON"
|
@@ -1,16 +0,0 @@
|
||||
# environment configuration template for occ_build_wasm.sh (to be renamed as wasm_custom_env.sh)
|
||||
export aFreeType="$aSrcRoot/../3rdparty/freetype-2.7.1-wasm"
|
||||
export EMSDK_ROOT="$aSrcRoot/../emsdk"
|
||||
|
||||
# Uncomment to customize building steps
|
||||
#export aBuildRoot=work
|
||||
#export toCMake=1
|
||||
#export toClean=0
|
||||
#export toMake=1
|
||||
#export toInstall=1
|
||||
|
||||
#export BUILD_ModelingData=ON
|
||||
#export BUILD_ModelingAlgorithms=ON
|
||||
#export BUILD_Visualization=ON
|
||||
#export BUILD_ApplicationFramework=ON
|
||||
#export BUILD_DataExchange=ON
|
@@ -21,7 +21,6 @@ set (OpenCASCADE_DEVELOPMENT_VERSION "@OCC_VERSION_DEVELOPMENT@")
|
||||
# This is made to support different locations of CMake files:
|
||||
# - in UNIX style: $INSTALL_DIR/lib/cmake/opencascade-<version>
|
||||
# - in Windows style: $INSTALL_DIR/cmake
|
||||
# - in Android style: $INSTALL_DIR/libs/$CMAKE_ANDROID_ARCH_ABI/cmake/opencascade-<version>
|
||||
get_filename_component (OpenCASCADE_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||
get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH)
|
||||
if (OpenCASCADE_INSTALL_PREFIX MATCHES "/cmake$")
|
||||
@@ -30,10 +29,6 @@ endif()
|
||||
if (OpenCASCADE_INSTALL_PREFIX MATCHES "/lib$")
|
||||
get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH)
|
||||
endif()
|
||||
if (OpenCASCADE_INSTALL_PREFIX MATCHES "/libs/${CMAKE_ANDROID_ARCH_ABI}$")
|
||||
get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH)
|
||||
get_filename_component (OpenCASCADE_INSTALL_PREFIX "${OpenCASCADE_INSTALL_PREFIX}" PATH)
|
||||
endif()
|
||||
|
||||
# Set OpenCASCADE paths to headers, binaries, libraries, resources, tests, samples, data
|
||||
set (OpenCASCADE_BINARY_DIR "${OpenCASCADE_INSTALL_PREFIX}/@INSTALL_DIR_BIN@")
|
||||
|
@@ -1,38 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
rem Setup environment
|
||||
call "%~dp0env.bat" %1 %2 %3
|
||||
|
||||
rem Define path to project file
|
||||
set "PRJFILE=%~dp0OCCT.sln"
|
||||
|
||||
if "%VCVER%" == "vc8" (
|
||||
call "%VS80COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc9" (
|
||||
call "%VS90COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc10" (
|
||||
call "%VS100COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc11" (
|
||||
call "%VS110COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc12" (
|
||||
call "%VS120COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc14" (
|
||||
call "%VS140COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc141" (
|
||||
call "%VS141COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc142" (
|
||||
call "%VS142COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else (
|
||||
echo Error: wrong VS identifier
|
||||
exit /B
|
||||
)
|
||||
|
||||
set BUILDCONFIG=Release
|
||||
if "%CASDEB%"=="i" set BUILDCONFIG=RelWithDebInfo
|
||||
if "%CASDEB%"=="d" set BUILDCONFIG=Debug
|
||||
if "%ARCH%"=="32" set PLATFORM=win32
|
||||
if "%ARCH%"=="64" set PLATFORM=x64
|
||||
|
||||
msbuild "%PRJFILE%" /m /fl /flp:LogFile="build_%BUILDCONFIG%.log" /p:Configuration=%BUILDCONFIG% /p:Platform=%PLATFORM% /p:BuildProjectReferences=false
|
||||
endlocal
|
@@ -25,7 +25,6 @@ set "HAVE_D3D=false"
|
||||
set "HAVE_ZLIB=false"
|
||||
set "HAVE_LIBLZMA=false"
|
||||
set "HAVE_RAPIDJSON=false"
|
||||
set "HAVE_OPENVR=false"
|
||||
set "HAVE_E57=false"
|
||||
set "CSF_OPT_INC="
|
||||
set "CSF_OPT_LIB32="
|
||||
@@ -78,9 +77,6 @@ if "%VCVER:~-4%" == "-uwp" (
|
||||
set VCLIB=%VCLIB%-uwp
|
||||
set VCPROP=Universal
|
||||
)
|
||||
if "%VCFMT%" == "vclang" (
|
||||
set VCLIB=vc14
|
||||
)
|
||||
rem echo VCVER=%VCVER% VCFMT=%VCFMT% VCLIB=%VCLIB% VCPROP=%VCPROP%
|
||||
|
||||
rem ----- Parsing of Visual Studio platform -----
|
||||
@@ -110,10 +106,6 @@ if not "%DevEnvDir%" == "" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "DevEnvDir=%%i\Common7\IDE\"
|
||||
)
|
||||
) else if /I "%VCFMT%" == "vclang" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "DevEnvDir=%%i\Common7\IDE\"
|
||||
)
|
||||
) else if /I "%VCFMT%" == "gcc" (
|
||||
rem MinGW
|
||||
) else (
|
||||
@@ -126,7 +118,6 @@ if not "%DevEnvDir%" == "" (
|
||||
echo vc14 = VS 2015
|
||||
echo vc141 = VS 2017
|
||||
echo vc142 = VS 2019
|
||||
echo vclang = VS 2019 with ClangCL toolset
|
||||
exit /B
|
||||
)
|
||||
|
||||
@@ -156,11 +147,6 @@ if /I "%VCFMT%" == "vc9" (
|
||||
set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
)
|
||||
set "VCPlatformToolSet=v142"
|
||||
) else if /I "%VCFMT%" == "vclang" (
|
||||
for /f "usebackq delims=" %%i in (`vswhere.exe -version "[16.0,16.99]" -latest -requires Microsoft.VisualStudio.Workload.%VCPROP% -property installationPath`) do (
|
||||
set "VCVARS=%%i\VC\Auxiliary\Build\vcvarsall.bat"
|
||||
)
|
||||
set "VCPlatformToolSet=ClangCL"
|
||||
) else if /I "%VCFMT%" == "gcc" (
|
||||
rem MinGW
|
||||
) else (
|
||||
@@ -190,7 +176,6 @@ if ["%HAVE_D3D%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DH
|
||||
if ["%HAVE_ZLIB%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_ZLIB" & set "CSF_DEFINES=HAVE_ZLIB;%CSF_DEFINES%"
|
||||
if ["%HAVE_LIBLZMA%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_LIBLZMA" & set "CSF_DEFINES=HAVE_LIBLZMA;%CSF_DEFINES%"
|
||||
if ["%HAVE_RAPIDJSON%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_RAPIDJSON" & set "CSF_DEFINES=HAVE_RAPIDJSON;%CSF_DEFINES%"
|
||||
if ["%HAVE_OPENVR%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_OPENVR" & set "CSF_DEFINES=HAVE_OPENVR;%CSF_DEFINES%"
|
||||
if ["%HAVE_E57%"] == ["true"] set "PRODUCTS_DEFINES=%PRODUCTS_DEFINES% -DHAVE_E57" & set "CSF_DEFINES=HAVE_E57;%CSF_DEFINES%"
|
||||
|
||||
rem Eliminate VS warning
|
||||
|
@@ -16,7 +16,6 @@ export HAVE_GLES2="false";
|
||||
export HAVE_ZLIB="false";
|
||||
export HAVE_LIBLZMA="false";
|
||||
export HAVE_RAPIDJSON="false";
|
||||
export HAVE_OPENVR="false";
|
||||
export HAVE_E57="false";
|
||||
export MACOSX_USE_GLX="false";
|
||||
export CSF_OPT_INC=""
|
||||
@@ -107,7 +106,6 @@ if [ "$HAVE_VTK" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -D
|
||||
if [ "$HAVE_ZLIB" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_ZLIB"; fi
|
||||
if [ "$HAVE_LIBLZMA" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_LIBLZMA"; fi
|
||||
if [ "$HAVE_RAPIDJSON" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_RAPIDJSON"; fi
|
||||
if [ "$HAVE_OPENVR" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_OPENVR"; fi
|
||||
if [ "$HAVE_E57" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DHAVE_E57"; fi
|
||||
# Option to compile OCCT with X11 libs on Mac OS X
|
||||
if [ "$MACOSX_USE_GLX" == "true" ]; then export CSF_OPT_CMPL="${CSF_OPT_CMPL} -DMACOSX_USE_GLX"; fi
|
||||
|
@@ -1,38 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
rem Setup environment
|
||||
call "%~dp0env.bat" %1 %2 %3
|
||||
|
||||
rem Define path to project file
|
||||
set "PRJFILE=%~dp0INSTALL.vcxproj"
|
||||
|
||||
if "%VCVER%" == "vc8" (
|
||||
call "%VS80COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc9" (
|
||||
call "%VS90COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc10" (
|
||||
call "%VS100COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc11" (
|
||||
call "%VS110COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc12" (
|
||||
call "%VS120COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc14" (
|
||||
call "%VS140COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc141" (
|
||||
call "%VS141COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else if "%VCVER%" == "vc142" (
|
||||
call "%VS142COMNTOOLS%/vsvars32.bat" > nul
|
||||
) else (
|
||||
echo Error: wrong VS identifier
|
||||
exit /B
|
||||
)
|
||||
|
||||
set BUILDCONFIG=Release
|
||||
if "%CASDEB%"=="i" set BUILDCONFIG=RelWithDebInfo
|
||||
if "%CASDEB%"=="d" set BUILDCONFIG=Debug
|
||||
if "%ARCH%"=="32" set PLATFORM=win32
|
||||
if "%ARCH%"=="64" set PLATFORM=x64
|
||||
|
||||
msbuild "%PRJFILE%" /m /fl /flp:LogFile="install_%BUILDCONFIG%.log" /p:Configuration=%BUILDCONFIG% /p:Platform=%PLATFORM% /p:BuildProjectReferences=false
|
||||
endlocal
|
@@ -159,7 +159,7 @@
|
||||
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>__TKDEP_DEBUG__</AdditionalDependencies>
|
||||
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
|
||||
<OutputFile>.\..\..\..\win32\__VCVER__\bind\__TKNAM__.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\..\win32\__VCVER__\libd;$(CSF_OPT_LIB32D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
@@ -255,7 +255,7 @@
|
||||
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>__TKDEP_DEBUG__</AdditionalDependencies>
|
||||
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
|
||||
<OutputFile>.\..\..\..\win64\__VCVER__\bind\__TKNAM__.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\..\win64\__VCVER__\libd;$(CSF_OPT_LIB64D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
|
@@ -149,7 +149,7 @@
|
||||
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>__TKDEP_DEBUG__</AdditionalDependencies>
|
||||
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\..\win32\__VCVER__\libd;$(CSF_OPT_LIB32D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
@@ -238,7 +238,7 @@
|
||||
<PreprocessorDefinitions>_DEBUG;$(CSF_DEFINES);%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>__TKDEP_DEBUG__</AdditionalDependencies>
|
||||
<AdditionalDependencies>__TKDEP__</AdditionalDependencies>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<AdditionalLibraryDirectories>..\..\..\win64\__VCVER__\libd;$(CSF_OPT_LIB64D);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
|
@@ -45,7 +45,6 @@ dev_guides/git_guide/git_guide.md
|
||||
dev_guides/tests/tests.md
|
||||
dev_guides/debug/debug.md
|
||||
dev_guides/upgrade/upgrade.md
|
||||
dev_guides/visualization/pbr_math.md
|
||||
|
||||
dev_guides/building/building.md
|
||||
dev_guides/building/3rdparty/3rdparty_windows.md
|
||||
|
@@ -26,6 +26,5 @@ dev_guides/contribution/coding_rules.md
|
||||
dev_guides/git_guide/git_guide.md
|
||||
dev_guides/tests/tests.md
|
||||
dev_guides/upgrade/upgrade.md
|
||||
dev_guides/visualization/pbr_math.md
|
||||
|
||||
tutorial/tutorial.md
|
||||
|
@@ -64,7 +64,7 @@ Then makefiles will appear in the build folder (e.g. <i> D:/occt/build-android <
|
||||
|
||||
Alternatively one may specify the values without a toolchain file:
|
||||
|
||||
> cmake -G "MinGW Makefiles" -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=D:/DevTools/android-ndk-r13b -DCMAKE_ANDROID_STL_TYPE=gnustl_shared -DCMAKE_SYSTEM_VERSION=21 -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_MAKE_PROGRAM=D:/DevTools/MinGW/bin/mingw32-make.exe -D3RDPARTY_DIR=D:/occt-3rdparty D:/occt
|
||||
> cmake -G "MinGW Makefiles" -DCMAKE_SYSTEM_NAME=Android -DCMAKE_ANDROID_NDK=D:/DevTools/android-ndk-r13b -DCMAKE_ANDROID_STL_TYPE=gnustl_shared -DCMAKE_SYSTEM_VERSION=15 -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_MAKE_PROGRAM=D:/DevTools/MinGW/bin/mingw32-make.exe -D3RDPARTY_DIR=D:/occt-3rdparty D:/occt
|
||||
|
||||
@figure{/dev_guides/building/android/images/android_image006.png}
|
||||
|
||||
|
@@ -150,8 +150,7 @@ Steps to prepare dump of the object into json:
|
||||
1. Create method <b>DumpJson</b>. The method should accept the output stream and the depth for the fields dump.
|
||||
Depth, equal to zero means that only fields of this class should be dumped. Default value -1 means that whole tree of dump will be built recursively calling dump of all fields.
|
||||
|
||||
2. Put into the first row of the method <b>OCCT_DUMP_CLASS_BEGIN</b> or <b>OCCT_DUMP_TRANSIENT_CLASS_BEGIN</b> (for Standard_Transient objects).
|
||||
This macro appends class name into output stream.
|
||||
2. Put into the first row of the method <b>OCCT_DUMP_CLASS_BEGIN</b>. This macro creates a local variable, that will open Json structure on start, and close on exit from this method.
|
||||
|
||||
3. Add several macro to store field values.
|
||||
|
||||
@@ -369,53 +368,3 @@ Each counter has its name shown when the collected statistics are printed.
|
||||
In DRAW, use command *dperf* to print all performance statistics.
|
||||
|
||||
Note that performance counters are not thread-safe.
|
||||
|
||||
@section occt_debug_sanitizers Use of compiler sanitizers
|
||||
|
||||
GCC and Clang compilers provide options for instrumenting the code with the tools intended for detection of run-time errors, called sanitizers.
|
||||
This section provides some hints for using sanitizers for detecting possible errors in OCCT code.
|
||||
|
||||
@subsection occt_debug_sanitizers_linux Linux
|
||||
|
||||
Example of configuration steps for Ubuntu:
|
||||
|
||||
1. In CMake configuration:
|
||||
|
||||
- Use up-to-date version of the GCC or CLang compiler; make sure that if CMAKE_CXX_COMPILER is set to C++ compiler (e.g. "clang++-6.0") and CMAKE_C_COMPILER is set to C compiler (e.g. "clang-6.0")
|
||||
- Ensure that CMAKE_LINKER is set to the C++ linker bundled with compiler (e.g. clang++-6.0); this is important to avoid linking problems
|
||||
- For building with Address sanitizer, set CMAKE_CXX_FLAGS and CMAKE_C_FLAGS to "-fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls"
|
||||
- For building with Undefined Behavior sanitizer, set CMAKE_CXX_FLAGS and CMAKE_C_FLAGS to "-fsanitize=undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls"
|
||||
- Set CMAKE_BUILD_TYPE to RelWithDebInfo to get more informative stack traces on errors
|
||||
|
||||
2. Build as usual (make)
|
||||
|
||||
Be prepared that it works much slower than normal build and consumes more disk space.
|
||||
|
||||
3. Before running executable, make sure that "llvm-symbolizer" is in PATH; this is necessary to get human-readable stack traces. The tool must have exactly that name.
|
||||
|
||||
If it is installed in common folder (/usr/bin or similar) with different name, one option is to create a symlink, for instance:
|
||||
> sudo ln -s /usr/bin/llvm-symbolizer-6.0 /usr/bin/llvm-symbolizer
|
||||
|
||||
Alternatively, add directory where actual llvm-symbolizer is located (such as /usr/lib/llvm-6.0/bin) to the PATH variable.
|
||||
|
||||
4. Set environment variable to disable memory leaks detection (they seem to be reported for every global variable at exit, not much useful):
|
||||
> export ASAN_OPTIONS=detect_leaks=0
|
||||
|
||||
5. Set environment variable CSF_CPULIMIT_FACTOR to reasonably large number to increase the time limits for program execution (used by OCCT tests) to compensate the performance penalty introduced by sanitizers:
|
||||
> export CSF_CPULIMIT_FACTOR=20
|
||||
|
||||
6. When using UBSan, set environment variable UBSAN_OPTIONS to get stack traces:
|
||||
> export UBSAN_OPTIONS=print_stacktrace=1
|
||||
|
||||
7. Run DRAW and perform tests as usual, keeping in mind that running with sanitizer is much heavier than normal build:
|
||||
> ./draw.sh relwithdeb <br>
|
||||
> Draw[]> testgrid -parallel 0
|
||||
|
||||
Note that when running tests under sanitizers, behavior may be different.
|
||||
Known problems (as of CLang 6.0) are:
|
||||
- Software signals (access violation etc.) are not handled
|
||||
- Heap memory usage always reports zero
|
||||
|
||||
@subsection occt_debug_sanitizers_windows Windows
|
||||
|
||||
Though CLang toolset is available in Visual Studio 2015 and newer, sanitizer do not seem to be available out of the box (last tested with VS 2019 16.2.3).
|
||||
|
@@ -11,10 +11,6 @@ The following documents provide information on OCCT building, development and te
|
||||
* @subpage occt_dev_guides__tests "Automatic Testing system"
|
||||
* @subpage occt_dev_guides__debug "Debugging tools and hints"
|
||||
|
||||
The following documents provide information on OCCT algorithms background:
|
||||
|
||||
* @subpage occt_dev_guides__pbr_math "Physically-based Rendering math (PBR for rasterization)"
|
||||
|
||||
The following guide provides information relevant to upgrading applications developed with previous versions of OCCT, to recent one:
|
||||
|
||||
* @subpage occt_dev_guides__upgrade "Upgrade from previous OCCT versions"
|
||||
|
@@ -1888,104 +1888,3 @@ Unexpected const-ness of Aspect_Window::DoResize() method has been removed, so t
|
||||
@subsection upgrade_750_rename Renaming of types
|
||||
|
||||
Enumeration BRepOffset_Type is renamed to ChFiDS_TypeOfConcavity.
|
||||
|
||||
@subsection upgrade_750_tkv3d TKV3d/TKService toolkits changes
|
||||
|
||||
The following changes could be highlighted while porting:
|
||||
* *Prs3d::GetDeflection()* has been moved to *StdPrs_ToolTriangulatedShape::GetDeflection()*.
|
||||
* *Prs3d_ShapeTool* has been moved to *StdPrs_ShapeTool*.
|
||||
* *StdSelect_ViewerSelector3d* has been moved to *SelectMgr_ViewerSelector3d*.
|
||||
* *Font_BRepFont* has been moved to *StdPrs_BRepFont*.
|
||||
* Visualization classes now use *TopLoc_Datum3D* (from *TKMath*) instead of *Geom_Transformation* (from *TKG3d*) as smart pointer to *gp_Trsf*.
|
||||
This is rather an internal change, but some applications might need to be updated.
|
||||
|
||||
@subsection upgrade_750_hlrangle Prs3d_Drawer deviation angle
|
||||
|
||||
Properties Prs3d_Drawer::HLRAngle() and Prs3d_Drawer::HLRDeviationCoefficient() have been removed from classes *Prs3d_Drawer*, *AIS_Shape* and *AIS_InteractiveContext*.
|
||||
Prs3d_Drawer::DeviationAngle() should be now used instead of Prs3d_Drawer::HLRAngle() and Prs3d_Drawer::DeviationCoefficient() instead of Prs3d_Drawer::HLRDeviationCoefficient().
|
||||
The default value of Prs3d_Drawer::DeviationAngle() property has been changed from 12 to 20 degrees to match removed Prs3d_Drawer::HLRAngle(), previously used as input for triangulation algorithm.
|
||||
|
||||
@subsection upgrade_750_hlrprs Changes in HLR presentation API
|
||||
|
||||
Methods computing HLR presentation within *PrsMgr_PresentableObject::Compute()* have been renamed to *PrsMgr_PresentableObject::computeHLR()*
|
||||
and now accept *Graphic3d_Camera* object instead of removed *Prs3d_Projector*.
|
||||
|
||||
@subsection upgrade_750_dimensions Dimension and Relation presentations moved from AIS to PrsDim
|
||||
|
||||
Presentation classes displaying Dimensions and Relations have been moved from *AIS* package to *PrsDim*.
|
||||
Corresponding classes should be renamed in application code (like *AIS_LengthDimension* -> *PrsDim_LengthDimension*).
|
||||
|
||||
@subsection upgrade_750_sensitiveEntity Select3D_SensitiveEntity interface change
|
||||
|
||||
The method Select3D_SensitiveEntity::NbSubElements() has been changed to be constant. Select3D_SensitiveEntity subclasses at application level should be updated accordingly.
|
||||
|
||||
|
||||
@subsection upgrade_750_Booleans Changes in Boolean operations algorithm
|
||||
|
||||
* TreatCompound method has been moved from *BOPAlgo_Tools* to *BOPTools_AlgoTools*. Additionally, the map parameter became optional:
|
||||
~~~~
|
||||
void BOPTools_AlgoTools::TreatCompound (const TopoDS_Shape& theS,
|
||||
TopTools_ListOfShape& theLS,
|
||||
TopTools_MapOfShape* theMap = NULL);
|
||||
~~~~
|
||||
|
||||
@subsection upgrade_750_Adaptor2d_OffsetCurve Offset direction change
|
||||
|
||||
Offset direction, which used in class Adaptor2d_OffsetCurve for evaluating values and derivatives of offset curve is unified for offset direction used in class Geom2d_OffsetCurve: now offset direction points to outer ("right") side of base curve instead of the previously used inner ("left") side. Old usage of class in any application should be changed something like that:
|
||||
|
||||
Adaptor2d_OffsetCurve aOC(BaseCurve, Offset) --> Adaptor2d_OffsetCurve aOC(BaseCurve, -Offset)
|
||||
|
||||
@subsection upgrade_750_message_messenger Message_Messenger interface change
|
||||
|
||||
Operators << with left argument *Handle(Message_Messenger)*, used to output messages with
|
||||
a stream-like interface, have been removed.
|
||||
This functionality is provided now by separate class *Message_Messenger::StreamBuffer*.
|
||||
That class contains a stringstream buffer which can be filled using standard stream
|
||||
operators. The string is sent to a messenger on destruction of the buffer object,
|
||||
call of its method Flush(), or using operator << with one of ostream manipulators
|
||||
(*std::endl, std::flush, std::ends*). Manipulator *Message_EndLine* has been removed,
|
||||
*std::endl* should be used instead.
|
||||
|
||||
New methods *SendFail(), SendAlarm(), SendWarning(), SendInfo()*, and *SendTrace()* are
|
||||
provided in both *Message_Messenger* class and as static functions in *Message* package
|
||||
(short-cuts to default messenger), returning buffer object for the output of
|
||||
corresponding type of the message.
|
||||
|
||||
The code that used operator << for messenger, should be ported as follows.
|
||||
|
||||
Before the change:
|
||||
~~~~~
|
||||
Handle(Message_Messenger) theMessenger = ...;
|
||||
theMessenger << "Value = " << anInteger << Message_EndLine;
|
||||
~~~~~
|
||||
|
||||
After the change, single-line variant:
|
||||
~~~~~
|
||||
Handle(Message_Messenger) theMessenger = ...;
|
||||
theMessenger->SendInfo() << "Value = " << anInteger << std::endl;
|
||||
~~~~~
|
||||
|
||||
After the change, extended variant:
|
||||
~~~~~
|
||||
Handle(Message_Messenger) theMessenger = ...;
|
||||
Message_Messenger::StreamBuffer aSender = theMessenger->SendInfo();
|
||||
aSender << "Array: [ ";
|
||||
for (int i = 0; i < aNb; ++i) { aSender << anArray[i] << " "; }
|
||||
aSender << "]" << std::endl; // aSender can be used further for other messages
|
||||
~~~~~
|
||||
|
||||
@subsection upgrade_750_message_printer Message_Printer interface change
|
||||
|
||||
Previously, sub-classes of *Message_Printer* have to provide a triplet of *Message_Printer::Send()* methods accepting different string representations: TCollection_AsciiString, TCollection_ExtendedString and Standard_CString.
|
||||
*Message_Printer* interface has been changed, so that sub-classes now have to implement only single method *Message_Printer::send()* accepting TCollection_AsciiString argument and having no Endl flag, which has been removed.
|
||||
Old three Message_Printer::Send() methods remain defined virtual with unused last argument and redirecting to new send() method by default.
|
||||
|
||||
@subsection upgrade_750_prd3d_root Prs3d_Root deprecation
|
||||
|
||||
Redundant class Prs3d_Root has been marked as deprecated - Prs3d_Presentation::NewGroup() should be called directly.
|
||||
|
||||
@subsection upgrade_750_draw_hotkeys Draw Harness hotkeys
|
||||
|
||||
Draw Harness hotkeys **W** (Wireframe) and **S** (Shaded) have been re-mapped to **Ctrl+W** and **Ctrl+S**.
|
||||
Hotkey **A** has been remapped to **Backspace**.
|
||||
Hotkeys WASD and Arrays are now mapped for walk-through navigation in 3D Viewer.
|
||||
|
@@ -1,777 +0,0 @@
|
||||
PBR math (rasterization) {#occt_dev_guides__pbr_math}
|
||||
========================
|
||||
@tableofcontents
|
||||
|
||||
# Preface
|
||||
|
||||
**Empirical** illumination models like **Phong reflection model** have been used in real-time graphics for a long time due to their simplicity, convincing look and affordable performance.
|
||||
Before programmable pipeline has been introduced, graphics cards implemented Gouraud shading as part of fixed-function Transformation & Lighting (T&L) hardware blocks.
|
||||
Nowadays, however, numerous trade-offs of this simplicity (like lighting partially baked into object material properties and others) pushed developers to **Physically-Based Rendering** (**PBR**) illumination models.
|
||||
|
||||
PBR models try to fit surface shading formulas into constrains of physical laws of light propagation / absorption / reflection - hence, called "physically-based".
|
||||
There are two main categories of PBR illumination:
|
||||
|
||||
1. Non-real-time renderer (cinematic).
|
||||
2. Real-time renderer.
|
||||
|
||||
The main objective of cinematic renderer is uncompromised quality, so that it relies on ray-tracing (path-tracing) rendering pipeline.
|
||||
Although performance of current graphics hardware does not make it possible using computationally-intensive path-tracing renderer in real-time graphics, it can be used in interactive fashion.
|
||||
|
||||
"Physically-based" does not necessarily mean physically-correct/precise.
|
||||
The main objective of real-time PBR renderer is to be fast enough even on low-end graphics hardware.
|
||||
So that in contrast, it hardly relies on rasterization rendering pipeline, various approximations and tricks making it applicable in real-time, while looking good enough and preserving some physical properties.
|
||||
|
||||
OCCT 3D Viewer provides both kinds of PBR renderers, and although they share some details in common, this article is devoted to real-time PBR metallic-roughness illumination model.
|
||||
This article describes the math underneath PBR shading in OCCT 3D Viewer and its GLSL programs.
|
||||
However, this article does not clarifies related high-level APIs nor PBR material creation pipelines, as this is another topic.
|
||||
|
||||
# Notation
|
||||
|
||||
| | | |
|
||||
|-:|:-|:-|
|
||||
| \f$n\f$ | normal (on surface) | \f$\|n\|=1\f$ |
|
||||
| \f$v\f$ | view direction | \f$\|v\|=1\f$ |
|
||||
| \f$l\f$ | light | \f$\|l\| = 1\f$ |
|
||||
| \f$h=\frac{v+l}{\|v + l\|}\f$ | half vector | |
|
||||
| \f$m\f$ | metallic factor | \f$[0, 1]\f$ |
|
||||
| \f$r\f$ | roughness factor | \f$[0, 1]\f$ |
|
||||
| \f$IOR\f$ | index of refraction | \f$[1, 3]\f$ |
|
||||
| \f$c\f$ | albedo color | \f$(R, G, B)\f$ |
|
||||
|
||||
\f$\cos\theta_l=(n \cdot l)\f$
|
||||
|
||||
\f$\cos\theta_v=(n \cdot v)\f$
|
||||
|
||||
\f$\cos\theta_h=(n \cdot h)\f$
|
||||
|
||||
\f$\cos\theta_{vh}=(v \cdot h)\f$
|
||||
|
||||
# Illumination model
|
||||
|
||||
The main goal of illumination model is to calculate outgoing light radiance \f$L_o\f$ along the certain direction.
|
||||
The starting point of calculation might be the view direction \f$v\f$ aimed from point on surface (or in more general case just in space) to viewer position.
|
||||
Considering the point on opaque surface with normal \f$n\f$ the main equation of illumination can be defined as:
|
||||
|
||||
\f[L_o=\int\limits_H f(v, l) L_i(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
Where \f$L_i(l)\f$ is light radiance coming from \f$l\f$ direction, \f$f(v,l)\f$ is **Bidirectional Reflectance Distribution Function** (**BRDF**) and \f$H\f$ is hemisphere which is oriented regarding to the surface normal \f$n\f$.
|
||||
Opaqueness of the surface mentioned earlier is important because in that case hemisphere is enough.
|
||||
More general model will require to consider directions all around a whole sphere and is not observed in this paper.
|
||||
\f$\cos\theta_l\f$ factor appearing is caused by affection of surface area and light direction mutual orientation to the amount of radiance coming to this area.
|
||||
This is mainly due to geometric laws. The rest part of integral is the key of the whole illumination model.
|
||||
BRDF defines it's complexity and optical properties of material.
|
||||
It has to model all light and material interactions and also has to satisfy some following criteria in order to be physical correct:
|
||||
* Positivity: \f$f(v,l) \geq 0\f$
|
||||
* Helmholtz reciprocity: \f$f(v,l) = f(l, v)\f$ (follows from 2<sup>nd</sup> Law of Thermodynamics)
|
||||
* Energy conservation: \f$\displaystyle \forall v \, \int\limits_H f(v,l) \cos\theta_l \, \mathrm{d}l = 1\f$ (in order not to reflect more light than came)
|
||||
|
||||
It is worth to be mentioned that \f$f(v,l)\f$ depends on \f$n\f$ also but it is omitted to simplify notation. BRDF is usually split into two parts:
|
||||
|
||||
\f[f(v,l) = f_d(v,l)+f_s(v, l)\f]
|
||||
|
||||
Where \f$f_s(v, l)\f$ (specular BRDF) models reflection light interaction on surface and \f$f_d(v,l)\f$ (diffuse BRDF) models other processes happening depth in material (subsurface scattering for example).
|
||||
So that illumination equation might be rewritten as:
|
||||
|
||||
\f[L_o=\int\limits_H (f_d(v,l)+f_s(v, l)) L_i(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
PBR theory is based on **Cook-Torrance specular BRDF**. It imagines surface as set of perfectly reflected micro faces distributed on area in different ways which is pretty good model approximation of real world materials.
|
||||
If this area is small enough not to be able to recognize separate micro surfaces the results becomes a sort of averaging or mixing of every micro plane illumination contribution.
|
||||
In that level it allows to work with micro faces in statistical manner manipulating only probabilities distributions of micro surfaces parameters such as normals, height, pattern, orientation etc.
|
||||
In computer graphics pixels are units of images and it usually covers a relatively large areas of surfaces so that micro planes can be considered to be unrecognizable.
|
||||
Going back to the BRDF the Cook-Torrance approach has the following expression:
|
||||
|
||||
\f[f_s(v,l)=\frac{DGF}{4\cos\theta_l\cos\theta_v}\f]
|
||||
|
||||
Three parts presented in nominator have its own meaning but can have different implementation with various levels of complexity and physical accuracy.
|
||||
In that paper only one certain implementation is used. The \f$D\f$ component is responsible for **micro faces normals distribution**.
|
||||
It is the main instrument that controls reflection's shape and strength according to **roughness** \f$r\f$ parameter.
|
||||
The implementation with good visual results is **Trowbridge-Reitz GGX** approach used in Disney's RenderMan and Unreal Engine:
|
||||
|
||||
\f[D=\frac{\alpha^2}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
|
||||
|
||||
Where \f$\alpha = r^2\f$. This square in needed only for smoother roughness parameter control.
|
||||
Without it the visual appearance of surface becomes rough too quickly during the parameter's increasing.
|
||||
|
||||
The second \f$G\f$ component is called **geometric shadowing** or attenuation factor.
|
||||
The point is that micro surfaces form kind of terrain and can cast shadows over each other especially on extreme viewing angles.
|
||||
**Schlick's model** has been chosen as implementation:
|
||||
|
||||
\f[\displaystyle G=\frac{\cos\theta_l \cos\theta_v}{(\cos\theta_l(1-k)+k)(\cos\theta_v(1-k)+k)}\f]
|
||||
|
||||
Where \f$k=\frac{\alpha}{2}\f$, which means \f$k=\frac{r^2}{2}\f$ in terms of this paper.
|
||||
But \f$G\f$ depends on many factors so that it's approximations has float nature and can be modified a little bit in some cases in order to get more pleasant visual results.
|
||||
One of this modification will be described later in following chapters.
|
||||
|
||||
The last component \f$F\f$ shows **how much light is reflected from surface** and is called **Fresnel's factor**.
|
||||
The rest amount of radiance might be absorbed or refracted by material.
|
||||
The most accurate expression of it is pretty complicate for calculation so that there is a variety of approximations.
|
||||
The good one with less computation efforts is **Schlick's implementation**:
|
||||
|
||||
\f[F=F_0+(1-F_0)(1-\cos\theta_{vh})^5\f]
|
||||
|
||||
Here \f$F_0\f$ is material's response coefficient at normal incidence (zero angle).
|
||||
Fresnel's factor has to be calculated differently for metals and dielectric/non-metals, but PBR theory tries to come up with universal formula for all types of material.
|
||||
In order to do that it is needed to be noticed that Schlick's approximation is applicable only to non-conductors and in that case \f$F_0 = F_{dielectric} = \left(\frac{1-IOR}{1+IOR}\right)^2\f$.
|
||||
**Index of Refraction** \f$IOR\f$ shows the proportion between light speed in vacuum (or even in air) and in material.
|
||||
The reference value of \f$IOR\f$ for plastic is **1.5**, and this value can be considered as default for all unknown dielectrics.
|
||||
In practice this parameter controls reflectance ability of material.
|
||||
Also it should be remembered that this approximation produces poor results with large \f$IOR\f$ values so that it is recommended to be kept in range of \f$[1, 3]\f$ in order to get plausible Fresnel's factor.
|
||||
This formula might be further propagated onto metals by using \f$F_0\f$ measured specifically for certain metal.
|
||||
It can be considered as some kind of a 'color' of metal and can be stored as albedo parameter \f$c\f$.
|
||||
And the final step of defining Fresnel's factor formula is mixing all this \f$F_0\f$ using metallic parameter \f$m\f$ (**metalness**):
|
||||
|
||||
\f[F_0 = F_{dielectric}(1-m)+cm\f]
|
||||
|
||||
For pure dielectrics with \f$m=0\f$ exactly Schlick's approximation will be used.
|
||||
For pure metals with \f$m=1\f$ it will be a little inaccurate but the same formula with measured \f$F_0\f$ values.
|
||||
Everything else for \f$m \in (0, 1)\f$ is not physically correct and it is recommended to keep \f$m\f$ exactly 1 or 0.
|
||||
Intermediate values may represent mixed areas for smooth transition between materials - like partially rusted metal (rust is mostly dielectric).
|
||||
Also it might be useful when parameters are read from textures with filtering and smoothing.
|
||||
|
||||
BRDF described above has one important trait making computations easier called **isotropy**.
|
||||
Isotropy in this case means independence from rotation about normal resulting from supposition of uniform micro faces distribution at any direction along a surface.
|
||||
It allows to simplify random samples generation during Monte-Carlo integrals calculation and reduce dimensions of some lookup tables, which will be discussed in following chapters.
|
||||
Of course, isotropic materials form only subset of all real world's materials, but this subset covers majority of cases.
|
||||
There are special models considering special anisotropic traits of surfaces like a grinding of metal or other with dependency on rotation about normal;
|
||||
these models require special calculation tricks and additional parameters and are out of scope of this paper.
|
||||
|
||||
The only thing left to do is to define \f$f_d(v,l)\f$.
|
||||
This part is responsible for processes happening in depth of material.
|
||||
First of all the amount of input light radiance participating in these processes is needed to be calculated.
|
||||
And it exactly can be realized from already known Fresnel's factor \f$F\f$ showing amount of reflected light but in negative term in this case in order to get the radiance left after reflection:
|
||||
|
||||
\f[1-F\f]
|
||||
|
||||
This part of ingoing light is assumed to be refracted in depth of surface and variety of events may happen there.
|
||||
A sequence of absorptions, reflections and reemissions more or less leads to light's subsurface scattering.
|
||||
Some part of this scattered light can go back outside but in modified form and in pretty unpredictable directions and positions.
|
||||
For opaque materials this part is noticeable and forms it's own color.
|
||||
If subsurface's paths of light are small enough and points of output are distributed locally around the input point it's possible to work in statistical way similar to the micro faces.
|
||||
This assumption covers a big amount of real world opaque materials.
|
||||
Other materials like skin, milk etc. with noticeable effect of subsurface scattering usually presented in form of partial translucency and some kind of self emission
|
||||
have more widely distributed output points and require more accurate and complicate ways of modeling with maybe some theory and techniques from volumetric rendering.
|
||||
The simple but visually enough assuming for statistically driven type of materials is just the same radiance for any direction. It results to **Lambertian's BRDF**:
|
||||
|
||||
\f[\frac{c}{\pi}\f]
|
||||
|
||||
Where \f$\pi\f$ is normalization coefficient in order to meet BRDF's criteria and \f$c\f$ is material's own color formed by adventures of light under surface.
|
||||
There is one detail about light interaction bringing some physicality to the model, and that is an absence of this diffuse component in metals.
|
||||
Metals reflect main part of light and the rest of it is absorbed being transformed into other form (mostly heat).
|
||||
That is the main visual difference between metallic and non-metallic materials realizing of which brings model to higher level of quality in compare to older non-physical models.
|
||||
|
||||
So that all parts described above can be combined into united diffuse BRDF:
|
||||
|
||||
\f[f_d(v,l) = (1-F)(1-m)\frac{c}{\pi}\f]
|
||||
|
||||
\f$m\f$ is recommended to be exactly 1 or 0 but all values between can represent transition areas, as mentioned before.
|
||||
|
||||
In this chapter one possible implementation of illumination model reflecting main PBR principles has been defined.
|
||||
The next step is using of it in practice.
|
||||
|
||||
# Practical application
|
||||
|
||||
It's time to apply deduced illumination model in practice.
|
||||
And the first step of it is separation of **direction based light sources** from illumination integral.
|
||||
Directional nature of such light sources means possibility to calculate it's influence to point of surface using only one direction and its intensity.
|
||||
Usually sources of this type do not have physical size and are represented only by position in space (for point or spot lights) or by direction itself (direction light imagined to be too far point sources like sun).
|
||||
This is just a kind of abstraction, while real world light emitters have noticeably sizes.
|
||||
But sources with realistic form and size cannot be presented in discrete term and require continuous integrals calculations or special approximations in order to be accurately injected to the model.
|
||||
In most cases direct based light sources in form of emitting points in space or just certain directions are good approximations and are enough for beginning.
|
||||
Having finite discrete amount of it in scene and considering only single direction from every of these lights, the integral is transformed just to the sum:
|
||||
|
||||
\f[L_{direct} = \sum_{j=1}^M f(v, l_j) L_i^{direct}(l_j) \cos\theta_{l_j}\f]
|
||||
|
||||
Where \f$M\f$ is a number of sources, \f$l_j\f$ is a direction and \f$L_i^{direct}\f$ is an intensity related to this direction.
|
||||
\f$direct\f$ label means that illumination has been computed directly from sources.
|
||||
The BRDF can be used directly without any calculation problems.
|
||||
The only exception might be \f$k\f$ in \f$G\f$ factor - it is recommended to be equal \f$\frac{(r+1)^2}{8}\f$ in order to get more pleasant results (that is modification mentioned in previous chapter).
|
||||
And actually it is enough to finally see something.
|
||||
There will be correct visualization with assumption of complete dark environment and absence of other points influence.
|
||||
It is called **local illumination**. Based on this name there is also a global or **indirect illumination** and that is the rest of integral:
|
||||
|
||||
\f[L_{indirect} = \int\limits_H f(v, l) L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
It includes influence of light reflected or scattered from other points and environment's contribution.
|
||||
It's impossible to achieve photorealistic results without this component, but is is also very difficult to compute.
|
||||
While the cross point light interaction cannot be calculated in a simple way (especially in real time rendering), the environment illumination has some options to be realized via precomputational work before visualization.
|
||||
But right now lets summarize the practical application of illumination model.
|
||||
At this moment the output radiance is represented as:
|
||||
|
||||
\f[L_o = L_{direct} + L_{indirect}\f]
|
||||
|
||||
Where \f$L_{direct}\f$ is direction based light sources contribution which can be directly computed just applying bare formulas.
|
||||
It is enough to get some results in terms of local illumination but without \f$L_{indirect}\f$ component image will not be looked lifelike.
|
||||
\f$L_{indirect}\f$ is not trivial thing for calculation and that is stumbling block for real time rendering applications.
|
||||
But it can be relatively easy implemented in case of environment illumination via some precomputational work about which will be told in details in following chapters.
|
||||
|
||||
# Image based lighting
|
||||
|
||||
The next goal after \f$L_{direct}\f$ calculation is to find \f$L_{indirect}\f$.
|
||||
And it would be easier if \f$L_i^{indirect}(l)\f$ was known for every \f$l\f$.
|
||||
That is the main assumption of **image based lightning** (**IBL**).
|
||||
In practice, it can be achieved using environment image map, which is a special image representing illumination from all possible directions.
|
||||
This image might be a photo capturing a real world environment (spherical 360 degrees panoramas) or generated image baking the 3D scene itself, including in that case reflections of other objects.
|
||||
Environment image might be packed in different ways - **cube maps** and equirectangular maps are the most commonly used.
|
||||
Anyway, it allows \f$L_i^{indirect}(l)\f$ to be defined for every \f$l\f$ and its practical implementation in form of images gives name for this approach.
|
||||
Lets back to indirect illumination integral:
|
||||
|
||||
\f[L_{indirect} = \int\limits_H f(v, l) L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
Substituting the BRDF by its expression allows to split indirect illumination into diffuse and specular components:
|
||||
|
||||
\f[L_{indirect} = \int\limits_H f_d(v,l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l + \int\limits_H f_s(v,l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l = \f]
|
||||
|
||||
\f[= (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l + \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_l \cos\theta_v}L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
This splitting seems not to lead to simplicity of calculation but these two parts will be computed in slightly different ways in future.
|
||||
Lets write down this separately:
|
||||
|
||||
\f[L_{indirect}^d = (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
\f[L_{indirect}^s = \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_v \cos\theta_l} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
Next transformations of these expressions require understanding of numerical way to find hemisphere integral and also its performance optimization techniques.
|
||||
And that the topic of the next chapter.
|
||||
|
||||
# Monte-Carlo numeric integration
|
||||
|
||||
**Monte-Carlo** is one of numeric methods to **find integral**.
|
||||
It is based on idea of mathematical expectation calculation.
|
||||
In one dimensional case if \f$f(x)\f$ is a function with parameter distributed according to probability density \f$p(x)\f$ the mathematical expectation of it can be found using following expression:
|
||||
|
||||
\f[E = \int\limits_{-\infty}^\infty f(x) p(x)\, \mathrm{d}x\f]
|
||||
|
||||
Also this expectation can be approximated in statistical term using certain sequence of random variable \f$x\f$:
|
||||
|
||||
\f[E \approx \frac{1}{N} \sum_{i=1}^{N} f(x_i)\f]
|
||||
|
||||
It can be used in general definite integrals calculations.
|
||||
Just valid \f$p(x)\f$ defined on \f$[a, b]\f$ range and sequence \f$x_i\f$ generated according to it are needed for that:
|
||||
|
||||
\f[\int\limits_a^b f(x)\, \mathrm{d}x = \int\limits_a^b \frac{f(x)}{p(x)}p(x)\, \mathrm{d}x = \int\limits_{-\infty}^{\infty} \frac{f(x)}{p(x)}p(x)\, \mathrm{d}x \approx \frac{1}{N} \sum_{i=1}^{N} \frac{f(x_i)}{p(x_i)}\f]
|
||||
|
||||
Where \f$f(x)\f$ is considered to be equal to zero outside of \f$[a, b]\f$ range.
|
||||
This is also true for functions on sphere or hemisphere:
|
||||
|
||||
\f[\int\limits_{H|S} f(l)\, \mathrm{d}l \approx \frac{1}{N}\sum_{i=1}^{N} \frac{f(l_i)}{p(l_i)}\f]
|
||||
|
||||
The main questions are choosing \f$p(l)\f$ and generating samples \f$l_i\f$.
|
||||
The one of the simple ways is uniform distribution along sphere or hemisphere.
|
||||
Lets realize that on sphere for example.
|
||||
There are \f$4\pi\f$ possible directions in terms of sphere's areas and steradians (direction can be presented as dot on a unit sphere):
|
||||
|
||||
\f[\int\limits_S 1\, \mathrm{d}l = 4\pi\f]
|
||||
|
||||
Where \f$S\f$ is the unit sphere.
|
||||
In order to be uniform \f$p(l)\f$ must be constant and satisfy normalization criteria:
|
||||
|
||||
\f[\int\limits_S p(l)\, \mathrm{d}l = 1\f]
|
||||
|
||||
So that \f$p(l) = \frac{1}{4\pi}\f$.
|
||||
Usually direction \f$l\f$ is parametrized by spherical coordinates \f$\phi \in [0, 2\pi]\f$ and \f$\theta \in [0, \pi]\f$ boiling down to the 2D samples generation.
|
||||
But in these terms joint \f$p(\theta, \phi)\f$ will be looked slightly different due to variables transition.
|
||||
\f$l\f$ is defined in regular Cartesian coordinates \f$l=(x, y, z)\f$ with \f$\|l\| = 1\f$.
|
||||
The spherical coordinates transform looks like:
|
||||
|
||||
\f[x = r\sin\theta\cos\phi,\, y = r\sin\theta\sin\phi,\, z = r\cos\theta\f]
|
||||
|
||||
Where \f$r = 1\f$.
|
||||
In order to express probability density using new variables it is needed to multiply this density by Jacobian of transform:
|
||||
|
||||
\f[p(\theta,\phi) = p(l)|J_T|\f]
|
||||
|
||||
Where:
|
||||
|
||||
\f[|J_T| = \begin{vmatrix} \frac{\partial x}{\partial r} & \frac{\partial x}{\partial \theta} & \frac{\partial x}{\partial \phi} \\ \frac{\partial y}{\partial r} & \frac{\partial y}{\partial \theta} & \frac{\partial y}{\partial \phi} \\ \frac{\partial z}{\partial r} & \frac{\partial z}{\partial \theta} & \frac{\partial z}{\partial \phi} \end{vmatrix} = r^2\sin\theta\f]
|
||||
|
||||
So that joint probability density in new variables looks like:
|
||||
|
||||
\f[p(\theta, \phi) = \frac{\sin\theta}{4\pi}\f]
|
||||
|
||||
This variable transfer rule of **Probability Density Function** (**PDF**) will be useful in following chapters, when integral calculation optimization techniques will be being told.
|
||||
Having \f$p(\theta, \phi)\f$ the partial single dimensional probability densities are able to be found:
|
||||
|
||||
\f[p(\phi) = \int\limits_0^\pi p(\theta, \phi)\, \mathrm{d}\theta = \frac{1}{4\pi} \int\limits_0^\pi \sin\theta\, \mathrm{d}\theta = \frac{1}{2\pi}\f]
|
||||
|
||||
\f[p(\theta) = \int\limits_0^{2\pi} p(\theta, \phi)\, \mathrm{d}\phi = \frac{\sin\theta}{4\pi}\int\limits_0^{2\pi}1\, \mathrm{d}\phi = \frac{\sin\theta}{2}\f]
|
||||
|
||||
The final step is sequence generation itself.
|
||||
In order to be able to generate values with arbitrary distributions it is helpful to start from uniform numbers in range of \f$[0, 1]\f$.
|
||||
And that can be done via any known true- and pseudo- random generators.
|
||||
Even simple \f$\frac{1}{i}\f$ sequence is appropriate for beginning but it can be not so efficient in terms of computations convergence.
|
||||
There are specially designed series for the last reason and it will be tackled in chapter about optimizations.
|
||||
The \f$\phi\f$ variable is noticed to be uniformly distributed so that it can be directly generated without any additional manipulations.
|
||||
Just range \f$[0, 1]\f$ is needed to be mapped to range \f$[0, 2\pi]\f$.
|
||||
For any other variables including \f$\theta\f$ the inverse transform sampling approach can be applied.
|
||||
First of all **cumulative distribution function** (**CDF**) is needed to be found.
|
||||
It is probability of random value to be less than argument of this functions by definition.
|
||||
For continues distributions it can be expressed in following form:
|
||||
|
||||
\f[F(x) = \int\limits_{-\infty}^x p(x')\, \mathrm{d}x'\f]
|
||||
|
||||
Lets find CDF for \f$\theta\f$:
|
||||
|
||||
\f[F(\theta) = \int\limits_{-\infty}^\theta p(\theta')\, \mathrm{d}\theta' = \int\limits_0^\theta \frac{\sin\theta'}{2}\, \mathrm{d}\theta' = \frac{1-\cos\theta}{2}\f]
|
||||
|
||||
The CDF maps \f$\theta\f$ values from range of \f$[0, \pi]\f$ to probability in range of \f$[0, 1]\f$.
|
||||
The next step is to find inverse cumulative function which can be not so trivial sometimes but pretty obvious in current case:
|
||||
|
||||
\f[F^{-1}(u) = \arccos(1-2u)\f]
|
||||
|
||||
If substitute uniform distributed in range \f$[0, 1]\f$ values \f$u\f$ as argument of this function the values with origin probability density will appear.
|
||||
In other words:
|
||||
|
||||
\f[\theta = \arccos(1 - 2u),\, u \in [0, 1],\, p(u) = 1 \Rightarrow p(\theta) = \frac{\sin\theta}{2}\f]
|
||||
|
||||
That is the key of this random values generation technique.
|
||||
All steps described above can be also done for hemisphere:
|
||||
|
||||
\f[p(l) = \frac{1}{2\pi}\f]
|
||||
|
||||
\f[p(\theta, \phi) = \frac{\sin\theta}{2\pi}\f]
|
||||
|
||||
\f[p(\phi) = \int\limits_0^\frac{\pi}{2} p(\theta, \phi)\, \mathrm{d}\theta = \frac{1}{2\pi} \int\limits_0^\frac{\pi}{2} \sin\theta\, \mathrm{d}\theta = \frac{1}{2\pi}\f]
|
||||
|
||||
\f[p(\theta) = \int\limits_0^{2\pi} p(\theta, \phi)\, \mathrm{d}\phi = \frac{\sin\theta}{2\pi}\int\limits_0^{2\pi}1\, \mathrm{d}\phi = \sin\theta\f]
|
||||
|
||||
\f[\theta = \arccos(1-u)\f]
|
||||
|
||||
Mote-Carlo integration cannot guarantee exact estimation of convergence speed with using random generated samples.
|
||||
There is only probability estimation of it.
|
||||
But this algorithm is pretty universal and relatively simple to be applied to almost any function using at least uniform distributed points.
|
||||
Moreover special \f$p(l)\f$ can be chosen and special pseudo-random sequences can be designed in order to speed up convergence for some functions (following chapter talk about that in details).
|
||||
That is why this method is widely used in computer graphics and demonstrates good results.
|
||||
Also another one advantage is worth to be mentioned - possibility to iteratively accumulate computations and present intermediate results during rendering which is used in some ray tracing applications.
|
||||
|
||||
# Split sum
|
||||
|
||||
Lets go back to the image based lighting and the figure of specular component.
|
||||
As was defined before that is hemisphere integral with following expression:
|
||||
|
||||
\f[L_{indirect}^s = \frac{1}{4}\int\limits_H \frac{DFG}{\cos\theta_v \cos\theta_l} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
The Monte-Carlo integration algorithm can be directly applied:
|
||||
|
||||
\f[L_{indirect}^s = \int\limits_H f_s(v, l)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l \approx \frac{1}{N}\sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)}\f]
|
||||
|
||||
\f$p(v, l_i)\f$ depends on \f$v\f$ and implicitly on \f$r\f$ in order to be completely general.
|
||||
Optimization strategies use different samples distributions for different view direction orientations and roughness values.
|
||||
Anyway even with all optimization techniques this algorithm continues to require too much calculations.
|
||||
Good visual results require noticeable number of samples and using this approach for every point in real time rendering becomes unrealistic.
|
||||
The way to avoid these enormous calculations is doing them beforehand somehow.
|
||||
The first trick on the way to this is split the sum separating environment light component:
|
||||
|
||||
\f[L_{indirect}^s \approx \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)} \approx \left( \frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \right) \left( \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) \cos\theta_{l_i}}{p(v, l_i)} \right)\f]
|
||||
|
||||
Where the second brackets represent approximation of integral so that the expression can be rewritten as:
|
||||
|
||||
\f[L_{indirect}^s \approx \frac{1}{N} \sum_{i=1}^N \frac{f_s(v, l_i) L_i^{indirect}(l_i) \cos\theta_{l_i}}{p(v, l_i)} \approx \left( \frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \right) \int\limits_H f_s(v, l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
This integral is exact \f$L_{indirect}^s\f$ in condition when \f$L_i^{indirect}(l) = 1\f$ what just means white uniform environment.
|
||||
The sum before it is kind of averaged environment illumination.
|
||||
The main accomplishment after all this manipulations is possibility to calculate light and BRDF components separately.
|
||||
The sum with \f$L_i^{indirect}(l_i)\f$ can be computed beforehand for every normal direction and stored to image called specular map but with some valuable details.
|
||||
The problem is that \f$l_i\f$ samples must be generated according to \f$p(v, l_i)\f$ distribution depended on \f$v\f$ and \f$r\f$ as was mentioned earlier.
|
||||
Variation of normal is not enough in that case and these variables are needed to be considered too.
|
||||
The ways to resolve it are topic of one of the following chapters and now understanding the fact that at least this part can be precomputed before rendering is enough for now.
|
||||
And it is important not to miss out that there is no more BRDF influence in this sum and only \f$p(v, l)\f$ can affect in this case.
|
||||
That is why it is so important to strict to PDF during samples generation and that is why \f$p(v, l)\f$ must be correlated with BRDF somehow in this approximation approach with splitting.
|
||||
For example completely mirroring materials with \f$r = 0\f$ will not be looked as expected if just uniform distribution is used
|
||||
because such surfaces have only one possible direction from which light can be reflected along view direction in compare with \f$N\f$ absolutely scattered in case of uniform or many other distributions.
|
||||
|
||||
The rest part also can be saved to image. Lets unroll its expression:
|
||||
|
||||
\f[\int\limits_H f_s(v, l) \cos\theta_l\, \mathrm{d}l = \int\limits_H \frac{DGF}{4\cos\theta_v \cos\theta_l} \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
This integral is not actually a scalar.
|
||||
That is RGB value due to only \f$F\f$ factor and even more only to \f$F_0\f$.
|
||||
In order to simplify future computations \f$F_0\f$ is needed to be moved out of integral.
|
||||
Substitution of Schlick's approximation helps to achieve it:
|
||||
|
||||
\f[F = F_0+(1-F_0)(1-\cos\theta_{vh})^5 = F_0(1-(1-\cos\theta_{vh})^5) + (1-\cos\theta_{vh})^5\f]
|
||||
|
||||
\f[\int\limits_H \frac{DGF}{\cos\theta_v \cos\theta_l} \cos\theta_l\, \mathrm{d}l = F_0 \int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} (1-(1-\cos\theta_{vh})^5) \cos\theta_l\, \mathrm{d}l + \int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} (1-\cos\theta_{vh})^5 \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
This form may not look easier, but it has several advantages.
|
||||
The first one is independence from globally defined \f$L_i^{indirect}(l)\f$, so that normal orientation does not matter and can be set in any handful way for calculations (Z axis for example).
|
||||
The second one results from isotropic illumination system allowing \f$\phi\f$ component of view vector to be set arbitrarily (0 for example) and \f$\cos\theta_v\f$ will be enough to define view direction.
|
||||
And the third one is scalar nature of integrals so that only two precomputed numbers are needed to find BRDF part of \f$L_{indirect}^s\f$.
|
||||
Considering dependency of these integrals from \f$\cos\theta_v\f$ and \f$r\f$ both of it can be precomputed and stored to 2D look-up image variating these two parameters in range \f$[0, 1]\f$ with two channels consisting of scale and bias for \f$F_0\f$.
|
||||
|
||||
Current result for \f$L_{indirect}^s\f$ is computing it using 2D image for BRDF part and omnidirectional image for environment illumination.
|
||||
There were a lot of words about Monte-Carlo optimizations techniques and about PDF choice which is important not only in terms of numeric integration but in terms of visual results correctness.
|
||||
It's time to talk about that.
|
||||
|
||||
# Importance sampling
|
||||
|
||||
Current goal is to speed up Monte-Carlo integration of Cook-Torrance like integrals with following expression:
|
||||
|
||||
\f[\int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} g(v, l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
Where \f$g(v, l)\f$ is just arbitrary function representing Fresnel's factor itself or its components.
|
||||
In order to increase convergence the samples with larger contribution (or in other words with larger function's values) have to appear more frequently than others proportionally to its contribution.
|
||||
So that less significant summand with less influence to result will be considered rarely and in opposite way parts brining noticeable changes to the sum will be taken often.
|
||||
That is the main idea of **importance sampling technique**.
|
||||
\f$p(l)\f$ has to represent significance of sample in terms of integrated function via probability somehow.
|
||||
And it will be like that if PDF is already part of original function because in that case probability density directly affects to contribution forming.
|
||||
Separating this distribution component is one possible and effective way to realize importance sampling strategy.
|
||||
In integral presented above PDF part already exists and that is \f$D\f$ component.
|
||||
But it is distribution of micro faces normals or ideally reflection direction or \f$h\f$ in other word and not light directions distribution which is needed in fact.
|
||||
Anyway that is good starting point and lets generate \f$h\f$ vectors first.
|
||||
\f$D\f$ has the following expression:
|
||||
|
||||
\f[D=\frac{\alpha^2}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
|
||||
|
||||
Frankly speaking \f$D(h)\f$ is called normal distribution but cannot be directly used as hemisphere distribution.
|
||||
Originally it is statistical factor used to define total area of micro faces \f$\mathrm{d}A_h\f$
|
||||
whose normals lie withing given infinitesimal solid angle \f$\mathrm{d}h\f$ centered on \f$h\f$ direction using the original small enough area of macro surface \f$\mathrm{d}A\f$:
|
||||
|
||||
\f[dA_h = D(h)\,\mathrm{d}h\, \mathrm{d}A\f]
|
||||
|
||||
First of all this factor must be positive:
|
||||
|
||||
\f[D(h) \geq 0\f]
|
||||
|
||||
But the total area of micro faces landscape is at least equal to origin surface but even bigger in general:
|
||||
|
||||
\f[1 \leq \int\limits_H D(h)\, \mathrm{d}h\f]
|
||||
|
||||
This trait does not allow to use \f$D\f$ as hemisphere distribution.
|
||||
But it can be fixed with following feature:
|
||||
|
||||
\f[\forall v\, \int\limits_H D(h)(v \cdot h)\, \mathrm{d}h = (v \cdot n)\f]
|
||||
|
||||
Which means that total area of micro faces projected to any direction must be the same as projected area of origin macro surface.
|
||||
It is pretty tricky trait in \f$D\f$ definition but it leads to interesting results in condition when \f$v = n\f$:
|
||||
|
||||
\f[\int\limits_H D(h)\cos\theta_h\, \mathrm{d}h = 1\f]
|
||||
|
||||
So that \f$\cos\theta_h\f$ coefficient normalizes normal distribution in terms of hemisphere and allows to use it as distribution.
|
||||
Finally PDF of half vectors can be wrote:
|
||||
|
||||
\f[p(\theta_h, \phi_h) = D\cos\theta_h\sin\theta_h = \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
|
||||
|
||||
\f$\sin\theta_h\f$ results from spherical coordinate system transfer which was described in Monte-Carlo integration chapter.
|
||||
Lets strict to samples generation procedure and find partial probability densities:
|
||||
|
||||
\f[p(\phi_h) = \int\limits_0^\frac{\pi}{2} p(\theta_h, \phi_h)\, \mathrm{d}\theta_h = \int\limits_0^\frac{\pi}{2} \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\theta = \frac{1}{2\pi}\f]
|
||||
|
||||
\f[p(\theta_h) = \int\limits_0^{2\pi} p(\theta_h, \phi_h)\, \mathrm{d}\phi_h = \int\limits_0^{2\pi} \frac{\alpha^2 \cos\theta_h\sin\theta_h}{\pi(\cos^2\theta_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\phi = \frac{2 \alpha^2 \cos\theta_h\sin\theta_h}{(\cos^2\theta_h(\alpha^2-1) + 1)^2}\f]
|
||||
|
||||
\f$p(\phi_h)\f$ is unnecessary to be calculated analytically.
|
||||
The fact of independency from \f$\phi\f$ is enough to figure out that this coordinate is uniformly distributed.
|
||||
Anyway the \f$F(\theta_h)\f$ is next step:
|
||||
|
||||
\f[F(\theta_h) = \int\limits_0^{\theta_h} \frac{2 \alpha^2 \cos\theta'_h\sin\theta'_h}{(\cos^2\theta'_h(\alpha^2-1) + 1)^2}\, \mathrm{d}\theta'_h = \int\limits_{\theta_h}^0 \frac{2 \alpha^2}{(\cos^2\theta'_h(\alpha^2-1) + 1)^2}\, \mathrm{d}(\cos^2\theta'_h) = \frac{\alpha^2}{\alpha^2-1}\int\limits_0^{\theta_h} \mathrm{d}\frac{1}{\cos^2\theta'_h(\alpha^2-1)+1} =\f]
|
||||
|
||||
\f[ = \frac{\alpha^2}{\alpha^2-1} \left( \frac{1}{\cos^2\theta_h(\alpha^2-1) + 1} - \frac{1}{\alpha^2} \right) = \frac{\alpha^2}{\cos^2\theta_h(\alpha^2-1)^2+(\alpha^2-1)} - \frac{1}{\alpha^2-1}\f]
|
||||
|
||||
In order to apply inverse transform sampling the \f$F^{-1}(u)\f$ is needed to be found:
|
||||
|
||||
\f[F^{-1}(u) = \theta_h = \arccos\sqrt{\frac{1-u}{u(\alpha^2-1)+1}}\f]
|
||||
|
||||
So that there is no more obstacles to generate \f$h\f$.
|
||||
But the main goal was \f$l\f$ direction.
|
||||
In order to get it the view vector \f$v\f$ has to be reflected related to already found \f$h\f$:
|
||||
|
||||
\f[l = 2(v \cdot h)h - v\f]
|
||||
|
||||
That is practical side of light direction generation.
|
||||
But the theoretical one is needed to be resolved to calculate sum.
|
||||
It is time to find \f$p(l)\f$ using known \f$p(h)\f$.
|
||||
First of all the fact that \f$l\f$ is just transformed \f$h\f$ is needed to be understood.
|
||||
In that way the light direction's PDF has following expression:
|
||||
|
||||
\f[p(l) = p(h)|J_T|\f]
|
||||
|
||||
Where \f$|J_T|\f$ is Jacobian of reflection transformation.
|
||||
Lets find it.
|
||||
Right now \f$n\f$ is axis from which \f$\theta\f$ spherical coordinate is encountered.
|
||||
The first step is setting \f$v\f$ as starting point of \f$\theta\f$ instead of \f$n\f$.
|
||||
This is linear transform so that \f$|J_T| = 1\f$.
|
||||
Next step is transfer to spherical coordinate with \f$|J_T| = \sin\theta_{vh}\f$.
|
||||
Due to previous step \f$\theta_{vh}\f$ is used instead of \f$\theta_h\f$.
|
||||
In this coordinate system reflecting of \f$v\f$ relative to \f$h\f$ is just doubling \f$\theta_{vh}\f$ and Jacobian of it is equal to \f$\frac{1}{2}\f$.
|
||||
In series of transform the Jacobians are multiplied so that currently \f$|J_T| = \frac{1}{2}\sin\theta_{vh}\f$.
|
||||
And the final step is inverse transform to Cartesian coordinate system with \f$|J_T| = (\sin\theta_{vl})^{-1} = (\sin2\theta_{vh})^{-1}\f$.
|
||||
Combining this all together the following expression is obtained for reflection transform Jacobian:
|
||||
|
||||
\f[|J_T| = \frac{\sin\theta_{vh}}{2\sin2\theta_{vh}} = \frac{\sin\theta_{vh}}{4\sin\theta_{vh}\cos\theta_{vh}} = \frac{1}{4\cos\theta_{vh}}\f]
|
||||
|
||||
And finally \f$p(l)\f$ looks like:
|
||||
|
||||
\f[p(l) = p(h)|J_T| = \frac{D\cos\theta_h}{4\cos\theta_{vh}}\f]
|
||||
|
||||
Lets go back to the Monte-Carlo sum and insert found result to it:
|
||||
|
||||
\f[\int\limits_H \frac{DG}{4\cos\theta_v \cos\theta_l} g(v, l) \cos\theta_l\, \mathrm{d}l \approx \frac{1}{N} \sum_{i=1}^N \frac{DG\, g(v, l_i) \cos\theta_{l_i}}{4\cos\theta_v \cos\theta_{l_i}\, p(l_i)} = \frac{1}{N} \sum_{i=1}^N \frac{G\, g(v, l_i) \cos\theta_{l_i} \cos\theta_{vh_i}}{\cos\theta_v \cos\theta_{l_i} \cos\theta_{h_i}}\f]
|
||||
|
||||
Here \f$G\f$ component is recommended to be calculated with original \f$k=\frac{\alpha}{2} = \frac{r^2}{2}\f$ in order to get more plausible result.
|
||||
Of course, all \f$\cos\f$ must be clamped to range \f$[0, 1]\f$ because integral is calculated on a hemisphere and all expressions are defined on it.
|
||||
\f$\cos\theta_v \cos\theta_{l_i}\f$ in denominator can be reduced with exactly the same part in geometric attenuation factor in order to avoid additional zero division cases.
|
||||
|
||||
Summarizing importance sampling strategy described above the convergence of Monte-Carlo integration can be improved using special PDF correlated with integrated function.
|
||||
In case of BRDF with normal distribution functions \f$D\f$ the PDF producing procedure is defined.
|
||||
Practically half vector \f$h\f$ is generated first and \f$l\f$ is obtained from it by view vector \f$v\f$ reflecting.
|
||||
Due to this transformation final form of probability density used in sum is quite different but also has defined algorithm of calculation.
|
||||
For isotropic Cook-Torrance BRDF the \f$\cos\theta_v\f$ and roughness \f$r\f$ are enough to start generation so that all integrals of that kind can be precalculated in 2D look-up tables variating these two parameters.
|
||||
The same samples generation procedure must be used in specular map baking described in next chapter.
|
||||
|
||||
# Specular map
|
||||
|
||||
The situation with BRDF part of \f$L_{indirect}^s\f$ is clear now and \f$L_i^{indirect}(l)\f$ sum is left to be discussed.
|
||||
That was called **specular map** and has following form:
|
||||
|
||||
\f[\frac{1}{N}\sum_{i=1}^N L_i^{indirect}(l_i)\f]
|
||||
|
||||
As was mentioned this sum must be calculated for every normal direction using the same samples generation principles as in numeric integration computation.
|
||||
This principles require two scalar parameters \f$\cos\theta_v\f$ and \f$r\f$ but now \f$\phi\f$ really matters.
|
||||
So that in fact the specular map has to be saved in 3D table consisting omnidirectional textures.
|
||||
That is a big expense of computational and memory resources.
|
||||
A couple of tricks helps to reduce dimensions.
|
||||
First of all the \f$\cos\theta_v\f$ and \f$\phi\f$ can be just excluded.
|
||||
In that way \f$v\f$ is considered to be equal to \f$n\f$.
|
||||
Of course this approach produces an error and affects the final result.
|
||||
It can be fixed more or less by \f$\cos\theta_{l_i}\f$ weighting:
|
||||
|
||||
\f[\frac{1}{N} \sum_{i=1}^N L_i^{indirect}(l_i) \cos\theta_{l_i}\f]
|
||||
|
||||
It is not a complete solution but practice shows that it is enough to get plausible illumination with sacrificing of lengthy reflections at grazing angles which exist in fact if everything is honestly computed.
|
||||
The problem is that for \f$v \neq n\f$ considering this sum to be defined related to \f$n\f$ became incorrect.
|
||||
For example, for complete mirroring materials with \f$r = 0\f$ this sum must boil down to \f$L_i^{indirect}(v_r)\f$
|
||||
but not to \f$L_i^{indirect}(n)\f$ where \f$v_r\f$ is just reflected \f$v\f$ or in other words \f$v_r = 2(v \cdot n)n - v\f$.
|
||||
That it just mirroring reflection principle.
|
||||
Assumption of \f$n = v\f$ also means that \f$n = v = v_r\f$.
|
||||
In that way radiance map better to be considered as averaging of illumination coming from \f$v_r\f$.
|
||||
So that it has become to be defined related to reflection direction which has to be calculated before map's fetching.
|
||||
|
||||
Anyway, there are just two dimensions in radiance look-up table remain.
|
||||
The rest one with \f$r\f$ parameter cannot be reduced.
|
||||
There is no other ways except just roughness variation but in order to simplify that computations can be done for several values and the rest ones lying between can be obtained from linear interpolation.
|
||||
This is another source of visual artifacts but it also works good in practice and that is pretty common approach.
|
||||
But it still requires noticeably amount of samples and that is for every pixel related to each \f$r\f$ value.
|
||||
It can be appropriate for precomputations but still limits using dynamic environments in real time rendering or just even static environments but on weak devices such as mobile ones.
|
||||
And there are several possible ways to improve radiance map baking performance.
|
||||
|
||||
The first one is using textures with smaller resolutions for larger roughnesses.
|
||||
The point is that smaller \f$r\f$ values produce map saving more details from origin environment in opposite to larger ones representing lower frequency components and working as low pass filters in fact.
|
||||
So less pixels in combination with linear interpolation is enough to store less detailed convolutions.
|
||||
Moreover, this approach naturally works with textures levels of details in graphics API
|
||||
so that every certain radiance map related to certain \f$r\f$ can be stored on its own mip level and be directly fetched with linear interpolation not only over one texture but over levels too.
|
||||
As practice shows 6 levels are enough.
|
||||
|
||||
After reducing pixels count it is turn for samples number.
|
||||
And again correlation with roughness can be noticed.
|
||||
For example map for completely mirroring materials with \f$r = 0\f$ the same sample \f$l_i = v_r\f$ will be produced.
|
||||
So that only one sample is enough in this case.
|
||||
In opposite way directions for \f$r = 1\f$ will be scattered over almost whole hemisphere what requires as much samples as available.
|
||||
The 'locality' of distribution is decreased during increasing roughness and it is possible to assume that samples number might to be proportional to this 'locality' keeping accuracy at the same level.
|
||||
But how can 'locality' be interpreted in terms of probability distribution? One possible way is CDF meaning.
|
||||
\f$F(\theta_h)\f$ has been already defined and by definition it shows the probability of random value \f$\theta_h\f$ to be less than argument of CDF.
|
||||
In other words \f$F(\theta'_h) = u\f$ means that probability of \f$\theta_h\f$ to be in range of \f$[0, \theta'_h]\f$ is \f$u\f$.
|
||||
The inverse task of range searching using given \f$u\f$ can be solved with help of \f$F^{-1}(u) = \theta'_h\f$.
|
||||
If \f$u\f$ is close to 1 (exact 1 has no sense because in that case \f$\theta'_h = \max\theta_h = \frac{\pi}{2}\f$)
|
||||
then \f$\theta'_h\f$ represents the range of the most probable or most frequently generated values and that can be interpreted as 'locality' of distribution.
|
||||
After that if samples number of the worst case with \f$r = 1\f$ is set (\f$N(1) = \max N\f$) the other ones can be estimated using following formula:
|
||||
|
||||
\f[N(r) = N(1)\frac{\theta'_h(r)}{\frac{\pi}{2}} = N(1)\frac{2\theta'_h(r)}{\pi} = N(1)\frac{2F^{-1}(u)}{\pi} = N(1)\frac{2}{\pi}\arccos\sqrt{\frac{1-u}{u(\alpha^2-1)+1}}\f]
|
||||
|
||||
It is approximate expression representing only estimated general proportionality so that cases of \f$r = 0\f$ and \f$r = 1\f$ must be processed separately with \f$N(0) = 1\f$ and \f$N(1) = \max N\f$.
|
||||
\f$u\f$ can be parameter of this optimization strategy controlling speed of samples reducing in order to balance performance and quality (\f$u = 1\f$ disables this optimization at all).
|
||||
This pretty tricky technique allows reducing calculations for every pixels without sacrificing the quality.
|
||||
|
||||
In addition to optimizations mentioned before another one can be applied in order to help to reduce samples numbers as previous one.
|
||||
Using less samples produces image noise due to discrete nature of Monte-Carlo approximation.
|
||||
But it can be slightly smoothed using some prefiltration.
|
||||
The idea is that for the directions with small PDF or in other words for rare directions the samples near of it is unlikely to be generated.
|
||||
So that this direction represents the averaged illumination from relatively big area on hemisphere but approximate it by just a constant.
|
||||
It wold be better to get from such direction already averaged over bigger area environment.
|
||||
It can be achieved using mip levels of origin \f$L_i^{indirect}\f$ whose pixels of one level is exact 4 averaged pixels from previous one.
|
||||
Also mip levels generation is build in most common graphic API so there are no problems with it.
|
||||
But first of all the area covered by one sample is needed to be found.
|
||||
And that can be done as:
|
||||
|
||||
\f[\Omega_s = \frac{1}{N\,p(l)} = \frac{4\cos\theta_{vh}}{ND\cos\theta_h}\f]
|
||||
|
||||
Circumstance of \f$v = v_r = n\f$ leads to \f$\cos\theta_{vh}\f$ and \f$\cos\theta_h\f$ reducing so expression becomes even simpler:
|
||||
|
||||
\f[\Omega_s =\frac{4}{ND}\f]
|
||||
|
||||
Of course all zero divisions must be avoided by clamping, for example.
|
||||
After that the area covered by one pixel of environment map is calculated.
|
||||
In case of a cube map it looks like:
|
||||
|
||||
\f[\Omega_p = \frac{4\pi}{6k^2}\f]
|
||||
|
||||
Where \f$k\f$ is size of one cube map side in pixels (sides are assumed to be quads).
|
||||
Finally the mip level of origin environment map which is needed to be fetched for this certain sample is defined by following expression:
|
||||
|
||||
\f[lod = \frac{1}{2} \log_2\left(\frac{\Omega_s}{\Omega_p}\right)\f]
|
||||
|
||||
The mathematics connected with mip levels sizes lie behind it but this is out of scope of this paper.
|
||||
In combination with previous optimization technique this approach allows \f$N(1)\f$ to be smaller keeping visual results good.
|
||||
|
||||
That is not all possible optimization tricks but at least these three significantly reduces compute efforts and brings radiance map calculation to weak devices or even to dynamic environments in real time but in reasonable limits.
|
||||
|
||||
In that way \f$L_{indirect}^s\f$ can be completely computed without any integral approximations.
|
||||
Only 2D look-up table of BRDF part and mip mapped omnidirectional texture of irradiance map are needed.
|
||||
The first one can be got even without any environment.
|
||||
It was achieved using some rough approximations and assumptions but despite of that the visual result are still plausible and can be compared even with ray traced images.
|
||||
In order to complete whole image based lighting the \f$L_{indirect}^d\f$ component is left to be discussed.
|
||||
|
||||
# Spherical harmonics
|
||||
|
||||
Lets go back to diffuse indirect illumination component represented by following formula:
|
||||
|
||||
\f[L_{indirect}^d = (1-m)\frac{c}{\pi}\int\limits_H (1-F)L_i^{indirect}(l)\cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
Of course, Monte-Carlo algorithm can be applied directly and hemisphere integral can be precalculated for every normal direction
|
||||
but dependence from \f$v\f$ in Fresnel's factor does not allow to do it efficiently (every \f$v\f$ direction is needed to be considered again).
|
||||
In order to resolve it modified version of Schlick's approximation has been created:
|
||||
|
||||
\f[F \approx F_{ss}=F_0+(\max(1-r, F_0))(1-\cos\theta_v)^5\f]
|
||||
|
||||
It differs from origin one and loses accuracy a little bit but now there is no light direction inside
|
||||
so that it can be considered as kind of screen space defined Fresnel's factor (\f$ss\f$ means exactly 'screen space') and can be removed from integral:
|
||||
|
||||
\f[L_{indirect}^d = (1-m)(1-F_{ss})\frac{c}{\pi} \int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
The resulted expression without \f$(1-m)\f$ and \f$(1-F_{ss})\f$ parts is pretty known entity called **irradiance**.
|
||||
It can be precalculated using \f$\cos\theta_l\f$ as PDF for importance sampling (actually it is only option in this case excluding uniform distribution).
|
||||
But even with that samples will be scattered almost over whole hemisphere.
|
||||
As was discussed in previous chapter this case requires significant amount of samples in order to average illumination with appropriate quality.
|
||||
Poor accuracy resulted from lack of summand can be noticed especially on high frequency environments having a lot of contrasting details.
|
||||
It worth to be mentioned that irradiance is used not only in BRDF.
|
||||
Omnidirectional diffuse illumination captured for certain point or even for several points uniformly or hierarchically distributed is base of some baking global illumination techniques.
|
||||
There it is called a **light probe**. So that other way to compute and store irradiance maps was found resolving many mentioned problems.
|
||||
The Fourier's decomposition analogue for spherical function allows to achieve this.
|
||||
That would be easy to explain concept directly on example.
|
||||
So lets start from \f$L_i^{indirect}(l)\f$.
|
||||
It is spherical function because directions are just points on sphere.
|
||||
The decomposition looks like:
|
||||
|
||||
\f[L_i^{indirect}(l) = \sum_{i = 0}^\infty \sum_{j=-i}^i L_i^j y_i^j(l)\f]
|
||||
|
||||
Where \f$y_i^j(l)\f$ are spherical functions forming orthonormalized basis called spherical harmonics and \f$L_i^j\f$ is decompositions coefficients.
|
||||
Orthonormality means that dot product of two basis elements is equal to 1 if this is the same functions and is equal to zero otherwise.
|
||||
Dot product on a sphere is defined as integral of functions multiplication. In other words:
|
||||
|
||||
\f[\int\limits_S y_i^j(l)\, y_{i'}^{j'}(l)\, \mathrm{d}l = \begin{cases} 1 & \quad i,j = i',j' \\ 0 & \quad \mathrm{otherwise}\end{cases}\f]
|
||||
|
||||
Function basis with such traits is known and is described by following formulas:
|
||||
|
||||
\f[y_i^{j > 0}(\theta, \phi) = \sqrt{2}K_i^j\cos(j\phi)P_i^j(\cos\theta)\f]
|
||||
\f[y_i^{j<0}(\theta, \phi) = \sqrt{2}K_i^j\sin(j\phi)P_i^{|j|}(\cos\theta)\f]
|
||||
\f[y_i^0(\theta, \phi) = K_i^0P_i^0(\cos\theta)\f]
|
||||
|
||||
\f[K_i^j = \sqrt{\frac{(2i+1)(i-|j|)!}{4\pi(i+|j|)!}}\f]
|
||||
\f[P_0^0(x) = 1\f]
|
||||
\f[P_1^0(x) = x\f]
|
||||
\f[P_i^i(x) = (-1)^i(2i-1)!!(1-x^2)^\frac{i}{2}\f]
|
||||
\f[P_i^j(x) = \frac{(2i-1)xP_{i-1}^j(x) - (i + j - 1)P_{i-2}^j}{i - j}\f]
|
||||
|
||||
Here \f$K_i^j\f$ are normalization factors and \f$P_i^j\f$ are **Legendre's polynomials**.
|
||||
Decomposition coefficients \f$L_i^j\f$ are dot product of origin function (\f$L_i^{indirect}(l)\f$ in current case) and corresponding basis element. It can be written down as:
|
||||
|
||||
\f[L_i^j = \int\limits_S L_i^{indirect}(l)\,y_i^j(l)\, \mathrm{d}l\f]
|
||||
|
||||
Fact that all calculation happen over a sphere but not over hemisphere right now is important not to be missed.
|
||||
That was example of spherical function decomposition but not a solution for original task which looks like:
|
||||
|
||||
\f[\int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
First of all, lets transform this integral to be defined not over hemisphere but sphere:
|
||||
|
||||
\f[\int\limits_H L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l = \int\limits_S L_i^{indirect}(l)\overline{\cos}\theta_l\, \mathrm{d}l\f]
|
||||
|
||||
Where \f$\overline{\cos}\f$ is cosine clamped to zero which can be expressed as:
|
||||
|
||||
\f[\overline{\cos}\theta_l = \max(\cos\theta_l, 0)\f]
|
||||
|
||||
Resulted expression can be considered as convolution in terms of spherical functions where \f$L_i^{indirect}(l)\f$ is target and \f$\overline{\cos}\theta_l\f$ is core.
|
||||
This integral may seem independent but in fact hemisphere is oriented related to \f$n\f$ therefore \f$\overline{\cos}\theta_l\f$ depends on it too and became a kind of 'oriented' version of cosine.
|
||||
That is pretty tricky and explanation about meaning of convolution on sphere is out of scope of this paper.
|
||||
Fact that this is convolution analogue related to \f$n\f$ is enough for now.
|
||||
The goal of looking at integral from this angle is using of convolution's trait allowing to compute decomposition using just only coefficients of function and core.
|
||||
\f$\overline{\cos}\theta_l\f$ is independent from \f$\phi_l\f$ and in case of such radial symmetric cores the resulting coefficients boil down to following formula:
|
||||
|
||||
\f[(L_i^{indirect}(l) \ast \overline{\cos}\theta_l)_i^j = \frac{1}{K_i^0}L_i^j\, c_i^0 = \sqrt{\frac{4\pi}{2i+1}}L_i^j\, c_i^0\f]
|
||||
|
||||
Where \f$c_i^0\f$ are spherical harmonics factors corresponding to \f$\overline{\cos}\theta\f$.
|
||||
Therefore the final decomposition looks like:
|
||||
|
||||
\f[\int\limits_{H(n)} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l = \int\limits_S L_i^{indirect}(l)\overline{\cos}\theta_l\, \mathrm{d}l = \sum_{i=0}^\infty \sum_{j = -i}^i \sqrt{\frac{4\pi}{2i+1}}L_i^j\, c_i^0\, y_i^j(n)\f]
|
||||
|
||||
\f$c_i^0\f$ is left to be found.
|
||||
Due to independence from \f$\phi\f$ all \f$c_i^{j \neq 0} = 0\f$.
|
||||
The rest ones are calculated by regular dot product with basis functions:
|
||||
|
||||
\f[c_i^0 = c_i = \int\limits_S y_i^0(l)\, \overline{\cos}\theta_l\, \mathrm{d}l = \int\limits_0^{2\pi} \mathrm{d}\phi \int\limits_0^\pi y_i^0(\theta, \phi)\, \overline{\cos}\theta \sin\theta\, \mathrm{d}\theta = \int\limits_0^{2\pi} \mathrm{d}\phi \int\limits_0^\frac{\pi}{2} y_i^0(\theta, \phi)\, \cos\theta\sin\theta\, \mathrm{d}\theta = \f]
|
||||
|
||||
\f[= 2\pi\int\limits_0^\frac{\pi}{2} y_i^0(\theta, \phi)\, \cos\theta\sin\theta\, \mathrm{d}\theta = 2\pi K_i^0\int\limits_0^\frac{\pi}{2} P_i^0(\cos\theta)\, \cos\theta\sin\theta\, \mathrm{d}\theta\f]
|
||||
|
||||
\f$\sin\theta\f$ appears due to transfer from integral over sphere to double integral where \f$\mathrm{d}l = \sin\theta\, \mathrm{d}\theta\, \mathrm{d}\phi\f$.
|
||||
There is an analytical solution for this expressions:
|
||||
|
||||
\f[c_1 = \sqrt{\frac{\pi}{3}}\f]
|
||||
|
||||
\f[c_{odd} = 0 \quad c_{even} = 2\pi\sqrt{\frac{2i+1}{4\pi}}\frac{(-1)^{\frac{i}{2}-1}}{(i+2)(i-1)}\frac{i!}{2^i\left(\frac{i!}{2}\right)^2}\f]
|
||||
|
||||
Starting from about the third \f$c_i\f$ the coefficients become less and less valuable so that only couple of them is enough in order to approximate \f$\overline{\cos}\theta\f$ with appropriate accuracy.
|
||||
The same principle is true for convolution too because its coefficients are multiplied by \f$c_i\f$.
|
||||
So there is no need to use more than even three bands (\f$i = 0, 1, 2\f$) of basis functions.
|
||||
Lets write down them all in Cartesian coordinate system:
|
||||
|
||||
\f[y_0^0 = \frac{1}{2}\sqrt{\frac{1}{\pi}} = Y_0^0\f]
|
||||
|
||||
\f[y_1^{-1} = -\frac{1}{2}\sqrt{\frac{3}{\pi}}y = Y_1^{-1}y\f]
|
||||
\f[y_1^0 = \frac{1}{2}\sqrt{\frac{3}{\pi}}z = Y_1^0z\f]
|
||||
\f[y_1^1 = -\frac{1}{2}\sqrt{\frac{3}{\pi}}x = Y_1^1x\f]
|
||||
|
||||
\f[y_2^{-2} = \frac{1}{2}\sqrt{\frac{15}{\pi}}xy = Y_2^{-2}xy\f]
|
||||
\f[y_2^{-1} = -\frac{1}{2}\sqrt{\frac{15}{\pi}}yz = Y_2^{-1}yz\f]
|
||||
\f[y_2^0 = \frac{1}{4}\sqrt{\frac{5}{\pi}}(3z^2-1) = Y_2^0(3z^2-1)\f]
|
||||
\f[y_2^1 = -\frac{1}{2}\sqrt{\frac{15}{\pi}}xz = Y_2^1xz\f]
|
||||
\f[y_2^2 = \frac{1}{4}\sqrt{\frac{15}{\pi}}(x^2-y^2) = Y_2^2(x^2-y^2)\f]
|
||||
|
||||
All \f$Y_i^j\f$ are just constants so that it can be moved from integral during calculations and can be taken from precomputed table.
|
||||
Other constants related to \f$c_i\f$ can be united and also be calculated beforehand:
|
||||
|
||||
\f[\hat{c}_i = \frac{1}{K_i^0}\, c_i = \sqrt{\frac{4\pi}{2i+1}}\, c_i\f]
|
||||
|
||||
Finally expression of irradiance map approximation can be defined:
|
||||
|
||||
\f[\int\limits_{H(n)} L_i^{indirect}(l) \cos\theta_l\, \mathrm{d}l \approx \sum_{i=0}^2 \sum_{j=-i}^i L_i^j\, \hat{c}_i\, y_i^j(n)\f]
|
||||
|
||||
Where \f$\hat{c}_i\f$ is precalculated constants \f$y_i^j(n)\f$ are pretty easy functions and only \f$L_i^j\f$ are needed to be precomputed.
|
||||
Of course \f$L_i^j\f$ are integrals over even whole sphere but now there is only nine of it instead of one for every pixel of omnidirectional image.
|
||||
Moreover, texture is not needed at all in that case and only 9 colors representing \f$L_i^j\f$ have to be saved.
|
||||
The Monte-Carlo algorithm can be applied with just uniform samples distribution without importance sampling at all.
|
||||
\f$Y_i^j\f$ are used twice: in \f$L_i^j\f$ calculations and in sum after that.
|
||||
So there is sense to store only squares of it.
|
||||
All tables with constants presented below:
|
||||
|
||||
| |
|
||||
|-|
|
||||
| \f$(Y_0^0)^2 \approx (0.282095)^2\f$ |
|
||||
| \f$(Y_1^{-1})^2 = (Y_1^0)^2 = (Y_1^1)^2 \approx (0.488603)^2\f$ |
|
||||
| \f$(Y_2^{-2})^2 = (Y_2^{-1})^2 = (Y_2^1)^2 \approx (1.092548)^2\f$ |
|
||||
| \f$(Y_2^0)^2 \approx (0.315392)^2\f$ |
|
||||
| \f$(Y_2^2)^2 \approx (0.546274)^2\f$ |
|
||||
|
||||
| | |
|
||||
|-|-|
|
||||
| \f$\hat{c}_0\f$ | \f$3.141593\f$ |
|
||||
| \f$\hat{c}_1\f$ | \f$2.094395\f$ |
|
||||
| \f$\hat{c}_2\f$ | \f$0.785398\f$ |
|
||||
|
||||
Summarizing all mathematics above spherical harmonics decomposition boils down irradiance map to only 9 values which is needed to be precalculated as integrals.
|
||||
As practice shows this is very good approximation of diffuse indirect illumination component.
|
||||
|
||||
# Transparent materials
|
||||
|
||||
TODO
|
||||
|
||||
# Low discrepancy sequence
|
||||
|
||||
TODO
|
@@ -210,7 +210,7 @@ for which OCCT is certified to work.
|
||||
|
||||
| OS | Compiler |
|
||||
| --------- | ----------- |
|
||||
| Windows | Microsoft Visual Studio: 2008 SP1, 2010 SP1, 2012 Update 4, 2013 Update 5, 2015 Update 3, 2017 <sup>1</sup>, 2019 <br>, LLVM (ClangCL), GCC 4.3+ (Mingw-w64)|
|
||||
| Windows | Microsoft Visual Studio: 2008 SP1, 2010 SP1, 2012 Update 4, 2013 Update 5, 2015 Update 3, 2017 <sup>1</sup>, 2019 <br> GCC 4.3+ (Mingw-w64)|
|
||||
| Linux | GNU gcc 4.3+ <br> LLVM CLang 3.6+ |
|
||||
| OS X / macOS | XCode 6 or newer |
|
||||
| Android | NDK r10, GNU gcc 4.8 or newer |
|
||||
|
@@ -26,7 +26,7 @@ This modular structure is illustrated in the diagram below.
|
||||
* @ref OCCT_TOVW_SECTION_2 "Foundation Classes" module underlies all other OCCT classes;
|
||||
* @ref OCCT_TOVW_SECTION_3 "Modeling Data" module supplies data structures to represent 2D and 3D geometric primitives and their compositions into CAD models;
|
||||
* @ref OCCT_TOVW_SECTION_4 "Modeling Algorithms" module contains a vast range of geometrical and topological algorithms;
|
||||
* @ref OCCT_TOVW_SECTION_4a "Mesh" toolkit from "Modeling Algorithms" module implements tessellated representations of objects;
|
||||
* @ref OCCT_TOVW_SECTION_4a "Mesh" module implements tessellated representations of objects;
|
||||
* @ref OCCT_TOVW_SECTION_5 "Visualization" module provides complex mechanisms for graphical data representation;
|
||||
* @ref OCCT_TOVW_SECTION_6 "Data Exchange" module inter-operates with popular data formats and relies on @ref OCCT_TOVW_SECTION_6a "Shape Healing" to improve compatibility between CAD software of different vendors;
|
||||
* @ref OCCT_TOVW_SECTION_7 "Application Framework" module offers ready-to-use solutions for handling application-specific data (user attributes) and commonly used functionality (save/restore, undo/redo, copy/paste, tracking CAD modifications, etc).
|
||||
@@ -38,20 +38,21 @@ In addition, @ref OCCT_TOVW_SECTION_8 "Open CASCADE Test Harness", also called D
|
||||
**Foundation Classes** module contains data structures and services used by higher-level Open CASCADE Technology classes:
|
||||
|
||||
* Primitive types, such as Boolean, Character, Integer or Real;
|
||||
* String classes that handle Unicode strings;
|
||||
* String classes that handle ASCII and Unicode strings;
|
||||
* Collection classes that handle statically or dynamically sized aggregates of data, such as arrays, lists, queues, sets and hash tables (data maps).
|
||||
* Classes providing commonly used numerical algorithms and basic linear algebra calculations (addition, multiplication, transposition of vectors and matrices, solving linear systems etc).
|
||||
* Fundamental types like color, date and time information;
|
||||
* Fundamental types representing physical quantities and supporting date and time information;
|
||||
* Primitive geometry types providing implementation of basic geometric and algebraic entities that define and manipulate elementary data structures.
|
||||
* Exception classes that describe situations, when the normal execution of program is abandoned;
|
||||
|
||||
This module also provides a variety of general-purpose services, such as:
|
||||
* Safe handling of dynamically created objects, ensuring automatic deletion of unreferenced objects (smart pointers);
|
||||
* Standard and specialized memory allocators;
|
||||
* Configurable optimized memory manager increasing the performance of applications that intensively use dynamically created objects;
|
||||
* Extended run-time type information (RTTI) mechanism maintaining a full type hierarchy and providing means to iterate over it;
|
||||
* Encapsulation of C++ streams;
|
||||
* Automated management of heap memory by means of specific allocators;
|
||||
* Basic interpreter of expressions facilitating the creation of customized scripting tools, generic definition of expressions, etc.;
|
||||
* Tools for dealing with configuration resource files and customizable message files facilitating multi-language support in applications;
|
||||
* Tools for dealing with configuration resource files and customizable message files facilitating multi-language support in applications;
|
||||
* Progress indication and user break interfaces, giving a possibility even for low-level algorithms to communicate with the user in a universal and convenient way;
|
||||
* and many others...
|
||||
|
||||
@@ -61,33 +62,28 @@ See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-
|
||||
|
||||
@section OCCT_TOVW_SECTION_3 Modeling Data
|
||||
|
||||
**Modeling Data** supplies data structures to implement boundary representation (BRep) of objects in 3D.
|
||||
In BRep the shape is represented as an aggregation of geometry within topology.
|
||||
The geometry is understood as a mathematical description of a shape, e.g. as curves and surfaces (simple or canonical, Bezier, NURBS, etc).
|
||||
The topology is a data structure binding geometrical objects together.
|
||||
**Modeling Data** supplies data structures to implement boundary representation (BRep) of objects in 3D. In BRep the shape is represented as an aggregation of geometry within topology. The geometry is understood as a mathematical description of a shape, e.g. as curves and surfaces (simple or canonical, Bezier, NURBS, etc). The topology is a data structure binding geometrical objects together.
|
||||
|
||||
Geometry types and utilities provide geometric data structures and services for:
|
||||
* Description of points, vectors, curves and surfaces:
|
||||
* their positioning in 3D space using axis or coordinate systems, and
|
||||
* their geometric transformation, by applying translations, rotations, symmetries, scaling transformations and combinations thereof.
|
||||
* their positioning in 3D space using axis or coordinate systems, and
|
||||
* their geometric transformation, by applying translations, rotations, symmetries, scaling transformations and combinations thereof.
|
||||
* Creation of parametric curves and surfaces by interpolation and approximation;
|
||||
* Algorithms of direct construction;
|
||||
* Conversion of curves and surfaces to NURBS form;
|
||||
* Computation of point coordinates on 2D and 3D curves;
|
||||
* Calculation of extrema between geometric objects.
|
||||
|
||||
Topology defines relationships between simple geometric entities.
|
||||
A shape, which is a basic topological entity, can be divided into components (sub-shapes):
|
||||
Topology defines relationships between simple geometric entities. A shape, which is a basic topological entity, can be divided into components (sub-shapes):
|
||||
* Vertex -- a zero-dimensional shape corresponding to a point;
|
||||
* Edge -- a shape corresponding to a curve and bounded by a vertex at each extremity;
|
||||
* Wire -- a sequence of edges connected by their vertices;
|
||||
* Face -- a part of a plane (in 2D) or a surface (in 3D) bounded by wires;
|
||||
* Shell -- a collection of faces connected by edges of their wire boundaries;
|
||||
* Solid -- a finite closed part of 3D space bounded by shells;
|
||||
* Composite solid -- a collection of solids connected by faces of their shell boundaries;
|
||||
* Compound -- a collection of shapes of arbitrary type.
|
||||
* Compound solid -- a collection of solids connected by faces of their shell boundaries.
|
||||
|
||||
Complex shapes can be defined as assemblies (compounds) of simpler entities.
|
||||
Complex shapes can be defined as assemblies of simpler entities.
|
||||
|
||||
See the details in @ref occt_user_guides__modeling_data "Modeling Data User's Guide"
|
||||
|
||||
@@ -98,56 +94,56 @@ See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-
|
||||
|
||||
@section OCCT_TOVW_SECTION_4 Modeling Algorithms
|
||||
|
||||
**Modeling Algorithms** module groups a wide range of topological and geometric algorithms used in geometric modeling.
|
||||
Basically, there are two groups of algorithms in Open CASCADE Technology:
|
||||
* High-level modeling routines used in the real design;
|
||||
* Low-level mathematical support functions used as a groundwork for the modeling API.
|
||||
**Modeling Algorithms** module groups a wide range of topological and geometric algorithms used in geometric modeling. Basically, there are two groups of algorithms in Open CASCADE Technology:
|
||||
* High-level modeling routines used in the real design;
|
||||
* Low-level mathematical support functions used as a groundwork for the modeling API;
|
||||
|
||||
Low-level *geometric tools* provide the algorithms, which:
|
||||
* Calculate the intersection of two curves, surfaces, or a curve and a surface;
|
||||
* Project points onto 2D and 3D curves, points onto surfaces and 3D curves onto surfaces;
|
||||
* Construct lines and circles from constraints;
|
||||
* Construct free-form curves and surfaces from constraints (interpolation, approximation, skinning, gap filling, etc).
|
||||
* Low-level geometric tools provide the algorithms, which:
|
||||
* Calculate the intersection of two curves, surfaces, or a curve and a surface;
|
||||
* Project points onto 2D and 3D curves, points onto surfaces and 3D curves onto surfaces;
|
||||
* Construct lines and circles from constraints;
|
||||
* Construct free-form curves and surfaces from constraints (interpolation, approximation, skinning, gap filling, etc);
|
||||
|
||||
Low-level *topological tools* provide the algorithms, which:
|
||||
* Tessellate shapes;
|
||||
* Check correct definition of shapes;
|
||||
* Determine the local and global properties of shapes (derivatives, mass-inertia properties, etc);
|
||||
* Perform affine transformations;
|
||||
* Find planes in which edges are located;
|
||||
* Convert shapes to NURBS geometry;
|
||||
* Sew connected topologies (shells and wires) from separate topological elements (faces and edges).
|
||||
* Low-level topological tools provide the algorithms, which:
|
||||
* Tessellate shapes;
|
||||
* Check correct definition of shapes;
|
||||
* Determine the local and global properties of shapes (derivatives, mass-inertia properties, etc);
|
||||
* Perform affine transformations;
|
||||
* Find planes in which edges are located;
|
||||
* Convert shapes to NURBS geometry;
|
||||
* Sew connected topologies (shells and wires) from separate topological elements (faces and edges).
|
||||
|
||||
Top-level API provides the following functionality:
|
||||
* Construction of Primitives:
|
||||
* Boxes;
|
||||
* Prisms;
|
||||
* Cylinders;
|
||||
* Cones;
|
||||
* Spheres;
|
||||
* Toruses.
|
||||
* Kinematic Modeling:
|
||||
* Prisms -- linear sweeps;
|
||||
* Revolutions -- rotational sweeps;
|
||||
* Pipes -- general-form sweeps;
|
||||
* Lofting.
|
||||
|
||||
* Construction of Primitives:
|
||||
* Boxes;
|
||||
* Prisms;
|
||||
* Cylinders;
|
||||
* Cones;
|
||||
* Spheres;
|
||||
* Toruses.
|
||||
* Kinematic Modeling:
|
||||
* Prisms -- linear sweeps;
|
||||
* Revolutions -- rotational sweeps;
|
||||
* Pipes -- general-form sweeps;
|
||||
* Lofting.
|
||||
|
||||
@figure{/technical_overview/images/0001.png "Shapes containing pipes with variable radius produced by sweeping"}
|
||||
|
||||
* Boolean Operations, which allow creating new shapes from the combinations of source shapes. For two shapes *S1* and *S2*:
|
||||
* *Common* contains all points that are in *S1* and *S2*;
|
||||
* *Fuse* contains all points that are in *S1* or *S2*;
|
||||
* *Cut* contains all points in that are in *S1* and not in *S2*.
|
||||
* Boolean Operations, which allow creating new shapes from the combinations of source shapes. For two shapes *S1* and *S2*:
|
||||
* *Common* contains all points that are in *S1* and *S2*;
|
||||
* *Fuse* contains all points that are in *S1* or *S2*;
|
||||
* *Cut* contains all points in that are in *S1* and not in *S2*
|
||||
|
||||
See @ref occt_user_guides__boolean_operations "Boolean Operations" User's Guide for detailed documentation.
|
||||
|
||||
* Algorithms for local modifications such as:
|
||||
* Hollowing;
|
||||
* Shelling;
|
||||
* Creation of tapered shapes using draft angles;
|
||||
* Algorithms to make fillets and chamfers on shape edges, including those with variable radius (chord).
|
||||
* Algorithms for local modifications such as:
|
||||
* Hollowing;
|
||||
* Shelling;
|
||||
* Creation of tapered shapes using draft angles;
|
||||
* Algorithms to make fillets and chamfers on shape edges, including those with variable radius (chord).
|
||||
|
||||
* Algorithms for creation of mechanical features, i.e. depressions, protrusions, ribs and grooves or slots along planar or revolution surfaces.
|
||||
* Algorithms for creation of mechanical features, i.e. depressions, protrusions, ribs and grooves or slots along planar or revolution surfaces.
|
||||
|
||||
@figure{/technical_overview/images/0004.png}
|
||||
|
||||
@@ -155,13 +151,17 @@ See the details in @ref occt_user_guides__modeling_algos "Modeling Algorithms Us
|
||||
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
@subsection OCCT_TOVW_SECTION_4a Mesh
|
||||
@section OCCT_TOVW_SECTION_4a Mesh
|
||||
|
||||
**Mesh** toolkit provides the functionality to work with tessellated representations of objects in form of triangular facets. This toolkit contains:
|
||||
**Mesh** module provides the functionality to work with tessellated representations of objects in form of triangular facets. This module contains:
|
||||
- data structures to store surface mesh data associated to shapes and basic algorithms to handle them;
|
||||
- data structures and algorithms to build triangular surface mesh from *BRep* objects (shapes);
|
||||
- data structures and algorithms to a build triangular surface mesh from *BRep* objects (shapes);
|
||||
- tools for displaying meshes with associated pre- and post-processor data (scalars or vectors).
|
||||
|
||||
Open CASCADE Technology includes two mesh converters:
|
||||
- VRML converter translates Open CASCADE shapes to VRML 1.0 files (Virtual Reality Modeling Language). Two representation modes are possible: shaded, which presents shapes as sets of triangles computed by the mesh algorithm, or wireframe, which presents shapes as sets of curves.
|
||||
- STL converter translates Open CASCADE shapes to STL files. STL (STtereoLithography) format is widely used for rapid prototyping (3D printing).
|
||||
|
||||
Open CASCADE SAS also offers Advanced Mesh Products:
|
||||
- <a href="https://www.opencascade.com/content/mesh-framework">Open CASCADE Mesh Framework (OMF)</a>
|
||||
- <a href="https://www.opencascade.com/content/express-mesh">Express Mesh</a>
|
||||
@@ -170,70 +170,61 @@ Open CASCADE SAS also offers Advanced Mesh Products:
|
||||
|
||||
@section OCCT_TOVW_SECTION_5 Visualization
|
||||
|
||||
**Visualization** module provides ready-to-use algorithms to create graphic presentations from various objects: shapes, meshes, etc.
|
||||
**Visualization** module provides ready-to-use algorithms to create graphic presentations from various objects: shapes, meshes, etc.
|
||||
|
||||
In Open CASCADE Technology visualization is based on the separation of CAD data and its graphical presentation. The presentations can be customized to take the specificity of your application into account.
|
||||
|
||||
In Open CASCADE Technology visualization is based on the separation of CAD data and its graphical presentation.
|
||||
The module also supports a fast and powerful interactive selection mechanism.
|
||||
|
||||
Visualization module relies on the following key toolkits:
|
||||
- *TKV3d* toolkit defines a high-level API called (Application Interactive Services* (AIS) for working with interactive objects.
|
||||
- *TKService* toolkit defines a low-level API for managing and creating presentations from primitive arrays.
|
||||
This toolkit defines an abstraction layer for defining an arbitrary graphic driver responsible for actual rendering.
|
||||
- *TKOpenGl* toolkit implements the graphic driver using OpenGL and OpenGL ES libraries.
|
||||
The view facilities provided by OCCT range from low-level tools working with basic geometry and topology (such as NURBS visualization with control points and nodes, rendering of isolines to estimate speed and quality of parameterization, or rendering of a parametric profile of edges) to high-level tools for real time quality rendering of models using ray tracing: shades, reflections, transparency, anti-aliasing, etc.
|
||||
|
||||
While low-level API operates with primitive arrays (triangles, lines, points), the higher level includes services for building presentations for B-Rep shapes (shaded and wireframe).
|
||||
A comprehensive list of standard interactive objects includes topological shape, mesh presentation, various dimensions, manipulators and others.
|
||||
It provides a solid basis for rapid application development, while flexible and extensible API allows development of highly customized application-specific presentations.
|
||||
Here are just a few examples:
|
||||
|
||||
Here are a few examples of OCCT Visualization features:
|
||||
* Camera-driven view projection and orientation.
|
||||
Perspective, orthographic and stereographic projections are supported.
|
||||
* Support of Common (diffuse/ambient/specular) and PBR metallic-roughness material models.
|
||||
* Possibility to flexibly adjust appearance of dimensions in a 3D view.
|
||||
The 3D text object represents a given text string as a true 3D object in the model space.
|
||||
* Definition of clipping planes through the plane equation coefficients.
|
||||
Ability to define visual attributes for cross-section at the level or individual clipping planes.
|
||||
In the image below different parts of the rocket are clipped with different planes and hatched.
|
||||
@figure{/technical_overview/images/0008.png, "Display of shape cross-section and dimensions"}
|
||||
* Camera-driven view projection and orientation. It is possible to choose between perspective, orthographic and stereographic projection.
|
||||
|
||||
* Real-time ray tracing technique using recursive Whitted's algorithm and Bounded Volume Hierarchy effective optimization structure.
|
||||
|
||||
@figure{/technical_overview/images/0002.png, "Real time visualization by ray tracing method"}
|
||||
|
||||
* Support of GLSL shaders. The shader management is fully automatic, like with any other OpenGL resource.
|
||||
|
||||
* Support of built-in and application-specific GLSL shaders.
|
||||
@figure{/technical_overview/images/0013.png, "Fragment shader implementing custom clipping surface"}
|
||||
|
||||
* Optimization of rendering performance through the algorithms of:
|
||||
* View frustum culling, which skips the presentation outside camera at the rendering stage;
|
||||
* Back face culling, which reduces the rendered number of triangles and eliminates artifacts at shape boundaries.
|
||||
* Real-time ray tracing technique using recursive Whitted's algorithm and Bounded Volume Hierarchy effective optimization structure.
|
||||
@figure{/technical_overview/images/0002.png, "Real time visualization by ray tracing method"}
|
||||
* Support of standard and custom materials, defined by transparency, diffuse, ambient and specular reflection and refraction index. The latter allows implementing transparent materials, such as glass, diamond and water.
|
||||
|
||||
@figure{/technical_overview/images/0012.png, "Simulation of a glass cover"}
|
||||
|
||||
* Optimization of rendering performance through the algorithms of:
|
||||
* View frustum culling, which skips the presentation outside camera at the rendering stage and
|
||||
* Back face culling, which reduces the rendered number of triangles and eliminates artifacts at shape boundaries.
|
||||
|
||||
* Definition of clipping planes through the plane equation coefficients. Ability to define visual attributes for cross-section at the level or individual clipping planes. In the image below different parts of the rocket are clipped with different planes and hatched.
|
||||
|
||||
* Possibility to flexibly adjust appearance of dimensions in a 3D view. The 3D text object represents a given text string as a true 3D object in the model space.
|
||||
|
||||
@figure{/technical_overview/images/0008.png, "Display of shape cross-section and dimensions"}
|
||||
|
||||
For more details, see @ref occt_user_guides__visualization "Visualization User's Guide".
|
||||
|
||||
The visualization of OCCT topological shapes by means of VTK library provided by VIS component is described in a separate @ref occt_user_guides__vis "VTK Integration Services" User's Guide.
|
||||
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
|
||||
@section OCCT_TOVW_SECTION_6 Data Exchange
|
||||
|
||||
**Data Exchange** allows developing OCCT-based applications that can interact with other CAD systems by writing and reading CAD models to and from external data.
|
||||
**Data Exchange** allows developing OCCT-based applications that can interact with other CAD systems by writing and reading CAD models to and from external data. The exchanges run smoothly regardless of the quality of external data or requirements to its internal representation, for example, to the data types, accepted geometric inaccuracies, etc.
|
||||
|
||||
@figure{/technical_overview/images/0014.png,"Shape imported from STEP"}
|
||||
|
||||
**Data Exchange** is organized in a modular way as a set of interfaces that comply with various CAD formats: IGES, STEP, STL, VRML, etc.
|
||||
The interfaces allow software based on OCCT to exchange data with various CAD/PDM software packages, maintaining a good level of interoperability.
|
||||
This module handles various problems of interoperability between CAD systems, caused by differences in model validity criteria and requirements to internal representation.
|
||||
**Data Exchange** is organized in a modular way as a set of interfaces that comply with various CAD formats: IGES, STEP, STL, VRML, etc. The interfaces allow software based on OCCT to exchange data with various CAD/PDM software packages, maintaining a good level of interoperability.
|
||||
|
||||
* **Standardized Data Exchange** interfaces allow querying and examining the input file, converting its contents to a CAD model and running validity checks on a fully translated shape.
|
||||
The following formats are currently supported:
|
||||
* @ref occt_user_guides__step "STEP" (AP203: Mechanical Design, this covers General 3D CAD; AP214: Automotive Design; AP242).
|
||||
* @ref occt_user_guides__iges "IGES" (up to 5.3).
|
||||
* **glTF** 2.0 reader and writer.
|
||||
* **OBJ** mesh file reader.
|
||||
* **VRML** converter translates Open CASCADE shapes to VRML 1.0 files (Virtual Reality Modeling Language).
|
||||
* **STL** converter translates Open CASCADE shapes to STL files.
|
||||
STL (STtereoLithography) format is widely used for rapid prototyping (3D printing).
|
||||
* **Standardized Data Exchange** interfaces allow querying and examining the input file, converting its contents to a CAD model and running validity checks on a fully translated shape. The following formats are currently supported.
|
||||
* @ref occt_user_guides__step "STEP" (AP203 : Mechanical Design, this covers General 3D CAD; AP214: Automotive Design)
|
||||
* @ref occt_user_guides__iges "IGES" (up to 5.3)
|
||||
* glTF, OBJ, VRML and STL meshes.
|
||||
* @ref occt_user_guides__xde "Extended data exchange" (XDE) allows translating additional attributes attached to geometric data (colors, layers, names, materials etc).
|
||||
* <a href="https://www.opencascade.com/content/advanced-data-exchange-components">Advanced Data Exchange Components</a>
|
||||
are available in addition to standard Data Exchange interfaces to support interoperability and data adaptation (also using @ref OCCT_TOVW_SECTION_6a "Shape Healing") with CAD software using the following proprietary formats:
|
||||
* <a href="https://www.opencascade.com/content/advanced-data-exchange-components">Advanced Data Exchange Components</a> are available in addition to standard Data Exchange interfaces to support interoperability and data adaptation (also using @ref OCCT_TOVW_SECTION_6a "Shape Healing") with CAD software using the following proprietary formats:
|
||||
* <a href="https://www.opencascade.com/content/acis-sat-import-export">ACIS SAT</a>
|
||||
* <a href="https://www.opencascade.com/content/parasolid-import">Parasolid</a>
|
||||
* <a href="https://www.opencascade.com/content/dxf-import-export">DXF</a>
|
||||
@@ -247,22 +238,22 @@ These components are based on the same architecture as interfaces with STEP and
|
||||
**Shape Healing** library provides algorithms to correct and adapt the geometry and topology of shapes imported to OCCT from other CAD systems.
|
||||
|
||||
Shape Healing algorithms include, but are not limited to, the following operations:
|
||||
* Analyze shape characteristics and, in particular, identify the shapes that do not comply with OCCT geometry and topology validity rules by analyzing geometrical objects and topology:
|
||||
- check edge and wire consistency;
|
||||
- check edge order in a wire;
|
||||
- check the orientation of face boundaries;
|
||||
- analyze shape tolerances;
|
||||
- identify closed and open wires in a boundary.
|
||||
* Fix incorrect or incomplete shapes:
|
||||
- provide consistency between a 3D curve and its corresponding parametric curve;
|
||||
- repair defective wires;
|
||||
- fit the shapes to a user-defined tolerance value;
|
||||
- fill gaps between patches and edges.
|
||||
* Upgrade and change shape characteristics:
|
||||
- reduce curve and surface degree;
|
||||
- split shapes to obtain C1 continuity;
|
||||
- convert any types of curves or surfaces to Bezier or B-Spline curves or surfaces and back;
|
||||
- split closed surfaces and revolution surfaces.
|
||||
* analyze shape characteristics and, in particular, identify the shapes that do not comply with OCCT geometry and topology validity rules by analyzing geometrical objects and topology:
|
||||
- check edge and wire consistency;
|
||||
- check edge order in a wire;
|
||||
- check the orientation of face boundaries;
|
||||
- analyze shape tolerances;
|
||||
- identify closed and open wires in a boundary.
|
||||
* fix incorrect or incomplete shapes:
|
||||
- provide consistency between a 3D curve and its corresponding parametric curve;
|
||||
- repair defective wires;
|
||||
- fit the shapes to a user-defined tolerance value;
|
||||
- fill gaps between patches and edges.
|
||||
* upgrade and change shape characteristics:
|
||||
- reduce curve and surface degree;
|
||||
- split shapes to obtain C1 continuity;
|
||||
- convert any types of curves or surfaces to Bezier or B-Spline curves or surfaces and back;
|
||||
- split closed surfaces and revolution surfaces.
|
||||
|
||||
Each sub-domain of Shape Healing has its own scope of functionality:
|
||||
|
||||
@@ -278,24 +269,21 @@ For more details, refer to @ref occt_user_guides__shape_healing "Shape Healing U
|
||||
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
|
||||
@section OCCT_TOVW_SECTION_7 Application Framework
|
||||
|
||||
**Open CASCADE Application Framework** (OCAF) handles Application Data basing on the Application/Document paradigm.
|
||||
It uses an associativity engine to simplify the development of a CAD application thanks to the following ready-to-use features and services:
|
||||
**Open CASCADE Application Framework** (OCAF) handles Application Data basing on the Application/Document paradigm. It uses an associativity engine to simplify the development of a CAD application thanks to the following ready-to-use features and services:
|
||||
|
||||
* Data attributes managing the application data, which can be organized according to the development needs;
|
||||
* Data storage and persistence (open/save);
|
||||
* Possibility to modify and recompute attributes in documents.
|
||||
With OCAF it is easy to represent the history of modification and parametric dependencies within your model;
|
||||
* Possibility to modify and recompute attributes in documents. With OCAF it is easy to represent the history of modification and parametric dependencies within your model;
|
||||
* Possibility to manage multiple documents;
|
||||
* Predefined attributes common to CAD/CAM/CAE applications (e.g. to store dimensions);
|
||||
* Undo-Redo and Copy-Paste functions.
|
||||
|
||||
Since OCAF handles the application structure, the only development task is the creation of application-specific data and GUIs.
|
||||
|
||||
OCAF differs from any other CAD framework in the organization of application data, as there the data structures are based on reference keys rather than on shapes.
|
||||
In a model, such attributes as shape data, color and material are attached to an invariant structure, which is deeper than the shapes.
|
||||
A shape object becomes the value of *Shape* attribute, in the same way as an integer number is the value of *Integer* attribute and a string is the value of *Name* attribute.
|
||||
OCAF differs from any other CAD framework in the organization of application data, as there the data structures are based on reference keys rather than on shapes. In a model, such attributes as shape data, color and material are attached to an invariant structure, which is deeper than the shapes. A shape object becomes the value of *Shape* attribute, in the same way as an integer number is the value of *Integer* attribute and a string is the value of *Name* attribute.
|
||||
|
||||
OCAF organizes and embeds these attributes in a document. OCAF documents, in their turn, are managed by an OCAF application.
|
||||
|
||||
@@ -303,11 +291,10 @@ For more details, see @ref occt_user_guides__ocaf "OCAF User's Guide".
|
||||
|
||||
See also: our <a href="https://www.opencascade.com/content/tutorial-learning">E-learning & Training</a> offerings.
|
||||
|
||||
|
||||
@section OCCT_TOVW_SECTION_8 Draw Test Harness
|
||||
|
||||
**Test Harness** or **Draw** is a convenient testing tool for OCCT libraries.
|
||||
It can be used to test and prototype various algorithms before building an entire application.
|
||||
It includes:
|
||||
**Test Harness** or **Draw** is a convenient testing tool for OCCT libraries. It can be used to test and prototype various algorithms before building an entire application. It includes:
|
||||
- A command interpreter based on the TCL language;
|
||||
- A number of 2D and 3D viewers;
|
||||
- A set of predefined commands.
|
||||
|
@@ -406,47 +406,6 @@ if(!Interface_Static::SetIVal(;read.step.shape.aspect;,1))
|
||||
~~~~~
|
||||
Default value is 1 (ON).
|
||||
|
||||
<h4>read.step.constructivegeom.relationship:</h4>
|
||||
|
||||
Boolean flag regulating translation of "CONSTRUCTIVE_GEOMETRY_REPRESENTATION_RELATIONSHIP" entities that define
|
||||
position of constructive geometry entities contained in "CONSTRUCTIVE_GEOMETRY_REPRESENTATION" with respect to the
|
||||
main representation of the shape (product).
|
||||
|
||||
By default, the flag is set to 0 (OFF) so these entities are not translated.
|
||||
Set this flag to 1 (ON) if you need to translate constructive geometry entities associated with the parts:
|
||||
|
||||
~~~~~
|
||||
if (!Interface_Static::SetIVal("read.step.constructivegeom.relationship", 1)) { .. error .. }
|
||||
~~~~~
|
||||
|
||||
The "CONSTRUCTIVE_GEOMETRY_REPRESENTATION" entity is translated into compound of two unlimited planar faces,
|
||||
whose location is result of translation of corresponding "AXIS_PLACEMENT" entity.
|
||||
Note that appropriate interpretation of the translated data should be done after translation.
|
||||
|
||||
The result of translation can be obtained either for the "CONSTRUCTIVE_GEOMETRY_REPRESENTATION_RELATIONSHIP" entity,
|
||||
of for each of the two "AXIS2_PLACEMENT_3D" entities referenced by it. as follows:
|
||||
|
||||
~~~~~
|
||||
STEPControl_Reader aReader;
|
||||
... // translate file and parse STEP model to find relevant axis entity
|
||||
Handle(StepGeom_Axis2Placement3d) aSTEPAxis = ...;
|
||||
Handle(Transfer_Binder) aBinder = aReader->WS()->TransferReader()->TransientProcess()->Find(aSTEPAxis);
|
||||
Handle(TransferBRep_ShapeBinder) aShBinder = Handle(TransferBRep_ShapeBinder)::DownCast(aBinder);
|
||||
if (! aShBinder.IsNull())
|
||||
{
|
||||
TopoDS_Face aFace = TopoDS::Face (aShBinder->Result());
|
||||
if (! aFace.IsNull())
|
||||
{
|
||||
Handle(Geom_Plane) aSurf = Handle(Geom_Plane)::DownCast (BRep_Tool::Surface (aFace));
|
||||
if (! aSurf.IsNull())
|
||||
{
|
||||
gp_Ax3 anAxis = aSurf->Placement();
|
||||
... // use the axis placement data
|
||||
}
|
||||
}
|
||||
}
|
||||
~~~~~
|
||||
|
||||
@subsubsection occt_step_2_3_4 Performing the STEP file translation
|
||||
|
||||
Perform the translation according to what you want to translate. You can choose either root entities (all or selected by the number of root), or select any entity by its number in the STEP file. There is a limited set of types of entities that can be used as starting entities for translation. Only the following entities are recognized as transferable:
|
||||
|
@@ -24,7 +24,7 @@
|
||||
#include <Message.hxx>
|
||||
#include <Message_Messenger.hxx>
|
||||
#include <OpenGl_GraphicDriver.hxx>
|
||||
#include <StdPrs_ToolTriangulatedShape.hxx>
|
||||
#include <Prs3d.hxx>
|
||||
#include <Prs3d_Drawer.hxx>
|
||||
#include <STEPControl_Reader.hxx>
|
||||
#include <STEPCAFControl_Reader.hxx>
|
||||
@@ -257,12 +257,12 @@ bool OcctViewer::ImportSTEP(std::string theFilename)
|
||||
}
|
||||
|
||||
Handle(Prs3d_Drawer) aDrawer = myContext->DefaultDrawer();
|
||||
Standard_Real aDeflection = StdPrs_ToolTriangulatedShape::GetDeflection (aCompound, aDrawer);
|
||||
Standard_Real aDeflection = Prs3d::GetDeflection (aCompound, aDrawer);
|
||||
if (!BRepTools::Triangulation (aCompound, aDeflection))
|
||||
{
|
||||
BRepMesh_IncrementalMesh anAlgo;
|
||||
anAlgo.ChangeParameters().Deflection = aDeflection;
|
||||
anAlgo.ChangeParameters().Angle = aDrawer->DeviationAngle();
|
||||
anAlgo.ChangeParameters().Angle = aDrawer->HLRAngle();
|
||||
anAlgo.ChangeParameters().InParallel = Standard_True;
|
||||
anAlgo.SetShape (aCompound);
|
||||
anAlgo.Perform();
|
||||
|
9
samples/java/jniviewer/.classpath
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
|
||||
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <resources> <item path="/occtJniActivity/libs" type="2"/> </resources>}"/>
|
||||
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="true"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_BUILD_SCOPE" value="${working_set:<?xml version="1.0" encoding="UTF-8"?> <resources> <item path="/occtJniActivity/jni" type="2"/> </resources>}"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="~/develop/android-ndk-r10/ndk-build"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="V=1 jniall"/>
|
||||
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/occtJniActivity/jni}"/>
|
||||
</launchConfiguration>
|
1
samples/java/jniviewer/.gitattributes
vendored
@@ -1 +0,0 @@
|
||||
*.gradle eol=lf
|
14
samples/java/jniviewer/.gitignore
vendored
@@ -1,10 +1,4 @@
|
||||
/.gradle
|
||||
/.idea
|
||||
/build
|
||||
/gradle
|
||||
gradlew
|
||||
gradlew.bat
|
||||
/app/.cxx
|
||||
/app/build
|
||||
gradle.properties
|
||||
local.properties
|
||||
/assets
|
||||
/bin
|
||||
/gen
|
||||
/libs
|
||||
|
43
samples/java/jniviewer/.project
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>occtJniActivity</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
|
||||
<triggers>auto,full,incremental,</triggers>
|
||||
<arguments>
|
||||
<dictionary>
|
||||
<key>LaunchConfigHandle</key>
|
||||
<value><project>/.externalToolBuilders/C++ Builder.launch</value>
|
||||
</dictionary>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
@@ -0,0 +1,4 @@
|
||||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||
org.eclipse.jdt.core.compiler.source=1.6
|
@@ -31,5 +31,6 @@
|
||||
</activity>
|
||||
</application>
|
||||
<uses-feature android:glEsVersion="0x00020000"/>
|
||||
<uses-sdk android:minSdkVersion="15"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
</manifest>
|
@@ -11,22 +11,36 @@ This sample demonstrates indirect method of wrapping C++ to Java using manually
|
||||
Alternative method is available, wrapping individual OCCT classes to Java equivalents so that their full API is available to Java user
|
||||
and the code can be programmed on Java level similarly to C++ one.
|
||||
See description of OCCT Java Wrapper in Advanced Samples and Tools on OCCT web site at
|
||||
https://www.opencascade.com/content/advanced-samples-and-tools
|
||||
http://www.opencascade.org/support/products/advsamples
|
||||
|
||||
Install Android Studio 4.0+ and install building tools (check Tools -> SDK Manager):
|
||||
- Android SDK (API level 21 or higher).
|
||||
- Android SDK build tools.
|
||||
- Android NDK r16 or higher (coming with CMake toolchain).
|
||||
Using NDK r18 or newer will require changing ANDROID_STL in project settings.
|
||||
- CMake 3.10+.
|
||||
Run Eclipse from ADT (Android Developer Tools) for building the sample. To import sample project perform
|
||||
~~~~
|
||||
File -> Import... -> Android -> Existing Android code into Workspace
|
||||
~~~~
|
||||
and specify this directory. The project re-build will be started immediately right after importation if "Build automatically" option is turned on (default in Eclipse).
|
||||
Proxy library compilation and packaging is performed by NDK build script, called by "C++ Builder" configured within Eclipse project.
|
||||
The path to "ndk-build" tool from Android NDK (Native Development Kit) should be specified in Eclipse project properties:
|
||||
~~~~
|
||||
Project -> Properties -> Builders -> C++ Builder -> Edit -> Location
|
||||
~~~~
|
||||
|
||||
Specify this folder location in Android Studio for opening project.
|
||||
You might need re-entering Android SDK explicitly in File -> Project Structure -> SDK Location settings (SDK, NDK, JDK locations).
|
||||
Now paths to OCCT C++ libraries and additional components should be specified in "jni/Android.mk" file:
|
||||
~~~~
|
||||
OCCT_ROOT := $(LOCAL_PATH)/../../../..
|
||||
|
||||
This sample expects OCCT to be already build - please refer to appropriate CMake building instructions in OCCT documentation.
|
||||
The following variables should be added into file gradle.properties (see gradle.properties.template as template):
|
||||
- `OCCT_ROOT` - path to OCCT installation folder.
|
||||
- `FREETYPE_ROOT` - path to FreeType installation folder.
|
||||
FREETYPE_INC := $(OCCT_ROOT)/../freetype/include/freetype2
|
||||
FREETYPE_LIBS := $(OCCT_ROOT)/../freetype/libs
|
||||
|
||||
FREEIMAGE_INC := $(OCCT_ROOT)/../FreeImage/include
|
||||
FREEIMAGE_LIBS := $(OCCT_ROOT)/../FreeImage/libs
|
||||
|
||||
OCCT_INC := $(OCCT_ROOT)/inc
|
||||
OCCT_LIBS := $(OCCT_ROOT)/and/libs
|
||||
~~~~
|
||||
The list of extra components (Freetype, FreeImage) depends on OCCT configuration.
|
||||
Variable $(TARGET_ARCH_ABI) is used within this script to refer to active architecture.
|
||||
E.g. for 32-bit ARM build (see variable *APP_ABI* in "jni/Application.mk")
|
||||
the folder *OCCT_LIBS* should contain sub-folder "armeabi-v7a" with OCCT libraries.
|
||||
|
||||
FreeImage is optional and does not required for this sample, however you should include all extra libraries used for OCCT building
|
||||
and load the explicitly from Java code within OcctJniActivity::loadNatives() method, including toolkits from OCCT itself in proper order:
|
||||
@@ -35,8 +49,10 @@ and load the explicitly from Java code within OcctJniActivity::loadNatives() met
|
||||
|| !loadLibVerbose ("TKMath", aLoaded, aFailed)
|
||||
|| !loadLibVerbose ("TKG2d", aLoaded, aFailed)
|
||||
~~~~
|
||||
Note that C++ STL library is not part of Android system, and application must package this library as well as extra component ("gnustl_shared" by default - see also `ANDROID_STL`).
|
||||
Note that C++ STL library is not part of Android system.
|
||||
Thus application must package this library as well as extra component.
|
||||
"gnustl_shared" STL implementation is expected within this sample.
|
||||
|
||||
After successful build via Build -> Rebuild Project, the application can be packaged to Android:
|
||||
- Deploy and run application on connected device or emulator directly from Android Studio using adb interface by menu items "Run" and "Debug". This would sign package with debug certificate.
|
||||
- Prepare signed end-user package using wizard Build -> Generate signed APK.
|
||||
After successful build, the application can be packaged to Android:
|
||||
- Deploy and run application on connected device or emulator directly from Eclipse using adb interface by menu items "Run" and "Debug". This would sign package with debug certificate.
|
||||
- Prepare signed end-user package using wizard File -> Export -> Android -> Export Android Application.
|
||||
|
@@ -1,48 +0,0 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
compileSdkVersion 21
|
||||
buildToolsVersion "30.0.0"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.opencascade.jnisample"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 26
|
||||
|
||||
ndk {
|
||||
abiFilters "arm64-v8a"
|
||||
}
|
||||
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments "-DOCCT_ROOT=" + OCCT_ROOT,
|
||||
"-DFREETYPE_ROOT=" + FREETYPE_ROOT,
|
||||
"-DANDROID_STL=gnustl_shared"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
manifest.srcFile 'src/main/AndroidManifest.xml'
|
||||
assets.srcDirs = [OCCT_ROOT + "/src"]
|
||||
}
|
||||
}
|
||||
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
path "src/main/jni/CMakeLists.txt"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'java/com/opencascade/jnisample', include: ['*.jar'])
|
||||
}
|
@@ -1,43 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.4.1)
|
||||
|
||||
set(HEADER_FILES OcctJni_MsgPrinter.hxx OcctJni_Viewer.hxx)
|
||||
set(SOURCE_FILES OcctJni_MsgPrinter.cxx OcctJni_Viewer.cxx)
|
||||
|
||||
set (anOcctLibs
|
||||
TKernel TKMath TKG2d TKG3d TKGeomBase TKBRep TKGeomAlgo TKTopAlgo TKShHealing TKMesh
|
||||
# exchange
|
||||
TKPrim TKBO TKBool TKFillet TKOffset
|
||||
TKXSBase
|
||||
TKIGES
|
||||
TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP
|
||||
# OCCT Visualization
|
||||
TKService TKHLR TKV3d TKOpenGl
|
||||
)
|
||||
|
||||
set(aLibDeps "")
|
||||
|
||||
# OCCT libraries
|
||||
include_directories(${OCCT_ROOT}/inc)
|
||||
foreach(anOcctLib ${anOcctLibs})
|
||||
add_library(lib_${anOcctLib} SHARED IMPORTED)
|
||||
set_target_properties(lib_${anOcctLib} PROPERTIES IMPORTED_LOCATION ${OCCT_ROOT}/libs/${ANDROID_ABI}/lib${anOcctLib}.so)
|
||||
list(APPEND aLibDeps lib_${anOcctLib})
|
||||
endforeach()
|
||||
|
||||
# FreeType
|
||||
add_library(lib_FreeType SHARED IMPORTED)
|
||||
set_target_properties(lib_FreeType PROPERTIES IMPORTED_LOCATION ${FREETYPE_ROOT}/libs/${ANDROID_ABI}/libfreetype.so)
|
||||
list(APPEND aLibDeps lib_FreeType)
|
||||
|
||||
# FreeImage - uncomment, if OCCT was built with FreeImage
|
||||
#add_library(lib_FreeImage SHARED IMPORTED)
|
||||
#set_target_properties(lib_FreeImage PROPERTIES IMPORTED_LOCATION ${FREETYPE_ROOT}/libs/${ANDROID_ABI}/libfreeimage.so)
|
||||
#list(APPEND aLibDeps lib_FreeImage)
|
||||
|
||||
# system libraries
|
||||
list(APPEND aLibDeps EGL GLESv2 log android)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -frtti -fexceptions -fpermissive")
|
||||
|
||||
add_library(TKJniSample SHARED ${SOURCE_FILES})
|
||||
target_link_libraries(TKJniSample ${aLibDeps})
|
@@ -1,17 +0,0 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
google()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.0.0'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
jcenter()
|
||||
google()
|
||||
}
|
||||
}
|
@@ -1,5 +0,0 @@
|
||||
# customized paths
|
||||
OCCT_ROOT=c\:/android/occt-dev-android
|
||||
FREETYPE_ROOT=c\:/android/freetype-2.7.1-android
|
||||
# in case if OCCT was built with FreeImage
|
||||
#FREEIMAGE_ROOT=c\:/android/freeimage-3.17-android
|
205
samples/java/jniviewer/jni/Android.mk
Normal file
@@ -0,0 +1,205 @@
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
|
||||
STL_INC := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/include $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI)/include
|
||||
#STL_LIB := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI)/libgnustl_static.a
|
||||
STL_LIB := $(NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/$(NDK_TOOLCHAIN_VERSION)/libs/$(TARGET_ARCH_ABI)/libgnustl_shared.so
|
||||
|
||||
OCCT_ROOT := $(LOCAL_PATH)/../../../..
|
||||
|
||||
FREETYPE_INC := $(OCCT_ROOT)/../freetype/include/freetype2
|
||||
FREETYPE_LIBS := $(OCCT_ROOT)/../freetype/libs
|
||||
|
||||
FREEIMAGE_INC := $(OCCT_ROOT)/../FreeImage/include
|
||||
FREEIMAGE_LIBS := $(OCCT_ROOT)/../FreeImage/libs
|
||||
|
||||
OCCT_INC := $(OCCT_ROOT)/inc
|
||||
OCCT_LIBS := $(OCCT_ROOT)/and/libs
|
||||
|
||||
ASSETDIR := $(LOCAL_PATH)/../assets
|
||||
|
||||
$(ASSETDIR)/Shaders: $(ASSETDIR)
|
||||
-mkdir -p $(ASSETDIR)
|
||||
-mkdir -p $(ASSETDIR)/Shaders
|
||||
cp -f -r $(OCCT_ROOT)/src/Shaders/*.* $(ASSETDIR)/Shaders
|
||||
|
||||
$(ASSETDIR)/SHMessage: $(ASSETDIR)
|
||||
-mkdir -p $(ASSETDIR)
|
||||
-mkdir -p $(ASSETDIR)/SHMessage
|
||||
cp -f -r $(OCCT_ROOT)/src/SHMessage/*.* $(ASSETDIR)/SHMessage
|
||||
|
||||
$(ASSETDIR)/XSMessage: $(ASSETDIR)
|
||||
-mkdir -p $(ASSETDIR)
|
||||
-mkdir -p $(ASSETDIR)/XSMessage
|
||||
cp -f -r $(OCCT_ROOT)/src/XSMessage/*.* $(ASSETDIR)/XSMessage
|
||||
|
||||
pre_all: $(ASSETDIR)/Shaders $(ASSETDIR)/SHMessage $(ASSETDIR)/XSMessage
|
||||
|
||||
jniall: pre_all all
|
||||
|
||||
# STL libs
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := SharedStl
|
||||
LOCAL_EXPORT_C_INCLUDES := $(STL_INC)
|
||||
LOCAL_SRC_FILES := $(STL_LIB)
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
# 3rd-parties used in OCCT
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := FreeType
|
||||
LOCAL_EXPORT_C_INCLUDES := $(FREETYPE_INC)
|
||||
LOCAL_SRC_FILES := $(FREETYPE_LIBS)/$(TARGET_ARCH_ABI)/libfreetype.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
#include $(CLEAR_VARS)
|
||||
#LOCAL_MODULE := FreeImage
|
||||
#LOCAL_EXPORT_C_INCLUDES := $(FREEIMAGE_INC)
|
||||
#LOCAL_SRC_FILES := $(FREEIMAGE_LIBS)/$(TARGET_ARCH_ABI)/libfreeimage.so
|
||||
#include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
# OCCT core
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKernel
|
||||
LOCAL_EXPORT_C_INCLUDES := $(OCCT_INC)
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKernel.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKMath
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKMath.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKG2d
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKG2d.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKG3d
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKG3d.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKGeomBase
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKGeomBase.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKBRep
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKBRep.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKGeomAlgo
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKGeomAlgo.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKTopAlgo
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKTopAlgo.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKShHealing
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKShHealing.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKMesh
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKMesh.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
# OCCT Exchange
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKPrim
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKPrim.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKBO
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKBO.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKBool
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKBool.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKFillet
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKFillet.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKOffset
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKOffset.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKXSBase
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKXSBase.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKIGES
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKIGES.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKSTEPBase
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEPBase.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKSTEPAttr
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEPAttr.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKSTEP209
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEP209.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKSTEP
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKSTEP.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
# OCCT visualization
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKService
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKService.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKHLR
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKHLR.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKV3d
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKV3d.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := OcctTKOpenGl
|
||||
LOCAL_SRC_FILES := $(OCCT_LIBS)/$(TARGET_ARCH_ABI)/libTKOpenGl.so
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
# our sample
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := libTKJniSample
|
||||
LOCAL_C_INCLUDES := $(STL_INC)
|
||||
#LOCAL_STATIC_LIBRARIES := $(STL_LIB) does not work
|
||||
LOCAL_CFLAGS := -Wall -std=c++11
|
||||
LOCAL_CPP_EXTENSION := .cxx .cpp
|
||||
LOCAL_CPP_FEATURES := rtti exceptions
|
||||
LOCAL_SRC_FILES := OcctJni_Viewer.cxx OcctJni_Window.cxx OcctJni_MsgPrinter.cxx
|
||||
LOCAL_SHARED_LIBRARIES := OcctTKernel OcctTKMath OcctTKG2d OcctTKG3d OcctTKGeomBase OcctTKBRep OcctTKGeomAlgo OcctTKTopAlgo OcctTKShHealing OcctTKMesh OcctTKPrim
|
||||
LOCAL_SHARED_LIBRARIES += OcctTKIGES OcctTKSTEP OcctTKXSBase
|
||||
LOCAL_SHARED_LIBRARIES += OcctTKService OcctTKHLR OcctTKV3d OcctTKOpenGl
|
||||
LOCAL_SHARED_LIBRARIES += SharedStl
|
||||
LOCAL_LDLIBS := -llog -lGLESv2 -lEGL
|
||||
|
||||
#LOCAL_LDLIBS += $(STL_LIB)
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
8
samples/java/jniviewer/jni/Application.mk
Normal file
@@ -0,0 +1,8 @@
|
||||
NDK_TOOLCHAIN_VERSION := 4.8
|
||||
APP_PLATFORM := android-15
|
||||
|
||||
APP_ABI := armeabi-v7a
|
||||
#APP_ABI := all
|
||||
|
||||
#APP_STL := gnustl_static
|
||||
#APP_STL := stlport_static
|
@@ -11,7 +11,7 @@
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include "OcctJni_MsgPrinter.hxx"
|
||||
#include <OcctJni_MsgPrinter.hxx>
|
||||
|
||||
#include <TCollection_AsciiString.hxx>
|
||||
#include <TCollection_ExtendedString.hxx>
|
||||
@@ -48,11 +48,27 @@ OcctJni_MsgPrinter::~OcctJni_MsgPrinter()
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : send
|
||||
// function : Send
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_MsgPrinter::send (const TCollection_AsciiString& theString,
|
||||
const Message_Gravity theGravity) const
|
||||
void OcctJni_MsgPrinter::Send (const TCollection_ExtendedString& theString,
|
||||
const Message_Gravity theGravity,
|
||||
const Standard_Boolean theToPutEndl) const
|
||||
{
|
||||
if (theGravity >= myTraceLevel)
|
||||
{
|
||||
const TCollection_AsciiString aStr (theString);
|
||||
OcctJni_MsgPrinter::Send (aStr, theGravity, theToPutEndl);
|
||||
}
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Send
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_MsgPrinter::Send (const TCollection_AsciiString& theString,
|
||||
const Message_Gravity theGravity,
|
||||
const Standard_Boolean theToPutEndl) const
|
||||
{
|
||||
if (theGravity < myTraceLevel)
|
||||
{
|
||||
@@ -66,6 +82,20 @@ void OcctJni_MsgPrinter::send (const TCollection_AsciiString& theString,
|
||||
}
|
||||
|
||||
jstring aJStr = myJEnv->NewStringUTF ((theString + "\n").ToCString());
|
||||
myJEnv->CallVoidMethod (myJObj, myJMet, aJStr);
|
||||
myJEnv->CallObjectMethod (myJObj, myJMet, aJStr);
|
||||
myJEnv->DeleteLocalRef (aJStr);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : Send
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_MsgPrinter::Send (const Standard_CString& theString,
|
||||
const Message_Gravity theGravity,
|
||||
const Standard_Boolean theToPutEndl) const
|
||||
{
|
||||
if (theGravity >= myTraceLevel)
|
||||
{
|
||||
OcctJni_MsgPrinter::Send (TCollection_AsciiString (theString), theGravity, theToPutEndl);
|
||||
}
|
||||
}
|
@@ -30,11 +30,20 @@ public:
|
||||
//! Destructor.
|
||||
~OcctJni_MsgPrinter();
|
||||
|
||||
protected:
|
||||
//! Redirection to TCollection_AsciiString method
|
||||
virtual void Send (const TCollection_ExtendedString& theString,
|
||||
const Message_Gravity theGravity,
|
||||
const Standard_Boolean theToPutEndl) const;
|
||||
|
||||
//! Redirection to TCollection_AsciiString method
|
||||
virtual void Send (const Standard_CString& theString,
|
||||
const Message_Gravity theGravity,
|
||||
const Standard_Boolean theToPutEndl) const;
|
||||
|
||||
//! Main printing method
|
||||
virtual void send (const TCollection_AsciiString& theString,
|
||||
const Message_Gravity theGravity) const override;
|
||||
virtual void Send (const TCollection_AsciiString& theString,
|
||||
const Message_Gravity theGravity,
|
||||
const Standard_Boolean theToPutEndl) const;
|
||||
|
||||
private:
|
||||
|
@@ -11,21 +11,17 @@
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include "OcctJni_Viewer.hxx"
|
||||
#include "OcctJni_MsgPrinter.hxx"
|
||||
#include <OcctJni_Viewer.hxx>
|
||||
#include <OcctJni_MsgPrinter.hxx>
|
||||
|
||||
#include <AIS_ViewCube.hxx>
|
||||
#include <AIS_Shape.hxx>
|
||||
#include <Aspect_NeutralWindow.hxx>
|
||||
#include <Image_AlienPixMap.hxx>
|
||||
#include <BRepTools.hxx>
|
||||
#include <Message_Messenger.hxx>
|
||||
#include <Message_MsgFile.hxx>
|
||||
#include <Message_PrinterSystemLog.hxx>
|
||||
#include <OpenGl_GraphicDriver.hxx>
|
||||
#include <OSD_Environment.hxx>
|
||||
#include <OSD_Timer.hxx>
|
||||
#include <Prs3d_DatumAspect.hxx>
|
||||
#include <Standard_Version.hxx>
|
||||
|
||||
#include <BRepPrimAPI_MakeBox.hxx>
|
||||
@@ -109,69 +105,18 @@ Standard_Boolean setResourceEnv (const TCollection_AsciiString& theVarName,
|
||||
// function : OcctJni_Viewer
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
OcctJni_Viewer::OcctJni_Viewer (float theDispDensity)
|
||||
: myDevicePixelRatio (theDispDensity),
|
||||
myIsJniMoreFrames (false)
|
||||
OcctJni_Viewer::OcctJni_Viewer()
|
||||
{
|
||||
SetTouchToleranceScale (theDispDensity);
|
||||
#ifndef NDEBUG
|
||||
// Register printer for logging messages into global Android log.
|
||||
// Should never be used in production (or specify higher gravity for logging only failures).
|
||||
Handle(Message_Messenger) aMsgMgr = Message::DefaultMessenger();
|
||||
aMsgMgr->RemovePrinters (STANDARD_TYPE (Message_PrinterSystemLog));
|
||||
aMsgMgr->AddPrinter (new Message_PrinterSystemLog ("OcctJni_Viewer"));
|
||||
#endif
|
||||
|
||||
// prepare necessary environment
|
||||
TCollection_AsciiString aResRoot = "/data/data/com.opencascade.jnisample/files";
|
||||
|
||||
setResourceEnv ("CSF_XSMessage", aResRoot + "/XSMessage", "XSTEP.us", Standard_False);
|
||||
setResourceEnv ("CSF_SHMessage", aResRoot + "/XSMessage", "SHAPE.us", Standard_False);
|
||||
}
|
||||
setResourceEnv ("CSF_ShadersDirectory", aResRoot + "/Shaders", "Declarations.glsl", Standard_False);
|
||||
setResourceEnv ("CSF_XSMessage", aResRoot + "/XSMessage", "XSTEP.us", Standard_False);
|
||||
setResourceEnv ("CSF_SHMessage", aResRoot + "/XSMessage", "SHAPE.us", Standard_False);
|
||||
//setResourceEnv ("CSF_PluginDefaults", "Plugin", Standard_False);
|
||||
|
||||
// ================================================================
|
||||
// Function : dumpGlInfo
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void OcctJni_Viewer::dumpGlInfo (bool theIsBasic)
|
||||
{
|
||||
TColStd_IndexedDataMapOfStringString aGlCapsDict;
|
||||
myView->DiagnosticInformation (aGlCapsDict, Graphic3d_DiagnosticInfo_Basic); //theIsBasic ? Graphic3d_DiagnosticInfo_Basic : Graphic3d_DiagnosticInfo_Complete);
|
||||
if (theIsBasic)
|
||||
{
|
||||
TCollection_AsciiString aViewport;
|
||||
aGlCapsDict.FindFromKey ("Viewport", aViewport);
|
||||
aGlCapsDict.Clear();
|
||||
aGlCapsDict.Add ("Viewport", aViewport);
|
||||
}
|
||||
aGlCapsDict.Add ("Display scale", TCollection_AsciiString(myDevicePixelRatio));
|
||||
|
||||
// beautify output
|
||||
{
|
||||
TCollection_AsciiString* aGlVer = aGlCapsDict.ChangeSeek ("GLversion");
|
||||
TCollection_AsciiString* aGlslVer = aGlCapsDict.ChangeSeek ("GLSLversion");
|
||||
if (aGlVer != NULL
|
||||
&& aGlslVer != NULL)
|
||||
{
|
||||
*aGlVer = *aGlVer + " [GLSL: " + *aGlslVer + "]";
|
||||
aGlslVer->Clear();
|
||||
}
|
||||
}
|
||||
|
||||
TCollection_AsciiString anInfo;
|
||||
for (TColStd_IndexedDataMapOfStringString::Iterator aValueIter (aGlCapsDict); aValueIter.More(); aValueIter.Next())
|
||||
{
|
||||
if (!aValueIter.Value().IsEmpty())
|
||||
{
|
||||
if (!anInfo.IsEmpty())
|
||||
{
|
||||
anInfo += "\n";
|
||||
}
|
||||
anInfo += aValueIter.Key() + ": " + aValueIter.Value();
|
||||
}
|
||||
}
|
||||
|
||||
Message::Send (anInfo, Message_Warning);
|
||||
// make sure OCCT loads the dictionary
|
||||
//UnitsAPI::SetLocalSystem (UnitsAPI_SI);
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
@@ -207,10 +152,19 @@ bool OcctJni_Viewer::init()
|
||||
return false;
|
||||
}
|
||||
|
||||
TCollection_AsciiString anEglInfo = TCollection_AsciiString()
|
||||
+ "\n EGLVersion: " + eglQueryString (anEglDisplay, EGL_VERSION)
|
||||
+ "\n EGLVendor: " + eglQueryString (anEglDisplay, EGL_VENDOR)
|
||||
+ "\n EGLClient APIs: " + eglQueryString (anEglDisplay, EGL_CLIENT_APIS)
|
||||
+ "\n GLvendor: " + (const char* )glGetString (GL_VENDOR)
|
||||
+ "\n GLdevice: " + (const char* )glGetString (GL_RENDERER)
|
||||
+ "\n GLversion: " + (const char* )glGetString (GL_VERSION) + " [GLSL: " + (const char* )glGetString (GL_SHADING_LANGUAGE_VERSION) + "]";
|
||||
::Message::DefaultMessenger()->Send (anEglInfo, Message_Info);
|
||||
|
||||
if (!myViewer.IsNull())
|
||||
{
|
||||
Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myViewer->Driver());
|
||||
Handle(Aspect_NeutralWindow) aWindow = Handle(Aspect_NeutralWindow)::DownCast (myView->Window());
|
||||
Handle(OcctJni_Window) aWindow = Handle(OcctJni_Window)::DownCast (myView->Window());
|
||||
if (!aDriver->InitEglContext (anEglDisplay, anEglContext, anEglConfig))
|
||||
{
|
||||
Message::DefaultMessenger()->Send ("Error: OpenGl_GraphicDriver can not be initialized!", Message_Fail);
|
||||
@@ -220,7 +174,6 @@ bool OcctJni_Viewer::init()
|
||||
|
||||
aWindow->SetSize (aWidth, aHeight);
|
||||
myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext);
|
||||
dumpGlInfo (true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -234,17 +187,6 @@ bool OcctJni_Viewer::init()
|
||||
return false;
|
||||
}
|
||||
|
||||
myTextStyle = new Prs3d_TextAspect();
|
||||
myTextStyle->SetFont (Font_NOF_ASCII_MONO);
|
||||
myTextStyle->SetHeight (12);
|
||||
myTextStyle->Aspect()->SetColor (Quantity_NOC_GRAY95);
|
||||
myTextStyle->Aspect()->SetColorSubTitle (Quantity_NOC_BLACK);
|
||||
myTextStyle->Aspect()->SetDisplayType (Aspect_TODT_SHADOW);
|
||||
myTextStyle->Aspect()->SetTextFontAspect (Font_FA_Bold);
|
||||
myTextStyle->Aspect()->SetTextZoomable (false);
|
||||
myTextStyle->SetHorizontalJustification (Graphic3d_HTA_LEFT);
|
||||
myTextStyle->SetVerticalJustification (Graphic3d_VTA_BOTTOM);
|
||||
|
||||
// create viewer
|
||||
myViewer = new V3d_Viewer (aDriver);
|
||||
myViewer->SetDefaultBackgroundColor (Quantity_NOC_BLACK);
|
||||
@@ -253,22 +195,14 @@ bool OcctJni_Viewer::init()
|
||||
|
||||
// create AIS context
|
||||
myContext = new AIS_InteractiveContext (myViewer);
|
||||
myContext->SetPixelTolerance (int(myDevicePixelRatio * 6.0)); // increase tolerance and adjust to hi-dpi screens
|
||||
//myContext->SetDisplayMode (AIS_WireFrame, false);
|
||||
myContext->SetDisplayMode (AIS_Shaded, false);
|
||||
|
||||
Handle(Aspect_NeutralWindow) aWindow = new Aspect_NeutralWindow();
|
||||
aWindow->SetSize (aWidth, aHeight);
|
||||
Handle(OcctJni_Window) aWindow = new OcctJni_Window (aWidth, aHeight);
|
||||
myView = myViewer->CreateView();
|
||||
myView->SetImmediateUpdate (false);
|
||||
myView->ChangeRenderingParams().Resolution = (unsigned int )(96.0 * myDevicePixelRatio + 0.5);
|
||||
myView->ChangeRenderingParams().ToShowStats = true;
|
||||
myView->ChangeRenderingParams().CollectedStats = (Graphic3d_RenderingParams::PerfCounters ) (Graphic3d_RenderingParams::PerfCounters_FrameRate | Graphic3d_RenderingParams::PerfCounters_Triangles);
|
||||
myView->ChangeRenderingParams().StatsTextAspect = myTextStyle->Aspect();
|
||||
myView->ChangeRenderingParams().StatsTextHeight = (int )myTextStyle->Height();
|
||||
|
||||
myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext);
|
||||
dumpGlInfo (false);
|
||||
//myView->TriedronDisplay (Aspect_TOTP_RIGHT_LOWER, Quantity_NOC_WHITE, 0.08 * myDevicePixelRatio, V3d_ZBUFFER);
|
||||
myView->TriedronDisplay (Aspect_TOTP_RIGHT_LOWER, Quantity_NOC_WHITE, 0.08, V3d_ZBUFFER);
|
||||
|
||||
initContent();
|
||||
return true;
|
||||
@@ -299,13 +233,13 @@ void OcctJni_Viewer::resize (int theWidth,
|
||||
}
|
||||
|
||||
Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast (myViewer->Driver());
|
||||
Handle(Aspect_NeutralWindow) aWindow = Handle(Aspect_NeutralWindow)::DownCast (myView->Window());
|
||||
Handle(OcctJni_Window) aWindow = Handle(OcctJni_Window)::DownCast (myView->Window());
|
||||
aWindow->SetSize (theWidth, theHeight);
|
||||
//myView->MustBeResized(); // can be used instead of SetWindow() when EGLsurface has not been changed
|
||||
|
||||
EGLContext anEglContext = eglGetCurrentContext();
|
||||
myView->SetImmediateUpdate (Standard_False);
|
||||
myView->SetWindow (aWindow, (Aspect_RenderingContext )anEglContext);
|
||||
dumpGlInfo (true);
|
||||
//saveSnapshot ("/sdcard/Download/tt.png", theWidth, theHeight);
|
||||
}
|
||||
|
||||
@@ -317,28 +251,6 @@ void OcctJni_Viewer::initContent()
|
||||
{
|
||||
myContext->RemoveAll (Standard_False);
|
||||
|
||||
if (myViewCube.IsNull())
|
||||
{
|
||||
myViewCube = new AIS_ViewCube();
|
||||
{
|
||||
// setup view cube size
|
||||
static const double THE_CUBE_SIZE = 60.0;
|
||||
myViewCube->SetSize (myDevicePixelRatio * THE_CUBE_SIZE, false);
|
||||
myViewCube->SetBoxFacetExtension (myViewCube->Size() * 0.15);
|
||||
myViewCube->SetAxesPadding (myViewCube->Size() * 0.10);
|
||||
myViewCube->SetFontHeight (THE_CUBE_SIZE * 0.16);
|
||||
}
|
||||
// presentation parameters
|
||||
myViewCube->SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_TriedronPers, Aspect_TOTP_RIGHT_LOWER, Graphic3d_Vec2i (200, 200)));
|
||||
myViewCube->Attributes()->SetDatumAspect (new Prs3d_DatumAspect());
|
||||
myViewCube->Attributes()->DatumAspect()->SetTextAspect (myTextStyle);
|
||||
// animation parameters
|
||||
myViewCube->SetViewAnimation (myViewAnimation);
|
||||
myViewCube->SetFixedAnimationLoop (false);
|
||||
myViewCube->SetAutoStartAnimation (true);
|
||||
}
|
||||
myContext->Display (myViewCube, false);
|
||||
|
||||
OSD_Timer aTimer;
|
||||
aTimer.Start();
|
||||
if (!myShape.IsNull())
|
||||
@@ -471,10 +383,6 @@ bool OcctJni_Viewer::open (const TCollection_AsciiString& thePath)
|
||||
if (!myContext.IsNull())
|
||||
{
|
||||
myContext->RemoveAll (Standard_False);
|
||||
if (!myViewCube.IsNull())
|
||||
{
|
||||
myContext->Display (myViewCube, false);
|
||||
}
|
||||
}
|
||||
if (thePath.IsEmpty())
|
||||
{
|
||||
@@ -615,33 +523,18 @@ bool OcctJni_Viewer::saveSnapshot (const TCollection_AsciiString& thePath,
|
||||
return true;
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// Function : handleViewRedraw
|
||||
// Purpose :
|
||||
// ================================================================
|
||||
void OcctJni_Viewer::handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx,
|
||||
const Handle(V3d_View)& theView)
|
||||
{
|
||||
AIS_ViewController::handleViewRedraw (theCtx, theView);
|
||||
myIsJniMoreFrames = myToAskNextFrame;
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : redraw
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
bool OcctJni_Viewer::redraw()
|
||||
void OcctJni_Viewer::redraw()
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
|
||||
// handle user input
|
||||
myIsJniMoreFrames = false;
|
||||
myView->InvalidateImmediate();
|
||||
FlushViewEvents (myContext, myView, true);
|
||||
return myIsJniMoreFrames;
|
||||
myView->Redraw();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
@@ -659,13 +552,89 @@ void OcctJni_Viewer::fitAll()
|
||||
myView->Invalidate();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : startRotation
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_Viewer::startRotation (int theStartX,
|
||||
int theStartY)
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
myView->StartRotation (theStartX, theStartY, 0.45);
|
||||
myView->Invalidate();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : onRotation
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_Viewer::onRotation (int theX,
|
||||
int theY)
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
myView->Rotation (theX, theY);
|
||||
myView->Invalidate();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : onPanning
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_Viewer::onPanning (int theDX,
|
||||
int theDY)
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
myView->Pan (theDX, theDY);
|
||||
myView->Invalidate();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : onClick
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_Viewer::onClick (int theX,
|
||||
int theY)
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
myContext->MoveTo (theX, theY, myView, Standard_False);
|
||||
myContext->Select (Standard_False);
|
||||
myView->Invalidate();
|
||||
}
|
||||
|
||||
// =======================================================================
|
||||
// function : stopAction
|
||||
// purpose :
|
||||
// =======================================================================
|
||||
void OcctJni_Viewer::stopAction()
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#define jexp extern "C" JNIEXPORT
|
||||
|
||||
jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppCreate (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jfloat theDispDensity)
|
||||
jobject theObj)
|
||||
{
|
||||
return jlong(new OcctJni_Viewer (theDispDensity));
|
||||
return jlong(new OcctJni_Viewer());
|
||||
}
|
||||
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppDestroy (JNIEnv* theEnv,
|
||||
@@ -715,11 +684,11 @@ jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOpen (JNIEnv
|
||||
((OcctJni_Viewer* )theCppPtr)->open (aPath);
|
||||
}
|
||||
|
||||
jexp jboolean JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRedraw (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr)
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRedraw (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr)
|
||||
{
|
||||
return ((OcctJni_Viewer* )theCppPtr)->redraw() ? JNI_TRUE : JNI_FALSE;
|
||||
((OcctJni_Viewer* )theCppPtr)->redraw();
|
||||
}
|
||||
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSetAxoProj (JNIEnv* theEnv,
|
||||
@@ -778,41 +747,47 @@ jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppFitAll (JNIE
|
||||
((OcctJni_Viewer* )theCppPtr)->fitAll();
|
||||
}
|
||||
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppAddTouchPoint (JNIEnv* theEnv,
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppStartRotation (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr,
|
||||
jint theId,
|
||||
jfloat theX,
|
||||
jfloat theY)
|
||||
jint theStartX,
|
||||
jint theStartY)
|
||||
{
|
||||
((OcctJni_Viewer* )theCppPtr)->AddTouchPoint (theId, Graphic3d_Vec2d (theX, theY));
|
||||
((OcctJni_Viewer* )theCppPtr)->startRotation (theStartX, theStartY);
|
||||
}
|
||||
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppUpdateTouchPoint (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr,
|
||||
jint theId,
|
||||
jfloat theX,
|
||||
jfloat theY)
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOnRotation (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr,
|
||||
jint theX,
|
||||
jint theY)
|
||||
{
|
||||
((OcctJni_Viewer* )theCppPtr)->UpdateTouchPoint (theId, Graphic3d_Vec2d (theX, theY));
|
||||
((OcctJni_Viewer* )theCppPtr)->onRotation (theX, theY);
|
||||
}
|
||||
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppRemoveTouchPoint (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr,
|
||||
jint theId)
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOnPanning (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr,
|
||||
jint theDX,
|
||||
jint theDY)
|
||||
{
|
||||
((OcctJni_Viewer* )theCppPtr)->RemoveTouchPoint (theId);
|
||||
((OcctJni_Viewer* )theCppPtr)->onPanning (theDX, theDY);
|
||||
}
|
||||
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppSelectInViewer (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr,
|
||||
jfloat theX,
|
||||
jfloat theY)
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppOnClick (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr,
|
||||
jint theX,
|
||||
jint theY)
|
||||
{
|
||||
((OcctJni_Viewer* )theCppPtr)->SelectInViewer (Graphic3d_Vec2i ((int )theX, (int )theY));
|
||||
((OcctJni_Viewer* )theCppPtr)->onClick (theX, theY);
|
||||
}
|
||||
|
||||
jexp void JNICALL Java_com_opencascade_jnisample_OcctJniRenderer_cppStopAction (JNIEnv* theEnv,
|
||||
jobject theObj,
|
||||
jlong theCppPtr)
|
||||
{
|
||||
((OcctJni_Viewer* )theCppPtr)->stopAction();
|
||||
}
|
||||
|
||||
jexp jlong JNICALL Java_com_opencascade_jnisample_OcctJniActivity_cppOcctMajorVersion (JNIEnv* theEnv,
|
@@ -11,22 +11,21 @@
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <OcctJni_Window.hxx>
|
||||
|
||||
#include <AIS_InteractiveContext.hxx>
|
||||
#include <AIS_ViewController.hxx>
|
||||
#include <TopoDS_Shape.hxx>
|
||||
#include <V3d_Viewer.hxx>
|
||||
#include <V3d_View.hxx>
|
||||
|
||||
class AIS_ViewCube;
|
||||
|
||||
//! Main C++ back-end for activity.
|
||||
class OcctJni_Viewer : public AIS_ViewController
|
||||
class OcctJni_Viewer
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! Empty constructor
|
||||
OcctJni_Viewer (float theDispDensity);
|
||||
OcctJni_Viewer();
|
||||
|
||||
//! Initialize the viewer
|
||||
bool init();
|
||||
@@ -47,45 +46,43 @@ public:
|
||||
int theHeight = 0);
|
||||
|
||||
//! Viewer update.
|
||||
//! Returns TRUE if more frames should be requested.
|
||||
bool redraw();
|
||||
void redraw();
|
||||
|
||||
//! Move camera
|
||||
void setProj (V3d_TypeOfOrientation theProj)
|
||||
{
|
||||
if (myView.IsNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
myView->SetProj (theProj);
|
||||
myView->Invalidate();
|
||||
}
|
||||
void setProj (V3d_TypeOfOrientation theProj) { if (!myView.IsNull()) myView->SetProj (theProj); }
|
||||
|
||||
//! Fit All.
|
||||
void fitAll();
|
||||
|
||||
//! Start rotation (remember first point position)
|
||||
void startRotation (int theStartX,
|
||||
int theStartY);
|
||||
|
||||
//! Perform rotation (relative to first point)
|
||||
void onRotation (int theX,
|
||||
int theY);
|
||||
|
||||
//! Perform panning
|
||||
void onPanning (int theDX,
|
||||
int theDY);
|
||||
|
||||
//! Perform selection
|
||||
void onClick (int theX,
|
||||
int theY);
|
||||
|
||||
//! Stop previously started action
|
||||
void stopAction();
|
||||
|
||||
protected:
|
||||
|
||||
//! Reset viewer content.
|
||||
void initContent();
|
||||
|
||||
//! Print information about OpenGL ES context.
|
||||
void dumpGlInfo (bool theIsBasic);
|
||||
|
||||
//! Handle redraw.
|
||||
virtual void handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx,
|
||||
const Handle(V3d_View)& theView) override;
|
||||
|
||||
protected:
|
||||
|
||||
Handle(V3d_Viewer) myViewer;
|
||||
Handle(V3d_View) myView;
|
||||
Handle(AIS_InteractiveContext) myContext;
|
||||
Handle(Prs3d_TextAspect) myTextStyle; //!< text style for OSD elements
|
||||
Handle(AIS_ViewCube) myViewCube; //!< view cube object
|
||||
TopoDS_Shape myShape;
|
||||
float myDevicePixelRatio; //!< device pixel ratio for handling high DPI displays
|
||||
bool myIsJniMoreFrames; //!< need more frame flag
|
||||
|
||||
};
|
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2020 OPEN CASCADE SAS
|
||||
// Copyright (c) 2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
@@ -11,6 +11,6 @@
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#include <StdPrs_HLRShapeI.hxx>
|
||||
#include <OcctJni_Window.hxx>
|
||||
|
||||
IMPLEMENT_STANDARD_RTTIEXT(StdPrs_HLRShapeI, Standard_Transient)
|
||||
IMPLEMENT_STANDARD_RTTIEXT(OcctJni_Window, Aspect_Window)
|
109
samples/java/jniviewer/jni/OcctJni_Window.hxx
Normal file
@@ -0,0 +1,109 @@
|
||||
// Copyright (c) 2014 OPEN CASCADE SAS
|
||||
//
|
||||
// This file is part of Open CASCADE Technology software library.
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or modify it under
|
||||
// the terms of the GNU Lesser General Public License version 2.1 as published
|
||||
// by the Free Software Foundation, with special exception defined in the file
|
||||
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
||||
// distribution for complete text of the license and disclaimer of any warranty.
|
||||
//
|
||||
// Alternatively, this file may be used under the terms of Open CASCADE
|
||||
// commercial license or contractual agreement.
|
||||
|
||||
#ifndef OcctJni_Window_H
|
||||
#define OcctJni_Window_H
|
||||
|
||||
#include <Aspect_Window.hxx>
|
||||
|
||||
//! This class defines dummy window
|
||||
class OcctJni_Window : public Aspect_Window
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//! Creates a wrapper over existing Window handle
|
||||
OcctJni_Window (const int theWidth, const int theHeight)
|
||||
: myWidth (theWidth), myHeight(theHeight) {}
|
||||
|
||||
//! Returns native Window handle
|
||||
virtual Aspect_Drawable NativeHandle() const Standard_OVERRIDE { return 0; }
|
||||
|
||||
//! Returns parent of native Window handle
|
||||
virtual Aspect_Drawable NativeParentHandle() const Standard_OVERRIDE { return 0; }
|
||||
|
||||
//! Returns nothing on Android
|
||||
virtual Aspect_FBConfig NativeFBConfig() const Standard_OVERRIDE { return 0; }
|
||||
|
||||
virtual void Destroy() {}
|
||||
|
||||
//! Opens the window <me>
|
||||
virtual void Map() const Standard_OVERRIDE {}
|
||||
|
||||
//! Closes the window <me>
|
||||
virtual void Unmap() const Standard_OVERRIDE {}
|
||||
|
||||
//! Applies the resizing to the window <me>
|
||||
virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE { return Aspect_TOR_UNKNOWN; }
|
||||
|
||||
//! Apply the mapping change to the window <me>
|
||||
virtual Standard_Boolean DoMapping() const Standard_OVERRIDE { return Standard_True; }
|
||||
|
||||
//! Returns True if the window <me> is opened
|
||||
virtual Standard_Boolean IsMapped() const Standard_OVERRIDE { return Standard_True; }
|
||||
|
||||
//! Returns The Window RATIO equal to the physical WIDTH/HEIGHT dimensions
|
||||
virtual Standard_Real Ratio() const Standard_OVERRIDE { return 1.0; }
|
||||
|
||||
//! Returns The Window POSITION in PIXEL
|
||||
virtual void Position (Standard_Integer& theX1,
|
||||
Standard_Integer& theY1,
|
||||
Standard_Integer& theX2,
|
||||
Standard_Integer& theY2) const Standard_OVERRIDE
|
||||
{
|
||||
theX1 = 0;
|
||||
theX2 = myWidth;
|
||||
theY1 = 0;
|
||||
theY2 = myHeight;
|
||||
}
|
||||
|
||||
//! Set The Window POSITION in PIXEL
|
||||
void SetPosition (const Standard_Integer theX1,
|
||||
const Standard_Integer theY1,
|
||||
const Standard_Integer theX2,
|
||||
const Standard_Integer theY2)
|
||||
{
|
||||
myWidth = theX2 - theX1;
|
||||
myHeight = theY2 - theY1;
|
||||
}
|
||||
|
||||
//! Returns The Window SIZE in PIXEL
|
||||
virtual void Size (Standard_Integer& theWidth,
|
||||
Standard_Integer& theHeight) const Standard_OVERRIDE
|
||||
{
|
||||
theWidth = myWidth;
|
||||
theHeight = myHeight;
|
||||
}
|
||||
|
||||
//! Set The Window SIZE in PIXEL
|
||||
void SetSize (const Standard_Integer theWidth,
|
||||
const Standard_Integer theHeight)
|
||||
{
|
||||
myWidth = theWidth;
|
||||
myHeight = theHeight;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int myWidth;
|
||||
int myHeight;
|
||||
|
||||
public:
|
||||
|
||||
DEFINE_STANDARD_RTTIEXT(OcctJni_Window,Aspect_Window)
|
||||
|
||||
};
|
||||
|
||||
DEFINE_STANDARD_HANDLE(OcctJni_Window, Aspect_Window)
|
||||
|
||||
#endif // OcctJni_Window_H
|
14
samples/java/jniviewer/project.properties
Normal file
@@ -0,0 +1,14 @@
|
||||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-15
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1002 B After Width: | Height: | Size: 1002 B |
0
samples/java/jniviewer/app/src/main/res/drawable-hdpi/ic_launcher.png → samples/java/jniviewer/res/drawable-hdpi/ic_launcher.png
Normal file → Executable file
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 443 B After Width: | Height: | Size: 443 B |
Before Width: | Height: | Size: 917 B After Width: | Height: | Size: 917 B |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
0
samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_back.png → samples/java/jniviewer/res/drawable-hdpi/proj_back.png
Normal file → Executable file
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
0
samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_bottom.png → samples/java/jniviewer/res/drawable-hdpi/proj_bottom.png
Normal file → Executable file
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
0
samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_front.png → samples/java/jniviewer/res/drawable-hdpi/proj_front.png
Normal file → Executable file
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
0
samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_left.png → samples/java/jniviewer/res/drawable-hdpi/proj_left.png
Normal file → Executable file
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
0
samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_right.png → samples/java/jniviewer/res/drawable-hdpi/proj_right.png
Normal file → Executable file
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
0
samples/java/jniviewer/app/src/main/res/drawable-hdpi/proj_top.png → samples/java/jniviewer/res/drawable-hdpi/proj_top.png
Normal file → Executable file
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 839 B After Width: | Height: | Size: 839 B |
0
samples/java/jniviewer/app/src/main/res/drawable-mdpi/ic_launcher.png → samples/java/jniviewer/res/drawable-mdpi/ic_launcher.png
Normal file → Executable file
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
@@ -1 +0,0 @@
|
||||
include ':app'
|
@@ -110,8 +110,11 @@ public class OcctJniActivity extends Activity implements OnClickListener
|
||||
|
||||
// copy OCCT resources
|
||||
String aResFolder = getFilesDir().getAbsolutePath();
|
||||
copyAssetFolder (getAssets(), "src/SHMessage", aResFolder + "/SHMessage");
|
||||
copyAssetFolder (getAssets(), "src/XSMessage", aResFolder + "/XSMessage");
|
||||
copyAssetFolder (getAssets(), "Shaders", aResFolder + "/Shaders");
|
||||
copyAssetFolder (getAssets(), "SHMessage", aResFolder + "/SHMessage");
|
||||
copyAssetFolder (getAssets(), "XSMessage", aResFolder + "/XSMessage");
|
||||
copyAssetFolder (getAssets(), "TObj", aResFolder + "/TObj");
|
||||
copyAssetFolder (getAssets(), "UnitsAPI", aResFolder + "/UnitsAPI");
|
||||
|
||||
// C++ runtime
|
||||
loadLibVerbose ("gnustl_shared", aLoaded, aFailed);
|
||||
@@ -201,9 +204,6 @@ public class OcctJniActivity extends Activity implements OnClickListener
|
||||
String aDataPath = aDataUrl != null ? aDataUrl.getPath() : "";
|
||||
myOcctView.open (aDataPath);
|
||||
myLastPath = aDataPath;
|
||||
|
||||
myContext = new android.content.ContextWrapper (this);
|
||||
myContext.getExternalFilesDir (null);
|
||||
}
|
||||
|
||||
//! Handle scroll events
|
||||
@@ -513,9 +513,6 @@ public class OcctJniActivity extends Activity implements OnClickListener
|
||||
aClickedBtn.setBackgroundColor (getResources().getColor(R.color.pressedBtnColor));
|
||||
if (myFileOpenDialog == null)
|
||||
{
|
||||
// should be requested on runtime since API level 26 (Android 8)
|
||||
askUserPermission (android.Manifest.permission.WRITE_EXTERNAL_STORAGE, null); // for accessing SD card
|
||||
|
||||
myFileOpenDialog = new OcctJniFileDialog (this, aPath);
|
||||
myFileOpenDialog.setFileEndsWith (".brep");
|
||||
myFileOpenDialog.setFileEndsWith (".rle");
|
||||
@@ -763,88 +760,6 @@ public class OcctJniActivity extends Activity implements OnClickListener
|
||||
return aResultSize;
|
||||
}
|
||||
|
||||
//! Request user permission.
|
||||
private void askUserPermission (String thePermission, String theRationale)
|
||||
{
|
||||
// Dynamically load methods introduced by API level 23.
|
||||
// On older system this permission is granted by user during application installation.
|
||||
java.lang.reflect.Method aMetPtrCheckSelfPermission, aMetPtrRequestPermissions, aMetPtrShouldShowRequestPermissionRationale;
|
||||
try
|
||||
{
|
||||
aMetPtrCheckSelfPermission = myContext.getClass().getMethod ("checkSelfPermission", String.class);
|
||||
aMetPtrRequestPermissions = getClass().getMethod ("requestPermissions", String[].class, int.class);
|
||||
aMetPtrShouldShowRequestPermissionRationale = getClass().getMethod ("shouldShowRequestPermissionRationale", String.class);
|
||||
}
|
||||
catch (SecurityException theError)
|
||||
{
|
||||
postMessage ("Unable to find permission methods:\n" + theError.getMessage(), Message_Trace);
|
||||
return;
|
||||
}
|
||||
catch (NoSuchMethodException theError)
|
||||
{
|
||||
postMessage ("Unable to find permission methods:\n" + theError.getMessage(), Message_Trace);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
int isAlreadyGranted = (Integer )aMetPtrCheckSelfPermission.invoke (myContext, thePermission);
|
||||
if (isAlreadyGranted == android.content.pm.PackageManager.PERMISSION_GRANTED)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
boolean toShowInfo = theRationale != null && (Boolean )aMetPtrShouldShowRequestPermissionRationale.invoke (this, thePermission);
|
||||
if (toShowInfo)
|
||||
{
|
||||
postMessage (theRationale, Message_Info);
|
||||
}
|
||||
|
||||
// show dialog to user
|
||||
aMetPtrRequestPermissions.invoke (this, new String[]{thePermission}, 0);
|
||||
}
|
||||
catch (IllegalArgumentException theError)
|
||||
{
|
||||
postMessage ("Internal error: Unable to call permission method:\n" + theError.getMessage(), Message_Fail);
|
||||
return;
|
||||
}
|
||||
catch (IllegalAccessException theError)
|
||||
{
|
||||
postMessage ("Internal error: Unable to call permission method:\n" + theError.getMessage(), Message_Fail);
|
||||
return;
|
||||
}
|
||||
catch (java.lang.reflect.InvocationTargetException theError)
|
||||
{
|
||||
postMessage ("Internal error: Unable to call permission method:\n" + theError.getMessage(), Message_Fail);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//! Message gravity.
|
||||
private static final int Message_Trace = 0;
|
||||
private static final int Message_Info = 1;
|
||||
private static final int Message_Warning = 2;
|
||||
private static final int Message_Alarm = 3;
|
||||
private static final int Message_Fail = 4;
|
||||
|
||||
//! Auxiliary method to show info message.
|
||||
public void postMessage (String theMessage, int theGravity)
|
||||
{
|
||||
if (theGravity == Message_Trace)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final String aText = theMessage;
|
||||
final Context aCtx = this;
|
||||
this.runOnUiThread (new Runnable() { public void run() {
|
||||
android.app.AlertDialog.Builder aBuilder = new android.app.AlertDialog.Builder (aCtx);
|
||||
aBuilder.setMessage (aText).setNegativeButton ("OK", null);
|
||||
android.app.AlertDialog aDialog = aBuilder.create();
|
||||
aDialog.show();
|
||||
}});
|
||||
}
|
||||
|
||||
//! OCCT major version
|
||||
private native long cppOcctMajorVersion();
|
||||
|
||||
@@ -857,7 +772,6 @@ public class OcctJniActivity extends Activity implements OnClickListener
|
||||
private OcctJniView myOcctView;
|
||||
private TextView myMessageTextView;
|
||||
private String myLastPath;
|
||||
private android.content.ContextWrapper myContext = null;
|
||||
private OcctJniFileDialog myFileOpenDialog;
|
||||
private int myButtonPreferSize = 65;
|
||||
|
@@ -34,13 +34,11 @@ public class OcctJniRenderer implements GLSurfaceView.Renderer
|
||||
};
|
||||
|
||||
//! Empty constructor.
|
||||
OcctJniRenderer (GLSurfaceView theView,
|
||||
float theScreenDensity)
|
||||
OcctJniRenderer()
|
||||
{
|
||||
myView = theView; // this makes cyclic dependency, but it is OK for JVM
|
||||
if (OcctJniActivity.areNativeLoaded)
|
||||
{
|
||||
myCppViewer = cppCreate (theScreenDensity);
|
||||
myCppViewer = cppCreate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,10 +56,7 @@ public class OcctJniRenderer implements GLSurfaceView.Renderer
|
||||
{
|
||||
if (myCppViewer != 0)
|
||||
{
|
||||
if (cppRedraw (myCppViewer))
|
||||
{
|
||||
myView.requestRender(); // this method is allowed from any thread
|
||||
}
|
||||
cppRedraw (myCppViewer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,39 +77,48 @@ public class OcctJniRenderer implements GLSurfaceView.Renderer
|
||||
}
|
||||
}
|
||||
|
||||
//! Add touch point.
|
||||
public void onAddTouchPoint (int theId, float theX, float theY)
|
||||
//! Initialize rotation (remember first point position)
|
||||
public void onStartRotation (int theStartX, int theStartY)
|
||||
{
|
||||
if (myCppViewer != 0)
|
||||
{
|
||||
cppAddTouchPoint (myCppViewer, theId, theX, theY);
|
||||
cppStartRotation (myCppViewer, theStartX, theStartY);
|
||||
}
|
||||
}
|
||||
|
||||
//! Update touch point.
|
||||
public void onUpdateTouchPoint (int theId, float theX, float theY)
|
||||
//! Perform rotation (relative to first point)
|
||||
public void onRotation (int theX, int theY)
|
||||
{
|
||||
if (myCppViewer != 0)
|
||||
{
|
||||
cppUpdateTouchPoint (myCppViewer, theId, theX, theY);
|
||||
cppOnRotation (myCppViewer, theX, theY);
|
||||
}
|
||||
}
|
||||
|
||||
//! Remove touch point.
|
||||
public void onRemoveTouchPoint (int theId)
|
||||
//! Perform panning
|
||||
public void onPanning (int theDX, int theDY)
|
||||
{
|
||||
if (myCppViewer != 0)
|
||||
{
|
||||
cppRemoveTouchPoint (myCppViewer, theId);
|
||||
cppOnPanning (myCppViewer, theDX, theDY);
|
||||
}
|
||||
}
|
||||
|
||||
//! Select in 3D Viewer.
|
||||
public void onSelectInViewer (float theX, float theY)
|
||||
//! Perform selection
|
||||
public void onClick (int theX, int theY)
|
||||
{
|
||||
if (myCppViewer != 0)
|
||||
{
|
||||
cppSelectInViewer (myCppViewer, theX, theY);
|
||||
cppOnClick (myCppViewer, theX, theY);
|
||||
}
|
||||
}
|
||||
|
||||
//! Stop previously active action (e.g. discard first rotation point)
|
||||
public void onStopAction()
|
||||
{
|
||||
if (myCppViewer != 0)
|
||||
{
|
||||
cppStopAction (myCppViewer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,7 +157,7 @@ public class OcctJniRenderer implements GLSurfaceView.Renderer
|
||||
}
|
||||
|
||||
//! Create instance of C++ class
|
||||
private native long cppCreate (float theDispDensity);
|
||||
private native long cppCreate();
|
||||
|
||||
//! Destroy instance of C++ class
|
||||
private native void cppDestroy (long theCppPtr);
|
||||
@@ -167,21 +171,11 @@ public class OcctJniRenderer implements GLSurfaceView.Renderer
|
||||
//! Open CAD file
|
||||
private native void cppOpen (long theCppPtr, String thePath);
|
||||
|
||||
//! Add touch point
|
||||
private native void cppAddTouchPoint (long theCppPtr, int theId, float theX, float theY);
|
||||
|
||||
//! Update touch point
|
||||
private native void cppUpdateTouchPoint (long theCppPtr, int theId, float theX, float theY);
|
||||
|
||||
//! Remove touch point
|
||||
private native void cppRemoveTouchPoint (long theCppPtr, int theId);
|
||||
|
||||
//! Select in 3D Viewer.
|
||||
private native void cppSelectInViewer (long theCppPtr, float theX, float theY);
|
||||
//! Handle detection in the viewer
|
||||
private native void cppMoveTo (long theCppPtr, int theX, int theY);
|
||||
|
||||
//! Redraw OCCT viewer
|
||||
//! Returns TRUE if more frames are requested.
|
||||
private native boolean cppRedraw (long theCppPtr);
|
||||
private native void cppRedraw (long theCppPtr);
|
||||
|
||||
//! Fit All
|
||||
private native void cppFitAll (long theCppPtr);
|
||||
@@ -204,7 +198,21 @@ public class OcctJniRenderer implements GLSurfaceView.Renderer
|
||||
//! Move camera
|
||||
private native void cppSetZnegProj (long theCppPtr);
|
||||
|
||||
private GLSurfaceView myView = null; //!< back reference to the View
|
||||
//! Initialize rotation
|
||||
private native void cppStartRotation (long theCppPtr, int theStartX, int theStartY);
|
||||
|
||||
//! Perform rotation
|
||||
private native void cppOnRotation (long theCppPtr, int theX, int theY);
|
||||
|
||||
//! Perform panning
|
||||
private native void cppOnPanning (long theCppPtr, int theDX, int theDY);
|
||||
|
||||
//! Perform selection
|
||||
private native void cppOnClick (long theCppPtr, int theX, int theY);
|
||||
|
||||
//! Stop action (rotation / panning / scaling)
|
||||
private native void cppStopAction (long theCppPtr);
|
||||
|
||||
private long myCppViewer = 0; //!< pointer to c++ class instance
|
||||
|
||||
}
|
@@ -38,9 +38,6 @@ class OcctJniView extends GLSurfaceView
|
||||
{
|
||||
super (theContext, theAttrs);
|
||||
|
||||
android.util.DisplayMetrics aDispInfo = theContext.getResources().getDisplayMetrics();
|
||||
myScreenDensity = aDispInfo.density;
|
||||
|
||||
setPreserveEGLContextOnPause (true);
|
||||
setEGLContextFactory (new ContextFactory());
|
||||
setEGLConfigChooser (new ConfigChooser());
|
||||
@@ -48,9 +45,8 @@ class OcctJniView extends GLSurfaceView
|
||||
RelativeLayout.LayoutParams aLParams = new RelativeLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
|
||||
aLParams.addRule (RelativeLayout.ALIGN_TOP);
|
||||
|
||||
myRenderer = new OcctJniRenderer (this, myScreenDensity);
|
||||
myRenderer = new OcctJniRenderer();
|
||||
setRenderer (myRenderer);
|
||||
setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY); // render on request to spare battery
|
||||
}
|
||||
|
||||
//! Open file.
|
||||
@@ -58,7 +54,6 @@ class OcctJniView extends GLSurfaceView
|
||||
{
|
||||
final String aPath = thePath;
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.open (aPath); }});
|
||||
requestRender();
|
||||
}
|
||||
|
||||
//! Create OpenGL ES 2.0+ context
|
||||
@@ -207,44 +202,77 @@ class OcctJniView extends GLSurfaceView
|
||||
//! Callback to handle touch events
|
||||
@Override public boolean onTouchEvent (MotionEvent theEvent)
|
||||
{
|
||||
final int aMaskedAction = theEvent.getActionMasked();
|
||||
int aPointerIndex = theEvent.getActionIndex();
|
||||
int aPointerId = theEvent.getPointerId (aPointerIndex);
|
||||
int aMaskedAction = theEvent.getActionMasked();
|
||||
switch (aMaskedAction)
|
||||
{
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
case MotionEvent.ACTION_POINTER_DOWN:
|
||||
{
|
||||
final int aPointerIndex = theEvent.getActionIndex();
|
||||
final int aPointerId = theEvent.getPointerId (aPointerIndex);
|
||||
final PointF aPnt = new PointF (theEvent.getX (aPointerIndex), theEvent.getY (aPointerIndex));
|
||||
|
||||
if (theEvent.getPointerCount() == 1)
|
||||
PointF aPntLast = null;
|
||||
if (myActivePointers.size() >= 1)
|
||||
{
|
||||
mySelectPoint = aPnt;
|
||||
}
|
||||
else
|
||||
{
|
||||
mySelectPoint = null;
|
||||
aPntLast = myActivePointers.get (myActivePointers.keyAt (0));
|
||||
}
|
||||
|
||||
final PointF aPnt = new PointF();
|
||||
aPnt.x = theEvent.getX (aPointerIndex);
|
||||
aPnt.y = theEvent.getY (aPointerIndex);
|
||||
myActivePointers.put (aPointerId, aPnt);
|
||||
|
||||
switch (myActivePointers.size())
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
final int aStartX = (int )aPnt.x;
|
||||
final int aStartY = (int )aPnt.y;
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onStartRotation (aStartX, aStartY); }});
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
myPanFrom.x = (aPntLast.x + aPnt.x) * 0.5f;
|
||||
myPanFrom.y = (aPntLast.y + aPnt.y) * 0.5f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onAddTouchPoint (aPointerId, aPnt.x, aPnt.y); }});
|
||||
break;
|
||||
}
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
{
|
||||
for (int aNbPointers = theEvent.getPointerCount(), aPntIter = 0; aPntIter < aNbPointers; ++aPntIter)
|
||||
{
|
||||
final int aPointerId = theEvent.getPointerId (aPntIter);
|
||||
final PointF aPnt = new PointF (theEvent.getX (aPntIter), theEvent.getY (aPntIter));
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onUpdateTouchPoint (aPointerId, aPnt.x, aPnt.y); }});
|
||||
}
|
||||
if (mySelectPoint != null)
|
||||
{
|
||||
final float aTouchThreshold = 5.0f * myScreenDensity;
|
||||
final int aPointerIndex = theEvent.getActionIndex();
|
||||
final PointF aDelta = new PointF (theEvent.getX (aPointerIndex) - mySelectPoint.x, theEvent.getY (aPointerIndex) - mySelectPoint.y);
|
||||
if (Math.abs (aDelta.x) > aTouchThreshold || Math.abs (aDelta.y) > aTouchThreshold)
|
||||
PointF aPnt = myActivePointers.get (theEvent.getPointerId (aPntIter));
|
||||
if (aPnt != null)
|
||||
{
|
||||
mySelectPoint = null;
|
||||
aPnt.x = theEvent.getX (aPntIter);
|
||||
aPnt.y = theEvent.getY (aPntIter);
|
||||
}
|
||||
}
|
||||
|
||||
switch (myActivePointers.size())
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
PointF aPnt = myActivePointers.get (theEvent.getPointerId (0));
|
||||
final int anX = (int )aPnt.x;
|
||||
final int anY = (int )aPnt.y;
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onRotation (anX, anY); }});
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
PointF aPnt1 = myActivePointers.get (myActivePointers.keyAt (0));
|
||||
PointF aPnt2 = myActivePointers.get (myActivePointers.keyAt (1));
|
||||
PointF aPntAver = new PointF ((aPnt1.x + aPnt2.x) * 0.5f,
|
||||
(aPnt1.y + aPnt2.y) * 0.5f);
|
||||
final int aDX = (int )(aPntAver.x - myPanFrom.x);
|
||||
final int aDY = (int )(myPanFrom.y -aPntAver.y);
|
||||
myPanFrom.x = aPntAver.x;
|
||||
myPanFrom.y = aPntAver.y;
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onPanning (aDX, aDY); }});
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -253,21 +281,30 @@ class OcctJniView extends GLSurfaceView
|
||||
case MotionEvent.ACTION_POINTER_UP:
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
{
|
||||
if (mySelectPoint != null)
|
||||
myActivePointers.remove (aPointerId);
|
||||
if (myActivePointers.size() == 0)
|
||||
{
|
||||
final float aSelX = mySelectPoint.x;
|
||||
final float aSelY = mySelectPoint.y;
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onSelectInViewer (aSelX, aSelY); }});
|
||||
mySelectPoint = null;
|
||||
final int aPressX = (int )theEvent.getX (aPointerIndex);
|
||||
final int aPressY = (int )theEvent.getY (aPointerIndex);
|
||||
double aPressTimeMs = theEvent.getEventTime() - theEvent.getDownTime();
|
||||
if (aPressTimeMs < 100.0)
|
||||
{
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onClick (aPressX, aPressY); }});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
final int aPointerIndex = theEvent.getActionIndex();
|
||||
final int aPointerId = theEvent.getPointerId (aPointerIndex);
|
||||
final PointF aPnt = new PointF (theEvent.getX (aPointerIndex), theEvent.getY (aPointerIndex));
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onRemoveTouchPoint (aPointerId); }});
|
||||
else if (myActivePointers.size() == 1)
|
||||
{
|
||||
PointF aPnt = myActivePointers.get (myActivePointers.keyAt (0));
|
||||
final int aStartX = (int )aPnt.x;
|
||||
final int aStartY = (int )aPnt.y;
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.onStartRotation (aStartX, aStartY); }});
|
||||
}
|
||||
//queueEvent (new Runnable() { public void run() { myRenderer.onStopAction(); }});
|
||||
break;
|
||||
}
|
||||
}
|
||||
requestRender();
|
||||
///invalidate();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -275,20 +312,21 @@ class OcctJniView extends GLSurfaceView
|
||||
public void fitAll()
|
||||
{
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.fitAll(); }});
|
||||
requestRender();
|
||||
}
|
||||
|
||||
//! Move camera
|
||||
public void setProj (final OcctJniRenderer.TypeOfOrientation theProj)
|
||||
{
|
||||
queueEvent (new Runnable() { public void run() { myRenderer.setProj (theProj); }});
|
||||
requestRender();
|
||||
}
|
||||
|
||||
//! OCCT viewer
|
||||
private OcctJniRenderer myRenderer = null;
|
||||
private int mySelectId = -1;
|
||||
private PointF mySelectPoint = null;
|
||||
private float myScreenDensity = 1.0f;
|
||||
private OcctJniRenderer myRenderer = null;
|
||||
|
||||
//! Touch events cache
|
||||
private SparseArray<PointF> myActivePointers = new SparseArray<PointF>();
|
||||
|
||||
//! Starting point for panning event
|
||||
private PointF myPanFrom = new PointF (0.0f, 0.0f);
|
||||
|
||||
}
|
57
samples/mfc/occtdemo/All/All.vcproj
Executable file
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="windows-1251"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="All"
|
||||
SccProjectName=""
|
||||
SccLocalPath=""
|
||||
Keyword="MakeFileProj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\Debug"
|
||||
IntermediateDirectory=".\Debug"
|
||||
ConfigurationType="10"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TypeLibraryName=".\Debug/All.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\Release"
|
||||
IntermediateDirectory=".\Release"
|
||||
ConfigurationType="10"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE">
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TypeLibraryName=".\Release/All.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
431
samples/mfc/occtdemo/Approx/Approx.vcproj
Executable file
@@ -0,0 +1,431 @@
|
||||
<?xml version="1.0" encoding="windows-1251"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="Approx"
|
||||
SccProjectName=""
|
||||
SccLocalPath=""
|
||||
Keyword="MFCProj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\../Debug"
|
||||
IntermediateDirectory=".\../Debug/objd"
|
||||
ConfigurationType="1"
|
||||
UseOfMFC="2"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../,../Common,../Common/WNT,../Common/ISession"
|
||||
PreprocessorDefinitions="_DEBUG;WIN32;_WINDOWS;WNT"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="StdAfx.h"
|
||||
PrecompiledHeaderFile=".\../Debug/objd/Approx.pch"
|
||||
AssemblerListingLocation=".\../Debug/objd/"
|
||||
ObjectFile=".\../Debug/objd/"
|
||||
ProgramDataBaseFileName=".\../Debug/objd/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="TKBO.lib TKBool.lib TKCAF.lib TKCDF.lib TKDraw.lib TKernel.lib TKFeat.lib TKFillet.lib TKGeomAlgo.lib TKHLR.lib TKMath.lib TKOffset.lib TKPCAF.lib TKPrim.lib TKPShape.lib TKService.lib TKTopAlgo.lib TKV2d.lib TKV3d.lib TKBRep.lib TKG2d.lib TKG3d.lib TKGeomBase.lib"
|
||||
OutputFile=".\../Debug/Approx.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\../Debug/Approx.pdb"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\../Debug/Approx.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\../Release"
|
||||
IntermediateDirectory=".\../Release/obj"
|
||||
ConfigurationType="1"
|
||||
UseOfMFC="2"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="../,../Common,../Common/WNT,../Common/ISession"
|
||||
PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;WNT"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="StdAfx.h"
|
||||
PrecompiledHeaderFile=".\../Release/obj/Approx.pch"
|
||||
AssemblerListingLocation=".\../Release/obj/"
|
||||
ObjectFile=".\../Release/obj/"
|
||||
ProgramDataBaseFileName=".\../Release/obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="TKBO.lib TKBool.lib TKCAF.lib TKCDF.lib TKDraw.lib TKernel.lib TKFeat.lib TKFillet.lib TKGeomAlgo.lib TKHLR.lib TKMath.lib TKOffset.lib TKPCAF.lib TKPrim.lib TKPShape.lib TKService.lib TKTopAlgo.lib TKV2d.lib TKV3d.lib TKBRep.lib TKG2d.lib TKG3d.lib TKGeomBase.lib"
|
||||
OutputFile=".\../Release/Approx.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
ProgramDatabaseFile=".\../Release/Approx.pdb"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\../Release/Approx.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="Approx_Presentation.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="Approx_Presentation.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Common"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\env.bat">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\readme.txt">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\run.bat">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\vc.bat">
|
||||
</File>
|
||||
<Filter
|
||||
Name="Source Files No. 1"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\Common\ISession\ISession_Curve.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\MainFrm.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemo.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemo.rc">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions=""
|
||||
AdditionalIncludeDirectories="\RLS\tmp\demo\Common\WNT"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions=""
|
||||
AdditionalIncludeDirectories="\RLS\tmp\demo\Common\WNT"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\OCCDemo_Presentation.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoDoc.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoView.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\ResultDialog.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\StdAfx.cpp">
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files No. 1"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\Common\ISession\ISession_Curve.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\MainFrm.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemo.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\OCCDemo_Presentation.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoDoc.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoView.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\resource.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\ResultDialog.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\StdAfx.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\OCCDemo.ico">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\OCCDemo.rc2">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\toolbar.bmp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\toolbar1.bmp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\occ_logo.bmp">
|
||||
</File>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
603
samples/mfc/occtdemo/Approx/Approx_Presentation.cpp
Executable file
@@ -0,0 +1,603 @@
|
||||
// Approx_Presentation.cpp: implementation of the Approx_Presentation class.
|
||||
// Approximation of curves and surfaces from points.
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "Approx_Presentation.h"
|
||||
|
||||
#include <GeomAPI_PointsToBSpline.hxx>
|
||||
#include <GeomAPI_PointsToBSplineSurface.hxx>
|
||||
#include <TColgp_Array1OfPnt.hxx>
|
||||
#include <TColgp_Array2OfPnt.hxx>
|
||||
#include <TColStd_Array2OfReal.hxx>
|
||||
#include <gp_Pnt.hxx>
|
||||
|
||||
#ifdef WNT
|
||||
#define EOL "\r\n"
|
||||
#else
|
||||
#define EOL "\n"
|
||||
#endif
|
||||
|
||||
#define SCALE 100
|
||||
|
||||
|
||||
// Initialization of global variable with an instance of this class
|
||||
OCCDemo_Presentation* OCCDemo_Presentation::Current = new Approx_Presentation;
|
||||
|
||||
// Initialization of array of samples
|
||||
const Approx_Presentation::PSampleFuncType Approx_Presentation::SampleFuncs[] =
|
||||
{
|
||||
&Approx_Presentation::sample1,
|
||||
&Approx_Presentation::sample2,
|
||||
&Approx_Presentation::sample3,
|
||||
&Approx_Presentation::sample4
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
Approx_Presentation::Approx_Presentation()
|
||||
{
|
||||
myIndex = 0;
|
||||
myNbSamples = sizeof(SampleFuncs)/sizeof(PSampleFuncType);
|
||||
setName ("Approximation of curves and surfaces.");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Sample execution
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Approx_Presentation::DoSample()
|
||||
{
|
||||
getAISContext()->EraseAll();
|
||||
if (myIndex >=0 && myIndex < myNbSamples)
|
||||
(this->*SampleFuncs[myIndex])();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Sample functions
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//================================================================
|
||||
|
||||
//defining the data of BSpline curves and surfaces:
|
||||
|
||||
static Standard_Real Tol [] =
|
||||
{
|
||||
0.5*SCALE,
|
||||
0.7*SCALE,
|
||||
0.4*SCALE,
|
||||
1*SCALE
|
||||
};
|
||||
|
||||
static Standard_Integer DegMin [] =
|
||||
{
|
||||
2,3,5,7
|
||||
};
|
||||
|
||||
static Standard_Integer DegMax [] =
|
||||
{
|
||||
7,9,10,12
|
||||
};
|
||||
|
||||
static GeomAbs_Shape Continuity [] =
|
||||
{
|
||||
GeomAbs_C2, GeomAbs_C1, GeomAbs_C2, GeomAbs_C3
|
||||
};
|
||||
|
||||
|
||||
//================================================================
|
||||
// Function : Comment
|
||||
// Purpose :
|
||||
//================================================================
|
||||
|
||||
static TCollection_AsciiString Comment(Standard_Real Step,
|
||||
Standard_Integer Upper,
|
||||
Standard_Integer DegMin,
|
||||
Standard_Integer DegMax,
|
||||
Standard_Integer Indicator,
|
||||
Standard_Real Tol)
|
||||
{
|
||||
TCollection_AsciiString aText;
|
||||
aText = (
|
||||
"/////////////////////////////////////////////////////////////////" EOL
|
||||
"// Approximation of surface." EOL
|
||||
"// Building a BSpline surface which approximates a set of points." EOL
|
||||
"/////////////////////////////////////////////////////////////////" EOL EOL
|
||||
|
||||
"// creating a set of points:" EOL
|
||||
);
|
||||
|
||||
aText += "Standard_Real Step = ";
|
||||
aText += TCollection_AsciiString(Step);
|
||||
aText += ";" EOL;
|
||||
aText += "Standard_Integer Upper = ";
|
||||
aText += TCollection_AsciiString(Upper);
|
||||
aText += ";" EOL EOL;
|
||||
aText += (
|
||||
" //a set of X and Y coordinates:" EOL
|
||||
" Standard_Real aXStep = Step , aYStep = Step ;" EOL
|
||||
" Standard_Real aX0 = -300, aY0 = -200;" EOL
|
||||
" //Z coordinates:" EOL
|
||||
" TColStd_Array2OfReal aZPoints( 1, Upper , 1, Upper );" EOL EOL
|
||||
|
||||
"// initializing array of Z coordinates:" EOL
|
||||
"// aZPoints(1,1) = -2;" EOL
|
||||
"// aZPoints(1,2) = 3;" EOL
|
||||
"// ..." EOL EOL
|
||||
|
||||
"//creating a approximate BSpline surface:" EOL
|
||||
);
|
||||
|
||||
aText += "Parameters of surface:" EOL ;
|
||||
aText += "DegMin = ";
|
||||
aText += TCollection_AsciiString(DegMin);
|
||||
aText += ";" EOL;
|
||||
aText += "DegMax = ";
|
||||
aText += TCollection_AsciiString(DegMax);
|
||||
aText += ";" EOL;
|
||||
aText += "Continuity = " ;
|
||||
|
||||
if( Indicator == 2 )
|
||||
aText += "GeomAbs_C1";
|
||||
if( Indicator == 3 )
|
||||
aText += "GeomAbs_C2";
|
||||
if( Indicator == 4 )
|
||||
aText += "GeomAbs_C3";
|
||||
aText += ";" EOL;
|
||||
aText += "Tolerance = ";
|
||||
aText += TCollection_AsciiString(Tol/SCALE);
|
||||
aText += ";" EOL EOL ;
|
||||
|
||||
aText += (
|
||||
"GeomAPI_PointsToBSplineSurface aPTBS;" EOL
|
||||
"aPTBS.Init(aZPoints,aX0,aXStep,aY0,aYStep," EOL
|
||||
" DegMin,DegMax,Continuity,Tolerance);" EOL
|
||||
"Handle(Geom_BSplineSurface) aSurface = aPTBS.Surface();" EOL EOL EOL
|
||||
);
|
||||
|
||||
return aText;
|
||||
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : Approx_Presentation::CreateBSplineSurface
|
||||
// Purpose :
|
||||
//================================================================
|
||||
|
||||
Handle(Geom_BSplineSurface) Approx_Presentation::CreateBSplineSurface(TColStd_Array2OfReal& aZPoints,
|
||||
Standard_Real theXStep,
|
||||
Standard_Real theYStep,
|
||||
Standard_Integer Count)
|
||||
{
|
||||
Standard_Real aX0 = -300, aY0 = -200;
|
||||
|
||||
GeomAPI_PointsToBSplineSurface aPTBS;
|
||||
aPTBS.Init(aZPoints,aX0,theXStep,aY0,theYStep,
|
||||
DegMin[Count],DegMax[Count],Continuity[Count],Tol[Count]);
|
||||
Handle(Geom_BSplineSurface) aSurface = aPTBS.Surface();
|
||||
|
||||
return aSurface;
|
||||
}
|
||||
|
||||
|
||||
//================================================================
|
||||
// Function : Approx_Presentation::DrawModifyBSplineSurface
|
||||
// Purpose :
|
||||
//================================================================
|
||||
|
||||
Standard_Boolean Approx_Presentation::DrawModifyBSplineSurface(TColStd_Array2OfReal& aZPoints,
|
||||
Standard_Real theXStep,
|
||||
Standard_Real theYStep,
|
||||
Standard_Integer theIndexX,
|
||||
Standard_Integer theIndexY,
|
||||
Standard_Real theDeflection,
|
||||
Handle(AIS_InteractiveObject)& aMovePnt,
|
||||
Handle(AIS_InteractiveObject)& aObj,
|
||||
Standard_Integer Count)
|
||||
|
||||
{
|
||||
Handle(AIS_InteractiveObject) auxObj;
|
||||
Standard_Real aX0 = -300, aY0 = -200;
|
||||
Standard_Real aLastZ = aZPoints(theIndexX,theIndexY);
|
||||
aZPoints(theIndexX,theIndexY) += 100*theDeflection;
|
||||
Standard_Real aCurrentX = aX0 + theXStep*(theIndexX-1),
|
||||
aCurrentY = aY0 + theYStep*(theIndexY-1);
|
||||
|
||||
getAISContext()->Erase(aMovePnt);
|
||||
aMovePnt = drawPoint(gp_Pnt(aCurrentX,aCurrentY,aZPoints(theIndexX,theIndexY)));
|
||||
|
||||
if(WAIT_A_LITTLE) return Standard_False;
|
||||
|
||||
|
||||
GeomAPI_PointsToBSplineSurface aPTBS;
|
||||
aPTBS.Init(aZPoints,aX0,theXStep,aY0,theYStep,
|
||||
DegMin[Count],DegMax[Count],Continuity[Count],Tol[Count]);
|
||||
|
||||
aZPoints(theIndexX,theIndexY) = aLastZ;
|
||||
|
||||
Handle(Geom_BSplineSurface) aSurface = aPTBS.Surface();
|
||||
|
||||
auxObj = drawSurface(aSurface);
|
||||
getAISContext()->Erase(aObj);
|
||||
aObj = auxObj;
|
||||
if(WAIT_A_SECOND) return Standard_False;
|
||||
|
||||
return Standard_True;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//================================================================
|
||||
// Function : Approx_Presentation::sample1
|
||||
// Purpose :
|
||||
//================================================================
|
||||
|
||||
void Approx_Presentation::sample1()
|
||||
{
|
||||
Standard_Integer Count = 0;
|
||||
|
||||
TCollection_AsciiString aText = (
|
||||
"//////////////////////////////////////////////////////////////" EOL
|
||||
"// Approximation of curve." EOL
|
||||
"// Building a BSpline curve which approximates a set of points." EOL
|
||||
"//////////////////////////////////////////////////////////////" EOL EOL
|
||||
|
||||
"// creating a set of points to approximate," EOL
|
||||
"// nPoint is the number of points:" EOL
|
||||
"Standard_Integer nPoint = 20;" EOL
|
||||
"TColgp_Array1OfPnt aCurvePoint (1, nPoint);" EOL EOL
|
||||
|
||||
"// initializing this array of points:" EOL
|
||||
"// aCurvePoint(1,1) = gp_Pnt(-6,1,0);" EOL
|
||||
"// aCurvePoint(1,2) = gp_Pnt(-5,1.5,0);" EOL
|
||||
"// ..." EOL EOL
|
||||
|
||||
"//creating an empty approximation algorithm:" EOL
|
||||
"GeomAPI_PointsToBSpline aPTB;" EOL EOL
|
||||
|
||||
"//creating a approximate BSpline curve:" EOL
|
||||
);
|
||||
|
||||
aText += "//parameters of curve:" EOL ;
|
||||
aText += "DegMin = ";
|
||||
aText += TCollection_AsciiString(DegMin[Count]);
|
||||
aText += ";" EOL;
|
||||
aText += "DegMax = ";
|
||||
aText += TCollection_AsciiString(DegMax[Count]);
|
||||
aText += ";" EOL;
|
||||
aText += "Continuity = GeomAbs_C2" ;
|
||||
aText += ";" EOL;
|
||||
aText += "Tolerance = ";
|
||||
aText += TCollection_AsciiString(Tol[Count]/SCALE);
|
||||
aText += ";" EOL EOL ;
|
||||
|
||||
aText += (
|
||||
"aPTB.Init(aCurvePoint,DegMin,DegMax,Continuity,Tolerance);" EOL
|
||||
"Handle(Geom_BSplineCurve) aCurve = aPTB.Curve();" EOL
|
||||
);
|
||||
|
||||
setResultTitle("Creating approximations of curves");
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
getAISContext()->EraseAll();
|
||||
|
||||
Standard_Real aCoords[][3] = {
|
||||
{-6,1,0},{-5,1.5,0},{-4,2,0},{-3.5,3,0},{-3,2.7,0},{-2,2.5,0},{-1.5,1,0},{-1,0.5,0},
|
||||
{0,0,0},{1,0.3,0},{2,1,0},{3,1.5,0},{4,2.3,0},{5,2.7,0},{5.5,3.2,0},{6,2.5,0},
|
||||
{7,2,0},{7.5,1,0},{8,0,0},{8.5,-1,0}
|
||||
};
|
||||
|
||||
Standard_Integer nPoint = sizeof(aCoords)/(sizeof(Standard_Real)*3);
|
||||
|
||||
TColgp_Array1OfPnt aCurvePoint (1, nPoint);
|
||||
|
||||
GeomAPI_PointsToBSpline aPTB;
|
||||
|
||||
Handle(AIS_InteractiveObject) aIndexPnt [2],aObj;
|
||||
Standard_Integer aIndex[2] = {9,13};
|
||||
Standard_Real aDeflection[2] = {-1.5,2};
|
||||
|
||||
for (Standard_Integer i=0; i < nPoint; i++)
|
||||
{
|
||||
aCurvePoint(i+1) = gp_Pnt (aCoords[i][0]*SCALE-100, aCoords[i][1]*SCALE-100, aCoords[i][2]*SCALE);
|
||||
if( i+1 == aIndex[0])
|
||||
aIndexPnt[0] = drawPoint(aCurvePoint(aIndex[0]));
|
||||
if( i+1 == aIndex[1])
|
||||
aIndexPnt[1] = drawPoint(aCurvePoint(aIndex[1]));
|
||||
if( i+1 != aIndex[0] && i+1 != aIndex[1])
|
||||
drawPoint(aCurvePoint(i+1));
|
||||
}
|
||||
|
||||
if(WAIT_A_LITTLE) return;
|
||||
|
||||
aPTB.Init(aCurvePoint,DegMin[Count],DegMax[Count],Continuity[Count],Tol[Count]);
|
||||
Handle(Geom_BSplineCurve) aCurve = aPTB.Curve();
|
||||
aObj = drawCurve(aCurve);
|
||||
|
||||
for( i = 0 ; i < 2 ; i++)
|
||||
{
|
||||
if (WAIT_A_SECOND) return;
|
||||
getAISContext()->Erase(aIndexPnt[i]);
|
||||
|
||||
aCurvePoint(aIndex[i]) = gp_Pnt(aCurvePoint(aIndex[i]).X()-SCALE*aDeflection[i],
|
||||
aCurvePoint(aIndex[i]).Y()+SCALE*aDeflection[i],
|
||||
aCurvePoint(aIndex[i]).Z());
|
||||
|
||||
|
||||
aIndexPnt[i] = drawPoint(aCurvePoint(aIndex[i]));
|
||||
aPTB.Init(aCurvePoint,DegMin[Count],DegMax[Count],Continuity[Count],Tol[Count]);
|
||||
aCurve = aPTB.Curve();
|
||||
|
||||
if (WAIT_A_LITTLE) return;
|
||||
getAISContext()->Erase(aObj);
|
||||
aObj = drawCurve(aCurve);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//================================================================
|
||||
// Function : Approx_Presentation::sample2
|
||||
// Purpose :
|
||||
//================================================================
|
||||
|
||||
void Approx_Presentation::sample2()
|
||||
{
|
||||
setResultTitle("Creating approximations of surfaces");
|
||||
|
||||
Standard_Integer Count = 1;
|
||||
Standard_Real aZCoords [] =
|
||||
{
|
||||
{-1},{0},{0},{1},{0},{-1},{-1},{0},{0},{-1.5},{-2.5},{0},{1},{-2},{-3},{0}
|
||||
};
|
||||
|
||||
Standard_Real aXStep = 175, aYStep = 175;
|
||||
Standard_Real aX0 = -300, aY0 = -200;
|
||||
|
||||
Standard_Integer anUpper = 4;
|
||||
TColStd_Array2OfReal aZPoints(1,anUpper,1,anUpper);
|
||||
|
||||
Standard_Integer aIndexX[] = { 4, 3, 2, 2, 1 };
|
||||
Standard_Integer aIndexY[] = { 4, 3, 2, 3, 4 };
|
||||
Standard_Real aDeflection[] = { 1.5, 2.5, 1.5, 1.5, -1 };
|
||||
|
||||
Standard_Integer aNumOfIndexPnt = sizeof(aIndexX)/sizeof(Standard_Integer);
|
||||
|
||||
|
||||
TColgp_Array2OfPnt aPnt(1,4,1,4);
|
||||
Handle(AIS_InteractiveObject) aShowPnt[4][4],aObj,aMovePnt;
|
||||
|
||||
Standard_Integer aColLength = aZPoints.ColLength();
|
||||
Standard_Integer aRowLength = aZPoints.RowLength();
|
||||
Standard_Integer aIndex = -1;
|
||||
|
||||
for(Standard_Integer i = 0 ; i < aRowLength ; i++)
|
||||
{
|
||||
for(Standard_Integer j = 0; j < aColLength ; j++)
|
||||
{
|
||||
aIndex++;
|
||||
aZPoints(i+1,j+1) = aZCoords[aIndex];
|
||||
}
|
||||
}
|
||||
|
||||
Standard_Real auxY0,auxX0 = aX0 - aXStep;
|
||||
|
||||
for( i = 0 ; i < aColLength ; i++)
|
||||
{
|
||||
auxX0 += aXStep;
|
||||
auxY0 = aY0 - aYStep;
|
||||
|
||||
for(Standard_Integer j = 0 ; j < aRowLength ; j++)
|
||||
{
|
||||
aZPoints(i+1,j+1) *=SCALE;
|
||||
auxY0 += aYStep;
|
||||
aPnt(i+1,j+1) = gp_Pnt (auxX0,auxY0,aZPoints(i+1,j+1));
|
||||
aShowPnt[i][j] = drawPoint(aPnt(i+1,j+1));
|
||||
}
|
||||
}
|
||||
|
||||
if(WAIT_A_LITTLE) return ;
|
||||
|
||||
TCollection_AsciiString aText;
|
||||
aText = Comment(aXStep,anUpper,DegMin[Count],DegMax[Count],Count+1,Tol[Count]);
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
Handle(Geom_BSplineSurface) aSurface = CreateBSplineSurface(aZPoints,aXStep,aYStep,Count);
|
||||
aObj = drawSurface(aSurface);
|
||||
Standard_Boolean aBool;
|
||||
if(WAIT_A_LITTLE) return ;
|
||||
|
||||
for( i = 0 ; i < aNumOfIndexPnt ; i++)
|
||||
{
|
||||
aMovePnt = aShowPnt[aIndexX[i]-1][aIndexY[i]-1];
|
||||
aBool = DrawModifyBSplineSurface(aZPoints,aXStep,aYStep,aIndexX[i],aIndexY[i],
|
||||
aDeflection[i],aMovePnt,aObj,Count);
|
||||
if(!aBool) return;
|
||||
|
||||
if( i < aNumOfIndexPnt - 1)
|
||||
{
|
||||
drawPoint(aPnt(aIndexX[i],aIndexY[i]));
|
||||
getAISContext()->Erase(aMovePnt);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//================================================================
|
||||
// Function : Approx_Presentation::sample3
|
||||
// Purpose :
|
||||
//================================================================
|
||||
|
||||
void Approx_Presentation::sample3()
|
||||
{
|
||||
setResultTitle("Creating approximations of surfaces");
|
||||
|
||||
Standard_Integer Count = 2;
|
||||
Standard_Real aZCoords [] =
|
||||
{
|
||||
{-3},{-2.3},{-3},{-0.5},{-1},{-1},{-1},{-1},{0},{0},{0},{0},{1},{-1},{-1},{0}
|
||||
};
|
||||
|
||||
Standard_Integer anUpper = 4;
|
||||
TColStd_Array2OfReal aZPoints(1,anUpper,1,anUpper);
|
||||
|
||||
Standard_Integer aIndexX[] = {1, 2, 3, 4};
|
||||
Standard_Integer aIndexY[] = {1, 2, 3, 4};
|
||||
Standard_Real aDeflection[] = {1.5, 2, 1, 1.5};
|
||||
|
||||
Standard_Integer aNumOfIndexPnt = sizeof(aIndexX)/sizeof(Standard_Integer);
|
||||
|
||||
|
||||
TColgp_Array2OfPnt aPnt(1,4,1,4);
|
||||
Handle(AIS_InteractiveObject) aShowPnt[4][4],aObj,aMovePnt;
|
||||
|
||||
Standard_Integer aColLength = aZPoints.ColLength();
|
||||
Standard_Integer aRowLength = aZPoints.RowLength();
|
||||
Standard_Integer aIndex = -1;
|
||||
|
||||
for(Standard_Integer i = 0 ; i < aRowLength ; i++)
|
||||
{
|
||||
for(Standard_Integer j = 0; j < aColLength ; j++)
|
||||
{
|
||||
aIndex++;
|
||||
aZPoints(i+1,j+1) = aZCoords[aIndex];
|
||||
}
|
||||
}
|
||||
|
||||
Standard_Real aXStep = 175, aYStep = 175;
|
||||
Standard_Real aX0 = -300, aY0 = -200;
|
||||
Standard_Real auxY0,auxX0 = aX0 - aXStep;
|
||||
|
||||
for( i = 0 ; i < aColLength ; i++)
|
||||
{
|
||||
auxX0 += aXStep;
|
||||
auxY0 = aY0 - aYStep;
|
||||
|
||||
for(Standard_Integer j = 0 ; j < aRowLength ; j++)
|
||||
{
|
||||
aZPoints(i+1,j+1) *=SCALE;
|
||||
auxY0 += aYStep;
|
||||
aPnt(i+1,j+1) = gp_Pnt (auxX0,auxY0,aZPoints(i+1,j+1));
|
||||
aShowPnt[i][j] = drawPoint(aPnt(i+1,j+1));
|
||||
}
|
||||
}
|
||||
|
||||
if(WAIT_A_LITTLE) return ;
|
||||
|
||||
TCollection_AsciiString aText;
|
||||
aText += Comment(aXStep,anUpper,DegMin[Count],DegMax[Count],Count+1,Tol[Count]);
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
Handle(Geom_BSplineSurface) aSurface = CreateBSplineSurface(aZPoints,aXStep,aYStep,Count);
|
||||
aObj = drawSurface(aSurface);
|
||||
Standard_Boolean aBool;
|
||||
if(WAIT_A_LITTLE) return ;
|
||||
|
||||
for( i = 0 ; i < aNumOfIndexPnt ; i++)
|
||||
{
|
||||
aMovePnt = aShowPnt[aIndexX[i]-1][aIndexY[i]-1];
|
||||
aBool = DrawModifyBSplineSurface(aZPoints,aXStep,aYStep,aIndexX[i],aIndexY[i],
|
||||
aDeflection[i],aMovePnt,aObj,Count);
|
||||
if(!aBool) return;
|
||||
|
||||
if( i < aNumOfIndexPnt - 1)
|
||||
{
|
||||
drawPoint(aPnt(aIndexX[i],aIndexY[i]));
|
||||
getAISContext()->Erase(aMovePnt);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//================================================================
|
||||
// Function : Approx_Presentation::sample4
|
||||
// Purpose :
|
||||
//================================================================
|
||||
|
||||
void Approx_Presentation::sample4()
|
||||
{
|
||||
setResultTitle("Creating approximations of surfaces");
|
||||
|
||||
Standard_Integer Count = 3;
|
||||
Standard_Real aZCoords [] =
|
||||
{
|
||||
{-1.5},{0.5},{1},{0.5},{-1.5},{0},{-0.5},{0},{-0.5},{0},{1},{-0.5},{0},{-0.5},{1},{0},{-0.5},
|
||||
{0},{-0.5},{0},{-1.5},{0.5},{1},{0.5},{-1.5}
|
||||
};
|
||||
|
||||
Standard_Integer anUpper = 5;
|
||||
TColStd_Array2OfReal aZPoints(1,anUpper,1,anUpper);
|
||||
|
||||
Standard_Integer aIndexX[] = { 1, 3, 5 };
|
||||
Standard_Integer aIndexY[] = { 3, 3, 3 };
|
||||
Standard_Real aDeflection[] = {-2, 1, -2 };
|
||||
|
||||
Standard_Integer aNumOfIndexPnt = sizeof(aIndexX)/sizeof(Standard_Integer);
|
||||
|
||||
|
||||
TColgp_Array2OfPnt aPnt(1,5,1,5);
|
||||
Handle(AIS_InteractiveObject) aShowPnt[5][5],aObj,aMovePnt;
|
||||
|
||||
Standard_Integer aColLength = aZPoints.ColLength();
|
||||
Standard_Integer aRowLength = aZPoints.RowLength();
|
||||
Standard_Integer aIndex = -1;
|
||||
|
||||
for(Standard_Integer i = 0 ; i < aRowLength ; i++)
|
||||
{
|
||||
for(Standard_Integer j = 0; j < aColLength ; j++)
|
||||
{
|
||||
aIndex++;
|
||||
aZPoints(i+1,j+1) = aZCoords[aIndex];
|
||||
}
|
||||
}
|
||||
|
||||
Standard_Real aXStep = 140, aYStep = 140;
|
||||
Standard_Real aX0 = -300, aY0 = -200;
|
||||
Standard_Real auxY0,auxX0 = aX0 - aXStep;
|
||||
|
||||
for( i = 0 ; i < aColLength ; i++)
|
||||
{
|
||||
auxX0 += aXStep;
|
||||
auxY0 = aY0 - aYStep;
|
||||
|
||||
for(Standard_Integer j = 0 ; j < aRowLength ; j++)
|
||||
{
|
||||
aZPoints(i+1,j+1) *=SCALE;
|
||||
auxY0 += aYStep;
|
||||
aPnt(i+1,j+1) = gp_Pnt (auxX0,auxY0,aZPoints(i+1,j+1));
|
||||
aShowPnt[i][j] = drawPoint(aPnt(i+1,j+1));
|
||||
}
|
||||
}
|
||||
|
||||
if(WAIT_A_LITTLE) return ;
|
||||
|
||||
TCollection_AsciiString aText;
|
||||
aText += Comment(aXStep,anUpper,DegMin[Count],DegMax[Count],Count+1,Tol[Count]);
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
Handle(Geom_BSplineSurface) aSurface = CreateBSplineSurface(aZPoints,aXStep,aYStep,Count);
|
||||
aObj = drawSurface(aSurface);
|
||||
Standard_Boolean aBool;
|
||||
if(WAIT_A_LITTLE) return ;
|
||||
|
||||
for( i = 0 ; i < aNumOfIndexPnt ; i++)
|
||||
{
|
||||
aMovePnt = aShowPnt[aIndexX[i]-1][aIndexY[i]-1];
|
||||
aBool = DrawModifyBSplineSurface(aZPoints,aXStep,aYStep,aIndexX[i],aIndexY[i],
|
||||
aDeflection[i],aMovePnt,aObj,Count);
|
||||
if(!aBool) return;
|
||||
|
||||
if( i < aNumOfIndexPnt - 1)
|
||||
{
|
||||
drawPoint(aPnt(aIndexX[i],aIndexY[i]));
|
||||
getAISContext()->Erase(aMovePnt);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
50
samples/mfc/occtdemo/Approx/Approx_Presentation.h
Executable file
@@ -0,0 +1,50 @@
|
||||
// Approx_Presentation.h: interface for the Approx_Presentation class.
|
||||
// Presentation class: Approximation of curves and surfaces.
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if !defined(AFX_Approx_PRESENTATION_H__790EED7F_7BA2_11D5_BA4A_0060B0EE18EA__INCLUDED_)
|
||||
#define AFX_Approx_PRESENTATION_H__790EED7F_7BA2_11D5_BA4A_0060B0EE18EA__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
#include <OCCDemo_Presentation.h>
|
||||
#include <Geom_BSplineSurface.hxx>
|
||||
|
||||
class Approx_Presentation : public OCCDemo_Presentation
|
||||
{
|
||||
public:
|
||||
// Construction
|
||||
Approx_Presentation();
|
||||
|
||||
public:
|
||||
// Iteration on samples
|
||||
virtual void DoSample();
|
||||
// one phase of iterations
|
||||
|
||||
private:
|
||||
// Sample functions
|
||||
void sample1();
|
||||
void sample2();
|
||||
void sample3();
|
||||
void sample4();
|
||||
Standard_Boolean DrawModifyBSplineSurface(TColStd_Array2OfReal& ,
|
||||
Standard_Real ,Standard_Real ,
|
||||
Standard_Integer ,Standard_Integer ,
|
||||
Standard_Real,Handle(AIS_InteractiveObject)&,
|
||||
Handle(AIS_InteractiveObject)&,
|
||||
Standard_Integer);
|
||||
|
||||
Handle(Geom_BSplineSurface) CreateBSplineSurface(TColStd_Array2OfReal& ,
|
||||
Standard_Real ,Standard_Real,
|
||||
Standard_Integer);
|
||||
|
||||
private:
|
||||
// Array of pointers to sample functions
|
||||
typedef void (Approx_Presentation::*PSampleFuncType)();
|
||||
static const PSampleFuncType SampleFuncs[];
|
||||
|
||||
};
|
||||
|
||||
#endif // !defined(AFX_Approx_PRESENTATION_H__790EED7F_7BA2_11D5_BA4A_0060B0EE18EA__INCLUDED_)
|
428
samples/mfc/occtdemo/Chamfers/Chamfers.vcproj
Executable file
@@ -0,0 +1,428 @@
|
||||
<?xml version="1.0" encoding="windows-1251"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="Chamfers"
|
||||
SccProjectName=""
|
||||
SccLocalPath=""
|
||||
Keyword="MFCProj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\../Release"
|
||||
IntermediateDirectory=".\../Release/obj"
|
||||
ConfigurationType="1"
|
||||
UseOfMFC="2"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="../,../Common,../Common/WNT,../Common/ISession"
|
||||
PreprocessorDefinitions="NDEBUG;WIN32;_WINDOWS;WNT"
|
||||
StringPooling="TRUE"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="StdAfx.h"
|
||||
PrecompiledHeaderFile=".\../Release/obj/Chamfers.pch"
|
||||
AssemblerListingLocation=".\../Release/obj/"
|
||||
ObjectFile=".\../Release/obj/"
|
||||
ProgramDataBaseFileName=".\../Release/obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="TKBool.lib TKCAF.lib TKCDF.lib TKDraw.lib TKernel.lib TKFeat.lib TKFillet.lib TKGeomAlgo.lib TKHLR.lib TKMath.lib TKOffset.lib TKPCAF.lib TKPrim.lib TKPShape.lib TKService.lib TKTopAlgo.lib TKV2d.lib TKV3d.lib TKBRep.lib TKG2d.lib TKG3d.lib TKGeomBase.lib TKBO.lib"
|
||||
OutputFile=".\../Release/Chamfers.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
ProgramDatabaseFile=".\../Release/Chamfers.pdb"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\../Release/Chamfers.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\../Debug"
|
||||
IntermediateDirectory=".\../Debug/objd"
|
||||
ConfigurationType="1"
|
||||
UseOfMFC="2"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../,../Common,../Common/WNT,../Common/ISession"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;WNT"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderThrough="StdAfx.h"
|
||||
PrecompiledHeaderFile=".\../Debug/objd/Chamfers.pch"
|
||||
AssemblerListingLocation=".\../Debug/objd/"
|
||||
ObjectFile=".\../Debug/objd/"
|
||||
ProgramDataBaseFileName=".\../Debug/objd/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="TKBO.lib TKBool.lib TKCAF.lib TKCDF.lib TKDraw.lib TKernel.lib TKFeat.lib TKFillet.lib TKGeomAlgo.lib TKHLR.lib TKMath.lib TKOffset.lib TKPCAF.lib TKPrim.lib TKPShape.lib TKService.lib TKTopAlgo.lib TKV2d.lib TKV3d.lib TKBRep.lib TKG2d.lib TKG3d.lib TKGeomBase.lib"
|
||||
OutputFile=".\../Debug/Chamfers.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="TRUE"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile=".\../Debug/Chamfers.pdb"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
MkTypLibCompatible="TRUE"
|
||||
SuppressStartupBanner="TRUE"
|
||||
TargetEnvironment="1"
|
||||
TypeLibraryName=".\../Debug/Chamfers.tlb"
|
||||
HeaderFileName=""/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="Chamfers_Presentation.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="Chamfers_Presentation.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Common"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\env.bat">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\readme.txt">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\run.bat">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\vc.bat">
|
||||
</File>
|
||||
<Filter
|
||||
Name="Source Files No. 1"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\Common\ISession\ISession_Curve.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\MainFrm.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemo.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemo.rc">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions=""
|
||||
AdditionalIncludeDirectories="\RLS\tmp\demo\Common\WNT"/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions=""
|
||||
AdditionalIncludeDirectories="\RLS\tmp\demo\Common\WNT"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\OCCDemo_Presentation.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoDoc.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoView.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\ResultDialog.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\StdAfx.cpp">
|
||||
<FileConfiguration
|
||||
Name="Release|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions=""
|
||||
BasicRuntimeChecks="3"/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files No. 1"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\Common\ISession\ISession_Curve.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\MainFrm.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemo.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\OCCDemo_Presentation.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoDoc.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\OCCDemoView.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\resource.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\ResultDialog.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\StdAfx.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="">
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\OCCDemo.ico">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\OCCDemo.rc2">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\toolbar.bmp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\Common\WNT\res\toolbar1.bmp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
781
samples/mfc/occtdemo/Chamfers/Chamfers_Presentation.cpp
Executable file
@@ -0,0 +1,781 @@
|
||||
// Chamfers_Presentation.cpp: implementation of the Chamfers_Presentation class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "Chamfers_Presentation.h"
|
||||
|
||||
#ifdef WNT
|
||||
#pragma warning (disable : 4786)
|
||||
#endif
|
||||
|
||||
#include <TopoDS_Edge.hxx>
|
||||
#include <BRepPrimAPI_MakeBox.hxx>
|
||||
#include <BRepPrimAPI_MakeCylinder.hxx>
|
||||
#include <BRepAlgo_Fuse.hxx>
|
||||
#include <BRepAlgoAPI_Fuse.hxx>
|
||||
#include <BRepFilletAPI_MakeChamfer.hxx>
|
||||
#include <BRepFilletAPI_MakeFillet.hxx>
|
||||
#include <TopExp.hxx>
|
||||
#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
|
||||
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
||||
#include <TopTools_IndexedMapOfShape.hxx>
|
||||
#include <TopoDS_Solid.hxx>
|
||||
#include <TopoDS.hxx>
|
||||
#include <TopOpeBRepBuild_HBuilder.hxx>
|
||||
#include <Precision.hxx>
|
||||
|
||||
#ifdef WNT
|
||||
#define EOL "\r\n"
|
||||
#else
|
||||
#define EOL "\n"
|
||||
#endif
|
||||
|
||||
#define BOX_SIDE_LEN 500
|
||||
|
||||
// Initialization of global variable with an instance of this class
|
||||
OCCDemo_Presentation* OCCDemo_Presentation::Current = new Chamfers_Presentation;
|
||||
|
||||
// Initialization of array of samples
|
||||
const Chamfers_Presentation::PSampleFuncType Chamfers_Presentation::SampleFuncs[] =
|
||||
{
|
||||
&Chamfers_Presentation::sampleBoxChamfer,
|
||||
&Chamfers_Presentation::sampleBoxCylChamfer,
|
||||
&Chamfers_Presentation::sampleBoxCylAngChamfer,
|
||||
&Chamfers_Presentation::sampleBoxFillet,
|
||||
&Chamfers_Presentation::sampleBoxCylFillet,
|
||||
&Chamfers_Presentation::sampleBoxCylAngFillet
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
Chamfers_Presentation::Chamfers_Presentation()
|
||||
{
|
||||
myIndex = 0;
|
||||
myNbSamples = sizeof(SampleFuncs)/sizeof(PSampleFuncType);
|
||||
setName ("Chamfers and Fillets");
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Sample execution
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
void Chamfers_Presentation::DoSample()
|
||||
{
|
||||
getAISContext()->EraseAll();
|
||||
if (myIndex >=0 && myIndex < myNbSamples)
|
||||
(this->*SampleFuncs[myIndex])();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Sample functions
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
//================================================================
|
||||
// Function : createDiverseChamferOnBox
|
||||
// Purpose : makes chamfers of different size on 3 converging edges
|
||||
// of the given box using given distances d1, d2, d3;
|
||||
// outputs its own source code into result dialog
|
||||
//================================================================
|
||||
Standard_Boolean Chamfers_Presentation::createDiverseChamferOnBox(
|
||||
TopoDS_Solid& aBox,
|
||||
Standard_Real d1, // chamfer on edge 1
|
||||
Standard_Real d2, // chamfer on edge 2
|
||||
Standard_Real d3, // chamfer on edge 3
|
||||
Handle(AIS_InteractiveObject)& thePrevShape)// for smoth drawing
|
||||
// we display the new shape first, then erase the previous one
|
||||
{
|
||||
// initializing a class that builds chamfer
|
||||
BRepFilletAPI_MakeChamfer aMakeChamfer(aBox);
|
||||
|
||||
// a map of "edge-to-list of faces". Key = edge, value = list of 2 faces
|
||||
// of the box that "touch" the edge
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;
|
||||
// filling the map with edges and faces of the box
|
||||
TopExp::MapShapesAndAncestors(aBox, TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);
|
||||
|
||||
// array of indexes of edges to be chamfered
|
||||
int aEdgeInd[] = {6, 2, 10, 12, 5};
|
||||
|
||||
// creating chamfer on one of an edge of the top face, using d1
|
||||
if (d1 > Precision::Confusion())
|
||||
{
|
||||
TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[0]));
|
||||
TopoDS_Face aFace = TopoDS::Face(aMapOfEdgeToFaces.FindFromKey(anEdge).First());
|
||||
aMakeChamfer.Add(d1, d1, anEdge, aFace);
|
||||
}
|
||||
|
||||
// creating chamfer on the other 3 edges of the top face, using d2
|
||||
if (d2 > Precision::Confusion())
|
||||
{
|
||||
for (Standard_Integer i = 1; i <= 3; i++)
|
||||
{
|
||||
TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[i]));
|
||||
TopoDS_Face aFace = TopoDS::Face(aMapOfEdgeToFaces.FindFromKey(anEdge).First());
|
||||
aMakeChamfer.Add(d2, d2, anEdge, aFace);
|
||||
}
|
||||
}
|
||||
|
||||
// creating chamfer on a vertical edge of box, using d3
|
||||
if (d3 > Precision::Confusion())
|
||||
{
|
||||
TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[4]));
|
||||
TopoDS_Face aFace = TopoDS::Face(aMapOfEdgeToFaces.FindFromKey(anEdge).First());
|
||||
aMakeChamfer.Add(d3, d3, anEdge, aFace);
|
||||
}
|
||||
|
||||
aMakeChamfer.Build();
|
||||
if (aMakeChamfer.IsDone())
|
||||
{
|
||||
Handle(AIS_InteractiveObject) aNewShape = new AIS_Shape(aMakeChamfer.Shape());
|
||||
getAISContext()->Erase(thePrevShape, Standard_False);
|
||||
thePrevShape = aNewShape;
|
||||
getAISContext()->Display(aNewShape);
|
||||
}
|
||||
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a box and centering it on the screen" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" TopoDS_Solid aBox = BRepPrimAPI_MakeBox(gp_Pnt(-a/2, -a/2, -a/2), a, a, a);" EOL EOL
|
||||
|
||||
" // initializing a class that builds chamfer" EOL
|
||||
" BRepFilletAPI_MakeChamfer aMakeChamfer(aBox);" EOL EOL
|
||||
|
||||
" // a map of \"edge-to-list of faces\". Key = edge, value = list of 2 faces " EOL
|
||||
" // of the box that \"touch\" the edge" EOL
|
||||
" TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;" EOL
|
||||
" // filling the map with edges and faces of the box" EOL
|
||||
" TopExp::MapShapesAndAncestors(aBox, TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);" EOL
|
||||
"" EOL
|
||||
" Standard_Real d1 = "+TCollection_AsciiString(d1)+";" EOL
|
||||
" Standard_Real d2 = "+TCollection_AsciiString(d2)+";" EOL
|
||||
" Standard_Real d3 = "+TCollection_AsciiString(d3)+";" EOL
|
||||
"" EOL
|
||||
" // array of indexes of edges to be chamfered" EOL
|
||||
" int aEdgeInd[] = {6, 2, 10, 12, 5};" EOL
|
||||
"" EOL
|
||||
" // creating chamfer on one of an edge of the top face, using d1" EOL
|
||||
" if (d1 > Precision::Confusion())" EOL
|
||||
" {" EOL
|
||||
" TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[0]));" EOL
|
||||
" TopoDS_Face aFace = TopoDS::Face(aMapOfEdgeToFaces.FindFromKey(anEdge).First());" EOL
|
||||
" aMakeChamfer.Add(d1, d1, anEdge, aFace);" EOL
|
||||
" }" EOL
|
||||
"" EOL
|
||||
" // creating chamfer on the other 3 edges of the top face, using d2" EOL
|
||||
" if (d2 > Precision::Confusion())" EOL
|
||||
" {" EOL
|
||||
" for (Standard_Integer i = 1; i <= 3; i++)" EOL
|
||||
" {" EOL
|
||||
" TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[i]));" EOL
|
||||
" TopoDS_Face aFace = TopoDS::Face(aMapOfEdgeToFaces.FindFromKey(anEdge).First());" EOL
|
||||
" aMakeChamfer.Add(d2, d2, anEdge, aFace);" EOL
|
||||
" }" EOL
|
||||
" }" EOL
|
||||
"" EOL
|
||||
" // creating chamfer on a vertical edge of box, using d3" EOL
|
||||
" if (d3 > Precision::Confusion())" EOL
|
||||
" {" EOL
|
||||
" TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[4]));" EOL
|
||||
" TopoDS_Face aFace = TopoDS::Face(aMapOfEdgeToFaces.FindFromKey(anEdge).First());" EOL
|
||||
" aMakeChamfer.Add(d3, d3, anEdge, aFace);" EOL
|
||||
" }" EOL
|
||||
" " EOL
|
||||
" aMakeChamfer.Build();" EOL
|
||||
" if (aMakeChamfer.IsDone())" EOL
|
||||
" TopoDS_Shape aChamferedShape = aMakeChamfer.Shape();" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
return WAIT_A_SECOND;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : createChamferOnBox
|
||||
// Purpose : makes chamfers on edges of the top face of the given box
|
||||
// using given distances theDistA and theDistB, outputs its own
|
||||
// source code into result dialog
|
||||
//================================================================
|
||||
Standard_Boolean Chamfers_Presentation::createChamferOnBox(
|
||||
TopoDS_Solid& aBox,
|
||||
Standard_Real theDistA, // distance along first face
|
||||
Standard_Real theDistB, // distance along second face
|
||||
Handle(AIS_InteractiveObject)& thePrevShape)// for smoth drawing
|
||||
// we display the new shape first, then erase the previous one
|
||||
{
|
||||
// initializing a class that builds chamfer
|
||||
BRepFilletAPI_MakeChamfer aMakeChamfer(aBox);
|
||||
|
||||
// a map of "edge-to-list of faces". Key = edge, value = list of 2 faces
|
||||
// of the box that "touch" the edge
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;
|
||||
// filling the map with edges and faces of the box
|
||||
TopExp::MapShapesAndAncestors(aBox, TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);
|
||||
|
||||
// array of indexes of edges to be chamfered
|
||||
int aEdgeInd[] = {2, 6, 10, 12};
|
||||
|
||||
// building chamfers
|
||||
for (int i = 0; i <= sizeof(aEdgeInd)/sizeof(int)-1; i++)
|
||||
//for (int i = 1; i <= 12; i++) // uncomment to iterate through ALL edges of the box
|
||||
{
|
||||
TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[i]));
|
||||
//TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(i));
|
||||
// uncomment to iterate through ALL edges of the box
|
||||
const TopTools_ListOfShape& aFaces = aMapOfEdgeToFaces.FindFromKey(anEdge);
|
||||
TopoDS_Face aFace = TopoDS::Face(aFaces.First());
|
||||
aMakeChamfer.Add(theDistA, theDistB, anEdge, aFace);
|
||||
}
|
||||
|
||||
aMakeChamfer.Build();
|
||||
if (aMakeChamfer.IsDone())
|
||||
{
|
||||
Handle(AIS_InteractiveObject) aNewShape = new AIS_Shape(aMakeChamfer.Shape());
|
||||
getAISContext()->Erase(thePrevShape, Standard_False);
|
||||
getAISContext()->Display(aNewShape, Standard_True);
|
||||
thePrevShape = aNewShape;
|
||||
}
|
||||
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a box and centering it on the screen" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" TopoDS_Solid aBox = BRepPrimAPI_MakeBox(gp_Pnt(-a/2, -a/2, -a/2), a, a, a);" EOL EOL
|
||||
|
||||
" // initializing a class that builds chamfer" EOL
|
||||
" BRepFilletAPI_MakeChamfer aMakeChamfer(aBox);" EOL EOL
|
||||
|
||||
" // a map of \"edge-to-list of faces\". Key = edge, value = list of 2 faces " EOL
|
||||
" // of the box that \"touch\" the edge" EOL
|
||||
" TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;" EOL
|
||||
" // filling the map with edges and faces of the box" EOL
|
||||
" TopExp::MapShapesAndAncestors(aBox, TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);" EOL
|
||||
"" EOL
|
||||
" Standard_Real aDistA = "+TCollection_AsciiString(theDistA)+";" EOL
|
||||
" Standard_Real aDistB = "+TCollection_AsciiString(theDistB)+";" EOL
|
||||
"" EOL
|
||||
" // array of indexes of edges to be chamfered" EOL
|
||||
" int aEdgeInd[] = {2, 6, 10, 12};" EOL EOL
|
||||
|
||||
" // building chamfers" EOL
|
||||
" for (int i = 0; i <= sizeof(aEdgeInd)/sizeof(int)-1; i++)" EOL
|
||||
" {" EOL
|
||||
" TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdgeToFaces.FindKey(aEdgeInd[i]));" EOL
|
||||
" const TopTools_ListOfShape& aFaces = aMapOfEdgeToFaces.FindFromKey(anEdge);" EOL
|
||||
" TopoDS_Face aFace = TopoDS::Face(aFaces.First());" EOL
|
||||
" // creating a chamfer with lengths aDistA, aDistB" EOL
|
||||
" aMakeChamfer.Add(aDistA, aDistB, anEdge, aFace);" EOL
|
||||
" }" EOL EOL
|
||||
|
||||
" aMakeChamfer.Build();" EOL
|
||||
" if (aMakeChamfer.IsDone())" EOL
|
||||
" TopoDS_Shape aChamferedShape = aMakeChamfer.Shape();" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
return WAIT_A_SECOND;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : createFilletOnBox
|
||||
// Purpose : creates a box with side=10, makes fillets on some of its edges
|
||||
// using given value of radius and shape of fillet, outputs its own
|
||||
// source code into theText parameter
|
||||
//================================================================
|
||||
Standard_Boolean Chamfers_Presentation::createFilletOnBox(
|
||||
TopoDS_Solid& aBox,
|
||||
Standard_Real theRad, // radius of fillet
|
||||
ChFi3d_FilletShape theFShape, // shape of fillet
|
||||
Handle(AIS_InteractiveObject)& thePrevObj) // to erase
|
||||
// the previous shape
|
||||
{
|
||||
// initializing a class that builds fillet
|
||||
// second parameter is a shape of fillet:
|
||||
// enum ChFi3d_FilletShape { ChFi3d_Rational, ChFi3d_QuasiAngular, ChFi3d_Polynomial };
|
||||
BRepFilletAPI_MakeFillet aMakeFillet(aBox, theFShape);
|
||||
|
||||
// a map of edges
|
||||
TopTools_IndexedMapOfShape aMapOfEdges;
|
||||
// filling the map with edges of the box
|
||||
TopExp::MapShapes(aBox, TopAbs_EDGE, aMapOfEdges);
|
||||
|
||||
// array of indexes of edges to be chamfered
|
||||
int aEdgeInd[] = {2, 6, 10, 12};
|
||||
|
||||
// adding edges that will have fillet
|
||||
for (int i = 0; i <= sizeof(aEdgeInd)/sizeof(int)-1; i++)
|
||||
{
|
||||
TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdges(aEdgeInd[i]));
|
||||
aMakeFillet.Add(theRad, anEdge);
|
||||
}
|
||||
|
||||
aMakeFillet.Build();
|
||||
if (aMakeFillet.IsDone())
|
||||
{
|
||||
Handle(AIS_InteractiveObject) aNewShape = new AIS_Shape(aMakeFillet.Shape());
|
||||
getAISContext()->Erase(thePrevObj, Standard_False);
|
||||
getAISContext()->Display(aNewShape, Standard_True);
|
||||
thePrevObj = aNewShape;
|
||||
}
|
||||
|
||||
// calculating the string corresponding to theFShape
|
||||
TCollection_AsciiString aFShapeStr;
|
||||
aFShapeStr = ((theFShape==ChFi3d_Rational)? "ChFi3d_Rational":
|
||||
((theFShape==ChFi3d_QuasiAngular)? "ChFi3d_QuasiAngular":
|
||||
"ChFi3d_Polynomial"));
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a box and centering it on the screen" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" TopoDS_Solid aBox = BRepPrimAPI_MakeBox(gp_Pnt(-a/2, -a/2, -a/2), a, a, a);" EOL
|
||||
" " EOL
|
||||
" // initializing a class that builds fillet" EOL
|
||||
" // second parameter is a shape of fillet:" EOL
|
||||
" // enum ChFi3d_FilletShape { ChFi3d_Rational, ChFi3d_QuasiAngular, ChFi3d_Polynomial };" EOL
|
||||
" BRepFilletAPI_MakeFillet aMakeFillet(aBox, "+aFShapeStr+");" EOL
|
||||
" " EOL
|
||||
" // a map of edges" EOL
|
||||
" TopTools_IndexedMapOfShape aMapOfEdges;" EOL
|
||||
" // filling the map with edges of the box" EOL
|
||||
" TopExp::MapShapes(aBox, TopAbs_EDGE, aMapOfEdges);" EOL EOL
|
||||
|
||||
" // array of indexes of edges to be chamfered" EOL
|
||||
" int aEdgeInd[] = {2, 6, 10, 12};" EOL EOL
|
||||
|
||||
" // adding edges that will have fillet" EOL
|
||||
" Standard_Real r = "+TCollection_AsciiString(theRad)+";" EOL
|
||||
" for (int i = 0; i <= sizeof(aEdgeInd)/sizeof(int)-1; i++)" EOL
|
||||
" {" EOL
|
||||
" TopoDS_Edge anEdge = TopoDS::Edge(aMapOfEdges(aEdgeInd[i]));" EOL
|
||||
" aMakeFillet.Add(r, anEdge);" EOL
|
||||
" }" EOL
|
||||
|
||||
" aMakeFillet.Build();" EOL
|
||||
" if (aMakeFillet.IsDone())" EOL
|
||||
" TopoDS_Shape aShapeWithFillet = aMakeFillet.Shape();" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
return WAIT_A_SECOND;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ===============================================================
|
||||
// CHAMFER CASES
|
||||
// ===============================================================
|
||||
//================================================================
|
||||
// Function : Chamfers_Presentation::sampleBoxChamfer1,2,3
|
||||
// Purpose :
|
||||
//================================================================
|
||||
void Chamfers_Presentation::sampleBoxChamfer()
|
||||
{
|
||||
setResultTitle("Creating Chamfer");
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a box and centering it on the screen" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" TopoDS_Solid aBox = BRepPrimAPI_MakeBox(gp_Pnt(-a/2, -a/2, -a/2), a, a, a);" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
// show initial shape
|
||||
Standard_Real a = BOX_SIDE_LEN;
|
||||
TopoDS_Solid aBox = BRepPrimAPI_MakeBox(gp_Pnt(-a/2, -a/2, -a/2), a, a, a);
|
||||
Handle(AIS_InteractiveObject) aPrevShape = new AIS_Shape(aBox);
|
||||
getAISContext()->Display(aPrevShape, Standard_False);
|
||||
COCCDemoDoc::Fit();
|
||||
|
||||
if (WAIT_A_SECOND) return;
|
||||
|
||||
// show several chamfers
|
||||
if (createChamferOnBox(aBox, a/10, a/10, aPrevShape)) return;
|
||||
if (createChamferOnBox(aBox, a/24, a/10, aPrevShape)) return;
|
||||
if (createChamferOnBox(aBox, a/10, a/10, aPrevShape)) return;
|
||||
if (createChamferOnBox(aBox, a/10, a/24, aPrevShape)) return;
|
||||
if (createChamferOnBox(aBox, a/10, a/10, aPrevShape)) return;
|
||||
if (createDiverseChamferOnBox(aBox, a/6, a/10, 0, aPrevShape)) return;
|
||||
if (createDiverseChamferOnBox(aBox, a/6, a/10, a/24, aPrevShape)) return;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : Chamfers_Presentation::sampleBoxCylChamfer
|
||||
// Purpose : creates a more complecated chamfer on a shape created
|
||||
// by fusing box and cylinder
|
||||
//================================================================
|
||||
void Chamfers_Presentation::sampleBoxCylChamfer()
|
||||
{
|
||||
setResultTitle("Creating Chamfer");
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a shape, a result of fusing of a box and cylinder" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" Standard_Real b = a/2;" EOL
|
||||
" BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);" EOL
|
||||
" BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,0,1)), a/4, a);" EOL
|
||||
" BRepAlgoAPI_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());" EOL
|
||||
" aFuser.Build();" EOL EOL
|
||||
|
||||
" // initializing a class that builds chamfer" EOL
|
||||
" BRepFilletAPI_MakeChamfer aMakeChamfer(aFuser.Shape());" EOL EOL
|
||||
|
||||
" // a map of \"edge-to-list of faces\". Key = edge, value = list of 2 faces " EOL
|
||||
" // of the box that \"touch\" the edge" EOL
|
||||
" TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;" EOL
|
||||
" // filling the map with edges and faces of the box" EOL
|
||||
" TopExp::MapShapesAndAncestors(aFuser.Shape(), TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);" EOL EOL
|
||||
|
||||
" // retrieving list of edges to build a chamfer on - edges of " EOL
|
||||
" // intersection of the cylinder and the box" EOL
|
||||
" const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();" EOL
|
||||
" TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);" EOL
|
||||
"" EOL
|
||||
" // creating fillet on edge intersection edges" EOL
|
||||
" Standard_Real d = a/20;" EOL
|
||||
" for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())" EOL
|
||||
" {" EOL
|
||||
" TopoDS_Edge anEdge = TopoDS::Edge(anIntersectionEdgesIt.Value());" EOL
|
||||
" if (!aMapOfEdgeToFaces.Contains(anEdge)) continue;" EOL
|
||||
" const TopTools_ListOfShape& aFaces = aMapOfEdgeToFaces.FindFromKey(anEdge);" EOL
|
||||
" TopoDS_Face aFace = TopoDS::Face(aFaces.First());" EOL
|
||||
" aMakeChamfer.Add(d, d, anEdge, aFace);" EOL
|
||||
" }" EOL
|
||||
" " EOL
|
||||
" aMakeChamfer.Build();" EOL
|
||||
" if (aMakeChamfer.IsDone())" EOL
|
||||
" TopoDS_Shape aChamferedShape = aMakeChamfer.Shape();" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
// creating a shape, a result of fusing of a box and cylinder
|
||||
Standard_Real a = BOX_SIDE_LEN;
|
||||
Standard_Real b = a/2;
|
||||
BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);
|
||||
BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,0,1)), a/4, a);
|
||||
BRepAlgo_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());
|
||||
aFuser.Build();
|
||||
|
||||
Handle(AIS_InteractiveObject) aPrevObj = new AIS_Shape(aFuser.Shape());
|
||||
getAISContext()->Display(aPrevObj, Standard_False);
|
||||
COCCDemoDoc::Fit();
|
||||
|
||||
if (WAIT_A_SECOND) return;
|
||||
|
||||
// initializing a class that builds chamfer
|
||||
BRepFilletAPI_MakeChamfer aMakeChamfer(aFuser.Shape());
|
||||
|
||||
// a map of "edge-to-list of faces". Key = edge, value = list of 2 faces
|
||||
// of the box that "touch" the edge
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;
|
||||
// filling the map with edges and faces of the box
|
||||
TopExp::MapShapesAndAncestors(aFuser.Shape(), TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);
|
||||
|
||||
// retrieving list of edges to build a chamfer on - edges of
|
||||
// intersection of the cylinder and the box
|
||||
const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();
|
||||
TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);
|
||||
|
||||
// creating fillet on edge intersection edges
|
||||
Standard_Real d = a/20;
|
||||
for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())
|
||||
{
|
||||
TopoDS_Edge anEdge = TopoDS::Edge(anIntersectionEdgesIt.Value());
|
||||
if (!aMapOfEdgeToFaces.Contains(anEdge)) continue;
|
||||
const TopTools_ListOfShape& aFaces = aMapOfEdgeToFaces.FindFromKey(anEdge);
|
||||
TopoDS_Face aFace = TopoDS::Face(aFaces.First());
|
||||
aMakeChamfer.Add(d, d, anEdge, aFace);
|
||||
}
|
||||
|
||||
aMakeChamfer.Build();
|
||||
|
||||
if (aMakeChamfer.IsDone())
|
||||
{
|
||||
getAISContext()->Erase(aPrevObj, Standard_False);
|
||||
getAISContext()->Display(new AIS_Shape(aMakeChamfer.Shape()));
|
||||
//aPrevObj = aNewShape;// uncomment if further thePrevObj is used
|
||||
}
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : Chamfers_Presentation::sampleBoxCylAngChamfer
|
||||
// Purpose : creates a more complecated chamfer on a shape created
|
||||
// by fusing box and cylinder
|
||||
//================================================================
|
||||
void Chamfers_Presentation::sampleBoxCylAngChamfer()
|
||||
{
|
||||
setResultTitle("Creating Chamfer");
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a shape, a result of fusing of a box and cylinder" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" Standard_Real b = a/2;" EOL
|
||||
" BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);" EOL
|
||||
" BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,-0.4,0.6)), a/4, a);" EOL
|
||||
" BRepAlgoAPI_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());" EOL
|
||||
" aFuser.Build();" EOL EOL
|
||||
|
||||
" // initializing a class that builds chamfer" EOL
|
||||
" BRepFilletAPI_MakeChamfer aMakeChamfer(aFuser.Shape());" EOL EOL
|
||||
|
||||
" // a map of \"edge-to-list of faces\". Key = edge, value = list of 2 faces " EOL
|
||||
" // of the box that \"touch\" the edge" EOL
|
||||
" TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;" EOL
|
||||
" // filling the map with edges and faces of the box" EOL
|
||||
" TopExp::MapShapesAndAncestors(aFuser.Shape(), TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);" EOL EOL
|
||||
|
||||
" // retrieving list of edges to build a chamfer on - edges of " EOL
|
||||
" // intersection of the cylinder and the box" EOL
|
||||
" const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();" EOL
|
||||
" TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);" EOL EOL
|
||||
|
||||
" // creating chamfer on intersection edges" EOL
|
||||
" Standard_Real d = a/20;" EOL
|
||||
" for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())" EOL
|
||||
" {" EOL
|
||||
" TopoDS_Edge anEdge = TopoDS::Edge(anIntersectionEdgesIt.Value());" EOL
|
||||
" if (!aMapOfEdgeToFaces.Contains(anEdge)) continue;" EOL
|
||||
" const TopTools_ListOfShape& aFaces = aMapOfEdgeToFaces.FindFromKey(anEdge);" EOL
|
||||
" TopoDS_Face aFace = TopoDS::Face(aFaces.First());" EOL
|
||||
" aMakeChamfer.Add(d, d, anEdge, aFace);" EOL
|
||||
" }" EOL EOL
|
||||
|
||||
" aMakeChamfer.Build();" EOL
|
||||
" if (aMakeChamfer.IsDone())" EOL
|
||||
" TopoDS_Shape aChamferedShape = aMakeChamfer.Shape();" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
// creating a shape, a result of fusing of a box and cylinder
|
||||
Standard_Real a = BOX_SIDE_LEN;
|
||||
Standard_Real b = a/2;
|
||||
BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);
|
||||
BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,-0.4,0.6)), a/4, a);
|
||||
BRepAlgo_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());
|
||||
aFuser.Build();
|
||||
|
||||
Handle(AIS_InteractiveObject) aPrevObj = new AIS_Shape(aFuser.Shape());
|
||||
getAISContext()->Display(aPrevObj, Standard_False);
|
||||
COCCDemoDoc::Fit();
|
||||
|
||||
if (WAIT_A_SECOND) return;
|
||||
|
||||
// initializing a class that builds chamfer
|
||||
BRepFilletAPI_MakeChamfer aMakeChamfer(aFuser.Shape());
|
||||
|
||||
// a map of "edge-to-list of faces". Key = edge, value = list of 2 faces
|
||||
// of the box that "touch" the edge
|
||||
TopTools_IndexedDataMapOfShapeListOfShape aMapOfEdgeToFaces;
|
||||
// filling the map with edges and faces of the box
|
||||
TopExp::MapShapesAndAncestors(aFuser.Shape(), TopAbs_EDGE, TopAbs_FACE, aMapOfEdgeToFaces);
|
||||
|
||||
// retrieving list of edges to build a chamfer on - edges of
|
||||
// intersection of the cylinder and the box
|
||||
const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();
|
||||
TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);
|
||||
|
||||
// creating fillet on edge intersection edges
|
||||
Standard_Real d = a/20;
|
||||
for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())
|
||||
{
|
||||
TopoDS_Edge anEdge = TopoDS::Edge(anIntersectionEdgesIt.Value());
|
||||
if (!aMapOfEdgeToFaces.Contains(anEdge)) continue;
|
||||
const TopTools_ListOfShape& aFaces = aMapOfEdgeToFaces.FindFromKey(anEdge);
|
||||
TopoDS_Face aFace = TopoDS::Face(aFaces.First());
|
||||
aMakeChamfer.Add(d, d, anEdge, aFace);
|
||||
}
|
||||
|
||||
aMakeChamfer.Build();
|
||||
|
||||
if (aMakeChamfer.IsDone())
|
||||
{
|
||||
getAISContext()->Erase(aPrevObj, Standard_False);
|
||||
getAISContext()->Display(new AIS_Shape(aMakeChamfer.Shape()));
|
||||
//thePrevShape = aNewShape;// uncomment if further thePrevObj is used
|
||||
}
|
||||
}
|
||||
|
||||
// ===============================================================
|
||||
// FILLET CASES
|
||||
// ===============================================================
|
||||
//================================================================
|
||||
// Function : Chamfers_Presentation::sampleBoxFillet1,2,3
|
||||
// Purpose :
|
||||
//================================================================
|
||||
void Chamfers_Presentation::sampleBoxFillet()
|
||||
{
|
||||
setResultTitle("Creating Fillet");
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a box and centering it on the screen" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" TopoDS_Solid aBox = BRepPrimAPI_MakeBox(gp_Pnt(-a/2, -a/2, -a/2), a, a, a);" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
// show initial shape
|
||||
Standard_Real a = BOX_SIDE_LEN;
|
||||
TopoDS_Solid aBox = BRepPrimAPI_MakeBox(gp_Pnt(-a/2, -a/2, -a/2), a, a, a);
|
||||
|
||||
Handle(AIS_InteractiveObject) aPrevObj = new AIS_Shape(aBox);
|
||||
getAISContext()->Display(aPrevObj, Standard_False);
|
||||
COCCDemoDoc::Fit();
|
||||
|
||||
if (WAIT_A_SECOND) return;
|
||||
|
||||
// show several fillets
|
||||
if (createFilletOnBox(aBox, a/10, ChFi3d_Polynomial, aPrevObj)) return;
|
||||
if (createFilletOnBox(aBox, a/5, ChFi3d_QuasiAngular, aPrevObj)) return;
|
||||
if (createFilletOnBox(aBox, a/3.3, ChFi3d_Rational, aPrevObj)) return;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
// Function : Chamfers_Presentation::sampleBoxCylFillet
|
||||
// Purpose : creates a more complecated chamfer on a shape created
|
||||
// by fusing box and cylinder
|
||||
//================================================================
|
||||
void Chamfers_Presentation::sampleBoxCylFillet()
|
||||
{
|
||||
setResultTitle("Creating Fillet");
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a shape - result of fusing a box and a cylinder" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" Standard_Real b = a/2;" EOL
|
||||
" BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);" EOL
|
||||
" BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,0,1)), a/4, a);" EOL
|
||||
" BRepAlgoAPI_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());" EOL
|
||||
" aFuser.Build();" EOL EOL
|
||||
|
||||
" // initializing a class that builds fillet" EOL
|
||||
" // second parameter is a shape of fillet:" EOL
|
||||
" // enum ChFi3d_FilletShape { ChFi3d_Rational, ChFi3d_QuasiAngular, ChFi3d_Polynomial };" EOL
|
||||
" BRepFilletAPI_MakeFillet aMakeFillet(aFuser.Shape(), ChFi3d_Rational);" EOL EOL
|
||||
|
||||
" // retrieving list of edges to build a chamfer on - edges of " EOL
|
||||
" // intersection of the cylinder and the box" EOL
|
||||
" const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();" EOL
|
||||
" TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);" EOL EOL
|
||||
|
||||
" // creating fillet on edge intersection edges" EOL
|
||||
" Standard_Real d = a/10;" EOL
|
||||
" for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())" EOL
|
||||
" aMakeFillet.Add(d, TopoDS::Edge(anIntersectionEdgesIt.Value()));" EOL
|
||||
"" EOL
|
||||
" aMakeFillet.Build();" EOL EOL
|
||||
|
||||
" if (aMakeFillet.IsDone())" EOL
|
||||
" TopoDS_Shape aShapeWithFillet = aMakeFillet.Shape();" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
// creating a shape, a result of fusing of a box and cylinder
|
||||
Standard_Real a = BOX_SIDE_LEN;
|
||||
Standard_Real b = a/2;
|
||||
BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);
|
||||
BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,0,1)), a/4, a);
|
||||
BRepAlgo_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());
|
||||
aFuser.Build();
|
||||
|
||||
Handle(AIS_InteractiveObject) aPrevObj = new AIS_Shape(aFuser.Shape());
|
||||
getAISContext()->Display(aPrevObj, Standard_False);
|
||||
COCCDemoDoc::Fit();
|
||||
|
||||
if (WAIT_A_SECOND) return;
|
||||
|
||||
// initializing a class that builds fillet
|
||||
// second parameter is a shape of fillet:
|
||||
// enum ChFi3d_FilletShape { ChFi3d_Rational, ChFi3d_QuasiAngular, ChFi3d_Polynomial };
|
||||
BRepFilletAPI_MakeFillet aMakeFillet(aFuser.Shape(), ChFi3d_Rational);
|
||||
|
||||
// retrieving list of edges to build a chamfer on - edges of
|
||||
// intersection of the cylinder and the box
|
||||
const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();
|
||||
TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);
|
||||
|
||||
// creating fillet on edge intersection edges
|
||||
Standard_Real d = a/10;
|
||||
for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())
|
||||
aMakeFillet.Add(d, TopoDS::Edge(anIntersectionEdgesIt.Value()));
|
||||
|
||||
aMakeFillet.Build();
|
||||
|
||||
if (aMakeFillet.IsDone())
|
||||
{
|
||||
getAISContext()->Erase(aPrevObj, Standard_False);
|
||||
//aPrevObj = new AIS_Shape(aMakeFillet.Shape());// uncomment if aPrevObj is used further
|
||||
getAISContext()->Display(new AIS_Shape(aMakeFillet.Shape()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//================================================================
|
||||
// Function : Chamfers_Presentation::sampleBoxCylAngFillet
|
||||
// Purpose : creates a fillet on a more complecated shape created
|
||||
// by fusing box and cylinder
|
||||
//================================================================
|
||||
void Chamfers_Presentation::sampleBoxCylAngFillet()
|
||||
{
|
||||
setResultTitle("Creating Fillet");
|
||||
TCollection_AsciiString aText;
|
||||
aText = aText +
|
||||
" // creating a shape - result of fusing a box and a cylinder" EOL
|
||||
" Standard_Real a = "+TCollection_AsciiString(BOX_SIDE_LEN)+";" EOL
|
||||
" Standard_Real b = a/2;" EOL
|
||||
" BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);" EOL
|
||||
" BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,-0.4,0.6)), a/4, a);" EOL
|
||||
" BRepAlgoAPI_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());" EOL
|
||||
" aFuser.Build();" EOL EOL
|
||||
|
||||
" // initializing a class that builds fillet" EOL
|
||||
" // second parameter is a shape of fillet:" EOL
|
||||
" // enum ChFi3d_FilletShape { ChFi3d_Rational, ChFi3d_QuasiAngular, ChFi3d_Polynomial };" EOL
|
||||
" BRepFilletAPI_MakeFillet aMakeFillet(aFuser.Shape(), ChFi3d_Rational);" EOL EOL
|
||||
|
||||
" // retrieving list of edges to build a chamfer on - edges of " EOL
|
||||
" // intersection of the cylinder and the box" EOL
|
||||
" const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();" EOL
|
||||
" TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);" EOL EOL
|
||||
|
||||
" // creating fillet on intersection edges" EOL
|
||||
" Standard_Real d = a/10;" EOL
|
||||
" for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())" EOL
|
||||
" aMakeFillet.Add(d, TopoDS::Edge(anIntersectionEdgesIt.Value()));" EOL
|
||||
" aMakeFillet.Build();" EOL EOL
|
||||
|
||||
" if (aMakeFillet.IsDone())" EOL
|
||||
" TopoDS_Shape aShapeWithFillet = aMakeFillet.Shape();" EOL;
|
||||
setResultText(aText.ToCString());
|
||||
|
||||
// creating a shape, a result of fusing of a box and cylinder
|
||||
Standard_Real a = BOX_SIDE_LEN;
|
||||
Standard_Real b = a/2;
|
||||
BRepPrimAPI_MakeBox aBoxMaker (gp_Pnt(-b, -b, -b), a, a, a);
|
||||
BRepPrimAPI_MakeCylinder aCylMaker(gp_Ax2(gp_Pnt(0,0,0), gp_Dir(0,-0.4,0.6)), a/4, a);
|
||||
BRepAlgo_Fuse aFuser(aBoxMaker.Solid(), aCylMaker.Solid());
|
||||
aFuser.Build();
|
||||
|
||||
Handle(AIS_InteractiveObject) aPrevObj = new AIS_Shape(aFuser.Shape());
|
||||
getAISContext()->Display(aPrevObj, Standard_False);
|
||||
COCCDemoDoc::Fit();
|
||||
|
||||
if (WAIT_A_SECOND) return;
|
||||
|
||||
// initializing a class that builds fillet
|
||||
// second parameter is a shape of fillet:
|
||||
// enum ChFi3d_FilletShape { ChFi3d_Rational, ChFi3d_QuasiAngular, ChFi3d_Polynomial };
|
||||
BRepFilletAPI_MakeFillet aMakeFillet(aFuser.Shape(), ChFi3d_Rational);
|
||||
|
||||
// retrieving list of edges to build a chamfer on - edges of
|
||||
// intersection of the cylinder and the box
|
||||
const TopTools_ListOfShape& aEdgesOfIntersection = aFuser.Builder()->Section();
|
||||
TopTools_ListIteratorOfListOfShape anIntersectionEdgesIt(aEdgesOfIntersection);
|
||||
|
||||
// creating fillet on edge intersection edges
|
||||
Standard_Real d = a/10;
|
||||
for (; anIntersectionEdgesIt.More(); anIntersectionEdgesIt.Next())
|
||||
aMakeFillet.Add(d, TopoDS::Edge(anIntersectionEdgesIt.Value()));
|
||||
|
||||
aMakeFillet.Build();
|
||||
|
||||
if (aMakeFillet.IsDone())
|
||||
{
|
||||
getAISContext()->Erase(aPrevObj, Standard_False);
|
||||
//aPrevObj = new AIS_Shape(aMakeFillet.Shape());// uncomment if aPrevObj is used further
|
||||
getAISContext()->Display(new AIS_Shape(aMakeFillet.Shape()));
|
||||
}
|
||||
}
|
57
samples/mfc/occtdemo/Chamfers/Chamfers_Presentation.h
Executable file
@@ -0,0 +1,57 @@
|
||||
// Chamfers_Presentation.h: interface for the Chamfers_Presentation class.
|
||||
// Presentation class: Example on chamfers and fillets
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if !defined(AFX_Chamfers_PRESENTATION_H)
|
||||
#define AFX_Chamfers_PRESENTATION_H
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
#include <OCCDemo_Presentation.h>
|
||||
#include <ChFi3d_FilletShape.hxx>
|
||||
|
||||
class AIS_InteractiveObject;
|
||||
class TopoDS_Solid;
|
||||
|
||||
class Chamfers_Presentation : public OCCDemo_Presentation
|
||||
{
|
||||
public:
|
||||
// Construction
|
||||
Chamfers_Presentation();
|
||||
|
||||
public:
|
||||
// Iteration on samples
|
||||
virtual void DoSample();
|
||||
// one phase of iterations
|
||||
|
||||
private:
|
||||
Standard_Boolean createChamferOnBox(
|
||||
TopoDS_Solid&, Standard_Real, Standard_Real,
|
||||
Handle(AIS_InteractiveObject)&);
|
||||
|
||||
Standard_Boolean createDiverseChamferOnBox(
|
||||
TopoDS_Solid&, Standard_Real, Standard_Real,
|
||||
Standard_Real, Handle(AIS_InteractiveObject)&);
|
||||
|
||||
Standard_Boolean createFilletOnBox(
|
||||
TopoDS_Solid&, Standard_Real, ChFi3d_FilletShape,
|
||||
Handle(AIS_InteractiveObject)&);
|
||||
|
||||
// Sample functions
|
||||
void sampleBoxChamfer();
|
||||
void sampleBoxFillet();
|
||||
void sampleBoxCylChamfer();
|
||||
void sampleBoxCylAngChamfer();
|
||||
void sampleBoxCylFillet();
|
||||
void sampleBoxCylAngFillet();
|
||||
|
||||
private:
|
||||
// Array of pointers to sample functions
|
||||
typedef void (Chamfers_Presentation::*PSampleFuncType)();
|
||||
static const PSampleFuncType SampleFuncs[];
|
||||
|
||||
};
|
||||
|
||||
#endif // !defined(AFX_Chamfers_PRESENTATION_H)
|