Compare commits

..

1 Commits

Author SHA1 Message Date
Robert Osfield
bd53f89f6a Release OpenSceneGraph-2.8.1 2009-05-19 16:45:39 +00:00
671 changed files with 25949 additions and 73112 deletions

View File

@@ -1,6 +1,6 @@
OpenSceneGraph Library 2.8.2 OpenSceneGraph Library 2.8.1
373 Contributors: 372 Contributors:
Firstname Surname Firstname Surname
----------------- -----------------
@@ -9,9 +9,9 @@ Don Burns
Marco Jez Marco Jez
Paul Martz Paul Martz
Mike Weiblen Mike Weiblen
Mathias Fr<46>hlich
Eric Wing Eric Wing
Stephan Huber Stephan Huber
Mathias Fr<46>hlich
Brede Johansen Brede Johansen
Geoff Michel Geoff Michel
Farshid Lashkari Farshid Lashkari
@@ -63,16 +63,16 @@ Alberto Luaces
Philip Lowman Philip Lowman
Chris Denham Chris Denham
Melchior Franz Melchior Franz
Lionel Lagarde
David Fries
Bryan Thrall
Terry Welsh
Serge Lages Serge Lages
Lionel Lagarde
Joran Jessurun Joran Jessurun
Frederic Marmond Frederic Marmond
David Fries
Bryan Thrall
Boris Bralo Boris Bralo
Yefei He Yefei He
Tim Moore Tim Moore
Terry Welsh
Stephane Lamoliatte Stephane Lamoliatte
Sondra Iverson Sondra Iverson
Rune Schmidt Jensen Rune Schmidt Jensen
@@ -176,7 +176,6 @@ Stephan Eilemann
Stanislav Blinov Stanislav Blinov
Sergey Leontyev Sergey Leontyev
Sebastian Messerschmidt Sebastian Messerschmidt
Rene Molenaar
Ralf Kern Ralf Kern
Pierre Haritchabalet Pierre Haritchabalet
Perry Miller Perry Miller
@@ -191,7 +190,6 @@ Max Bandazian
Mathew May Mathew May
Martin Spott Martin Spott
Martijn Kragtwijk Martijn Kragtwijk
Konstantin Sinitsyn
Kevin Moiule Kevin Moiule
Keith Steffen Keith Steffen
Katharina Plugge Katharina Plugge
@@ -210,7 +208,6 @@ Frederic Bouvier
Ferdi Smit Ferdi Smit
Ewe Woessner Ewe Woessner
Erik den Dekker Erik den Dekker
Emmanuel Roche
Edgar Ellis Edgar Ellis
Don Leich Don Leich
David Ergo David Ergo
@@ -237,6 +234,7 @@ Tomas Hnilica
Tino Schwarze Tino Schwarze
Thomas Weidner Thomas Weidner
Thom Carlo Thom Carlo
Tery Welsh
Steven Thomas Steven Thomas
Simon Hammett Simon Hammett
Sid Byce Sid Byce
@@ -252,6 +250,7 @@ Rob Bloemkool
Rick Pingry Rick Pingry
Rick Appleton Rick Appleton
Ricard Schmidt Ricard Schmidt
Rene Molenaar
Reinhard Sainitzer Reinhard Sainitzer
Rein Kadijk Rein Kadijk
Raymond de Vries Raymond de Vries
@@ -263,7 +262,6 @@ Philipp M
Petr Salinger Petr Salinger
Paul Palumbo Paul Palumbo
Paul Fredrikson Paul Fredrikson
Paul Fotheringham
Patrick Hartling Patrick Hartling
Parag Chaudhur Parag Chaudhur
Panagiotis Papadakos Panagiotis Papadakos
@@ -300,6 +298,7 @@ Lewis Harmon
Lars Nilson Lars Nilson
Kyle Centers Kyle Centers
Kristopher Bixler Kristopher Bixler
Konstantin Sinitsyn
Karsten Weiss Karsten Weiss
Karl Heijdenberg Karl Heijdenberg
Jutta Sauer Jutta Sauer
@@ -333,6 +332,7 @@ Frank Lichtenheld
Ferdinand Cornelissen Ferdinand Cornelissen
Fajran Iman Fajran Iman
Fabien Dachicourt Fabien Dachicourt
Emmanuel Roche
Edmond Gheury Edmond Gheury
Ed Ralston Ed Ralston
Duvan Cope Duvan Cope
@@ -346,7 +346,6 @@ Danny Valente
Daniel Stien Daniel Stien
Dan Minor Dan Minor
Cyril Brulebois Cyril Brulebois
Cory Riddell
Clay Fowler Clay Fowler
Chuck Sembroski Chuck Sembroski
Chuck Seberion Chuck Seberion

View File

@@ -1,5 +1,3 @@
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
IF(WIN32) IF(WIN32)
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.6 FATAL_ERROR) CMAKE_MINIMUM_REQUIRED(VERSION 2.4.6 FATAL_ERROR)
ELSE(WIN32) ELSE(WIN32)
@@ -30,8 +28,8 @@ PROJECT(OpenSceneGraph)
SET(OPENSCENEGRAPH_MAJOR_VERSION 2) SET(OPENSCENEGRAPH_MAJOR_VERSION 2)
SET(OPENSCENEGRAPH_MINOR_VERSION 8) SET(OPENSCENEGRAPH_MINOR_VERSION 8)
SET(OPENSCENEGRAPH_PATCH_VERSION 5) SET(OPENSCENEGRAPH_PATCH_VERSION 1)
SET(OPENSCENEGRAPH_SOVERSION 74) SET(OPENSCENEGRAPH_SOVERSION 55)
# set to 0 when not a release candidate, non zero means that any generated # set to 0 when not a release candidate, non zero means that any generated
# svn tags will be treated as release candidates of given number # svn tags will be treated as release candidates of given number
@@ -153,12 +151,6 @@ IF(UNIX)
FIND_PACKAGE(X11) FIND_PACKAGE(X11)
# Some Unicies need explicit linkage to the Math library or the build fails. # Some Unicies need explicit linkage to the Math library or the build fails.
FIND_LIBRARY(MATH_LIBRARY m) FIND_LIBRARY(MATH_LIBRARY m)
FIND_LIBRARY(DL_LIBRARY dl)
IF(NOT DL_LIBRARY)
SET(DL_LIBRARY "") # change from NOTFOUND to empty when passed to linker
ENDIF()
ENDIF(UNIX) ENDIF(UNIX)
# Make the headers visible to everything # Make the headers visible to everything
@@ -251,8 +243,6 @@ ENDIF(WIN32)
#luigi#ENDIF(UNIX) #luigi#ENDIF(UNIX)
######################################################################################################## ########################################################################################################
OPTION(OSG_NOTIFY_DISABLED "Set to ON to build OpenSceneGraph with the notify() disabled." OFF)
OPTION(OSG_USE_FLOAT_MATRIX "Set to ON to build OpenSceneGraph with float Matrix instead of double." OFF) OPTION(OSG_USE_FLOAT_MATRIX "Set to ON to build OpenSceneGraph with float Matrix instead of double." OFF)
MARK_AS_ADVANCED(OSG_USE_FLOAT_MATRIX) MARK_AS_ADVANCED(OSG_USE_FLOAT_MATRIX)
@@ -273,8 +263,6 @@ MARK_AS_ADVANCED(OSG_DISABLE_MSVC_WARNINGS)
OPTION(OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION "Set to ON to use the ref_ptr<> T* operator() output conversion. " ON) OPTION(OSG_USE_REF_PTR_IMPLICIT_OUTPUT_CONVERSION "Set to ON to use the ref_ptr<> T* operator() output conversion. " ON)
OPTION(OSG_CPP_EXCEPTIONS_AVAILABLE "Set to OFF to disable compile of OSG components that use C++ exceptions." ON)
################################################################################ ################################################################################
# Set Config file # Set Config file
@@ -305,7 +293,6 @@ FIND_PACKAGE(Inventor)
FIND_PACKAGE(Jasper) FIND_PACKAGE(Jasper)
FIND_PACKAGE(OpenEXR) FIND_PACKAGE(OpenEXR)
FIND_PACKAGE(COLLADA) FIND_PACKAGE(COLLADA)
FIND_PACKAGE(FBX)
FIND_PACKAGE(ZLIB) FIND_PACKAGE(ZLIB)
FIND_PACKAGE(Xine) FIND_PACKAGE(Xine)
FIND_PACKAGE(OpenVRML) FIND_PACKAGE(OpenVRML)
@@ -315,12 +302,7 @@ FIND_PACKAGE(CURL)
FIND_PACKAGE(ITK) FIND_PACKAGE(ITK)
FIND_PACKAGE(LibVNCServer) FIND_PACKAGE(LibVNCServer)
FIND_PACKAGE(OurDCMTK) FIND_PACKAGE(OurDCMTK)
FIND_PACKAGE(OpenAL)
FIND_PACKAGE(XUL) FIND_PACKAGE(XUL)
FIND_PACKAGE(FFmpeg)
# Include macro utilities here
INCLUDE(OsgMacroUtils)
#use pkg-config to find various modues #use pkg-config to find various modues
INCLUDE(FindPkgConfig OPTIONAL) INCLUDE(FindPkgConfig OPTIONAL)
@@ -507,16 +489,8 @@ ENDIF(NOT MSVC)
# #
# On CMake 2.6.x use the newly minted CMAKE_LIBRARY_OUTPUT_DIRECTORY, # On CMake 2.6.x use the newly minted CMAKE_LIBRARY_OUTPUT_DIRECTORY,
# CMAKE_ARCHIVE_OUTPUT_DIRECTORY & CMAKE_RUNTIME_OUTPUT_DIRECTORY # CMAKE_ARCHIVE_OUTPUT_DIRECTORY & CMAKE_RUNTIME_OUTPUT_DIRECTORY
#
# CMake >= 2.8.1 changed the output directory algorithm (See doc). IF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4)
# Here we also set per-configuration directories (CMAKE_*_OUTPUT_DIRECTORY_<CONFIG>), or else binaries are generated in /bin/Debug and /bin/Release, etc. with MSVC and Xcode.
# (Doc reads "multi-configuration generators (VS, Xcode) do NOT append a per-configuration subdirectory to the specified directory").
# The workaround for 2.6.x (adding "../" as an output prefix for each target) seem to have no effect in >=2.8.1, so there is no need to change this.
IF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION LESS 5)
# If CMake < 2.6.0
SET(EXECUTABLE_OUTPUT_PATH ${OUTPUT_BINDIR})
SET(LIBRARY_OUTPUT_PATH ${OUTPUT_LIBDIR})
ELSE()
# If CMake >= 2.6.0 # If CMake >= 2.6.0
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_LIBDIR}) SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_LIBDIR})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_BINDIR}) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_BINDIR})
@@ -525,22 +499,10 @@ ELSE()
ELSE(WIN32) ELSE(WIN32)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_LIBDIR}) SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_LIBDIR})
ENDIF(WIN32) ENDIF(WIN32)
ELSE(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4)
# Testing CMAKE_VERSION is possible in >= 2.6.4 only SET(EXECUTABLE_OUTPUT_PATH ${OUTPUT_BINDIR})
BUILDER_VERSION_GREATER(2 8 0) SET(LIBRARY_OUTPUT_PATH ${OUTPUT_LIBDIR})
IF(VALID_BUILDER_VERSION) # If CMake >= 2.8.1 ENDIF(CMAKE_MAJOR_VERSION EQUAL 2 AND CMAKE_MINOR_VERSION GREATER 4)
FOREACH(CONF ${CMAKE_CONFIGURATION_TYPES}) # For each configuration (Debug, Release, MinSizeRel... and/or anything the user chooses)
STRING(TOUPPER "${CONF}" CONF) # Go uppercase (DEBUG, RELEASE...)
SET("CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONF}" "${OUTPUT_LIBDIR}")
SET("CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONF}" "${OUTPUT_BINDIR}")
IF(WIN32)
SET("CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONF}" "${OUTPUT_BINDIR}")
ELSE()
SET("CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONF}" "${OUTPUT_LIBDIR}")
ENDIF()
ENDFOREACH()
ENDIF(VALID_BUILDER_VERSION)
ENDIF()
#SET(INSTALL_BINDIR OpenSceneGraph/bin) #SET(INSTALL_BINDIR OpenSceneGraph/bin)
#SET(INSTALL_INCDIR OpenSceneGraph/include) #SET(INSTALL_INCDIR OpenSceneGraph/include)
@@ -642,7 +604,7 @@ ELSE (DYNAMIC_OPENSCENEGRAPH)
SET(OPENSCENEGRAPH_USER_DEFINED_DYNAMIC_OR_STATIC "STATIC") SET(OPENSCENEGRAPH_USER_DEFINED_DYNAMIC_OR_STATIC "STATIC")
ENDIF(DYNAMIC_OPENSCENEGRAPH) ENDIF(DYNAMIC_OPENSCENEGRAPH)
INCLUDE(OsgMacroUtils)
# OSG Core # OSG Core
ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(src)

View File

@@ -15,17 +15,6 @@
SET(COLLADA_DOM_ROOT "$ENV{COLLADA_DIR}/dom" CACHE PATH "Location of Collada DOM directory") SET(COLLADA_DOM_ROOT "$ENV{COLLADA_DIR}/dom" CACHE PATH "Location of Collada DOM directory")
IF(APPLE)
SET(COLLADA_BUILDNAME "mac")
ELSEIF(MINGW)
SET(COLLADA_BUILDNAME "mingw")
ELSEIF(MSVC90)
SET(COLLADA_BUILDNAME "vc9")
ELSE(APPLE)
SET(COLLADA_BUILDNAME "vc8")
ENDIF(APPLE)
FIND_PATH(COLLADA_INCLUDE_DIR dae.h FIND_PATH(COLLADA_INCLUDE_DIR dae.h
${COLLADA_DOM_ROOT}/include ${COLLADA_DOM_ROOT}/include
$ENV{COLLADA_DIR}/include $ENV{COLLADA_DIR}/include
@@ -48,10 +37,10 @@ FIND_PATH(COLLADA_INCLUDE_DIR dae.h
) )
FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY
NAMES collada_dom collada14dom Collada14Dom libcollada14dom21 libcollada14dom22 NAMES collada_dom collada14dom libcollada14dom21
PATHS PATHS
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4 ${COLLADA_DOM_ROOT}/build/vc8-1.4
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4 $ENV{COLLADA_DIR}/build/vc8-1.4
$ENV{COLLADA_DIR}/lib $ENV{COLLADA_DIR}/lib
$ENV{COLLADA_DIR}/lib-dbg $ENV{COLLADA_DIR}/lib-dbg
$ENV{COLLADA_DIR} $ENV{COLLADA_DIR}
@@ -73,10 +62,10 @@ FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY
) )
FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG
NAMES collada_dom-d collada14dom-d Collada14Dom-d libcollada14dom21-d libcollada14dom22-d NAMES collada_dom-d collada14dom-d libcollada14dom21-d
PATHS PATHS
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4-d ${COLLADA_DOM_ROOT}/build/vc8-1.4-d
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4-d $ENV{COLLADA_DIR}/build/vc8-1.4-d
$ENV{COLLADA_DIR}/lib $ENV{COLLADA_DIR}/lib
$ENV{COLLADA_DIR}/lib-dbg $ENV{COLLADA_DIR}/lib-dbg
$ENV{COLLADA_DIR} $ENV{COLLADA_DIR}
@@ -98,10 +87,10 @@ FIND_LIBRARY(COLLADA_DYNAMIC_LIBRARY_DEBUG
) )
FIND_LIBRARY(COLLADA_STATIC_LIBRARY FIND_LIBRARY(COLLADA_STATIC_LIBRARY
NAMES libcollada14dom21-s libcollada14dom22-s NAMES libcollada14dom21-s
PATHS PATHS
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4 ${COLLADA_DOM_ROOT}/build/vc8-1.4
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4 $ENV{COLLADA_DIR}/build/vc8-1.4
$ENV{COLLADA_DIR}/lib $ENV{COLLADA_DIR}/lib
$ENV{COLLADA_DIR}/lib-dbg $ENV{COLLADA_DIR}/lib-dbg
$ENV{COLLADA_DIR} $ENV{COLLADA_DIR}
@@ -123,10 +112,10 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY
) )
FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
NAMES collada_dom-sd collada14dom-sd libcollada14dom21-sd libcollada14dom22-sd NAMES collada_dom-sd collada14dom-sd libcollada14dom21-sd
PATHS PATHS
${COLLADA_DOM_ROOT}/build/${COLLADA_BUILDNAME}-1.4-d ${COLLADA_DOM_ROOT}/build/vc8-1.4-d
$ENV{COLLADA_DIR}/build/${COLLADA_BUILDNAME}-1.4-d $ENV{COLLADA_DIR}/build/vc8-1.4-d
$ENV{COLLADA_DIR}/lib $ENV{COLLADA_DIR}/lib
$ENV{COLLADA_DIR}/lib-dbg $ENV{COLLADA_DIR}/lib-dbg
$ENV{COLLADA_DIR} $ENV{COLLADA_DIR}
@@ -147,6 +136,8 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
/usr/freeware/lib64 /usr/freeware/lib64
) )
IF(COLLADA_STATIC_LIBRARY)
# find extra libraries that the static linking requires # find extra libraries that the static linking requires
FIND_PACKAGE(LibXml2) FIND_PACKAGE(LibXml2)
@@ -177,80 +168,105 @@ FIND_LIBRARY(COLLADA_STATIC_LIBRARY_DEBUG
ENDIF(WIN32) ENDIF(WIN32)
ENDIF(ZLIB_FOUND) ENDIF(ZLIB_FOUND)
FIND_LIBRARY(COLLADA_PCRECPP_LIBRARY IF(WIN32)
NAMES pcrecpp
PATHS
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME}
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw
)
FIND_LIBRARY(COLLADA_PCRECPP_LIBRARY_DEBUG FIND_LIBRARY(COLLADA_PCRECPP_LIBRARY
NAMES pcrecpp-d NAMES pcrecpp
PATHS PATHS
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc9
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac
) ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw
)
FIND_LIBRARY(COLLADA_PCRE_LIBRARY FIND_LIBRARY(COLLADA_PCRECPP_LIBRARY_DEBUG
NAMES pcre NAMES pcrecpp-d
PATHS PATHS
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc9
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac
) ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw
)
FIND_LIBRARY(COLLADA_PCRE_LIBRARY_DEBUG FIND_LIBRARY(COLLADA_PCRE_LIBRARY
NAMES pcre-d NAMES pcre
PATHS PATHS
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc9
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac
) ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw
)
FIND_LIBRARY(COLLADA_MINIZIP_LIBRARY FIND_LIBRARY(COLLADA_PCRE_LIBRARY_DEBUG
NAMES minizip NAMES pcre-d
PATHS PATHS
${COLLADA_DOM_ROOT}/external-libs/minizip/win32/lib ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/minizip/mac ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/vc9
) ${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mac
${COLLADA_DOM_ROOT}/external-libs/pcre/lib/mingw
)
FIND_LIBRARY(COLLADA_MINIZIP_LIBRARY_DEBUG FIND_LIBRARY(COLLADA_MINIZIP_LIBRARY
NAMES minizip-d NAMES minizip
PATHS PATHS
${COLLADA_DOM_ROOT}/external-libs/minizip/win32/lib ${COLLADA_DOM_ROOT}/external-libs/minizip/win32/lib
${COLLADA_DOM_ROOT}/external-libs/minizip/mac ${COLLADA_DOM_ROOT}/external-libs/minizip/mac
) )
FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY FIND_LIBRARY(COLLADA_MINIZIP_LIBRARY_DEBUG
NAMES libboost_filesystem boost_filesystem NAMES minizip-d
PATHS PATHS
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME} ${COLLADA_DOM_ROOT}/external-libs/minizip/win32/lib
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw ${COLLADA_DOM_ROOT}/external-libs/minizip/mac
) )
ENDIF(WIN32)
FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY_DEBUG ENDIF(COLLADA_STATIC_LIBRARY)
NAMES libboost_filesystem-d boost_filesystem-d
PATHS
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
)
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY IF(COLLADA_DYNAMIC_LIBRARY OR COLLADA_STATIC_LIBRARY)
NAMES libboost_system boost_system
PATHS
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME}
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
)
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY_DEBUG IF(WIN32)
NAMES libboost_system-d boost_system-d
PATHS FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY
${COLLADA_DOM_ROOT}/external-libs/boost/lib/${COLLADA_BUILDNAME} NAMES libboost_filesystem
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw PATHS
) ${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc9
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
)
FIND_LIBRARY(COLLADA_BOOST_FILESYSTEM_LIBRARY_DEBUG
NAMES libboost_filesystem-d
PATHS
${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc9
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
)
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY
NAMES libboost_system
PATHS
${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc9
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
)
FIND_LIBRARY(COLLADA_BOOST_SYSTEM_LIBRARY_DEBUG
NAMES libboost_system-d
PATHS
${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc8
${COLLADA_DOM_ROOT}/external-libs/boost/lib/vc9
${COLLADA_DOM_ROOT}/external-libs/boost/lib/mingw
)
FIND_PATH(COLLADA_BOOST_INCLUDE_DIR boost/filesystem/convenience.hpp
${COLLADA_DOM_ROOT}/external-libs/boost
)
ENDIF(WIN32)
ENDIF(COLLADA_DYNAMIC_LIBRARY OR COLLADA_STATIC_LIBRARY)
SET(COLLADA_FOUND "NO") SET(COLLADA_FOUND "NO")
IF(COLLADA_DYNAMIC_LIBRARY OR COLLADA_STATIC_LIBRARY) IF(COLLADA_DYNAMIC_LIBRARY OR COLLADA_STATIC_LIBRARY)

View File

@@ -1,51 +0,0 @@
# Locate FBX
# This module defines:
# FBX_INCLUDE_DIR, where to find the headers
#
# FBX_LIBRARY, FBX_LIBRARY_DEBUG
# FBX_FOUND
#
# $FBX_DIR is an environment variable that would
# correspond to the ./configure --prefix=$FBX_DIR
IF(WIN32)
SET(FBX_ROOT "$ENV{PROGRAMFILES}/Autodesk/FBX/FbxSdk/2010.2" CACHE PATH "Location of FBX SDK directory")
ELSE(WIN32)
SET(FBX_ROOT $ENV{FBX_DIR} CACHE PATH "Location of FBX SDK directory")
ENDIF(WIN32)
IF(APPLE)
SET(FBX_LIBNAME "libfbxsdk_gcc4_ub")
ELSEIF(CMAKE_COMPILER_IS_GNUCXX)
SET(FBX_LIBNAME "libfbxsdk_gcc4")#TODO: libs are provided for GCC 3.4 & 4.0 in both 32 and 64 bit versions, but I don't know how to confgure that here.
ELSEIF(MSVC71)
SET(FBX_LIBNAME "fbxsdk_md2003")
ELSEIF(MSVC80)
SET(FBX_LIBNAME "fbxsdk_md2005")
ELSEIF(MSVC90 OR MSVC_VER>1500)
SET(FBX_LIBNAME "fbxsdk_md2008")
ENDIF(APPLE)
IF(CMAKE_CL_64)
SET(FBX_LIBNAME ${FBX_LIBNAME}_amd64)
ENDIF(CMAKE_CL_64)
IF(APPLE)
SET(FBX_LIBNAME_DEBUG ${FBX_LIBNAME})
ELSE(APPLE)
SET(FBX_LIBNAME_DEBUG ${FBX_LIBNAME}d)
ENDIF(APPLE)
FIND_PATH(FBX_INCLUDE_DIR fbxsdk.h
${FBX_ROOT}/include
)
FIND_LIBRARY(FBX_LIBRARY ${FBX_LIBNAME} ${FBX_ROOT}/lib)
FIND_LIBRARY(FBX_LIBRARY_DEBUG ${FBX_LIBNAME_DEBUG} ${FBX_ROOT}/lib)
IF(FBX_LIBRARY AND FBX_LIBRARY_DEBUG AND FBX_INCLUDE_DIR)
SET(FBX_FOUND "YES")
ELSE(FBX_LIBRARY AND FBX_LIBRARY_DEBUG AND FBX_INCLUDE_DIR)
SET(FBX_FOUND "NO")
ENDIF(FBX_LIBRARY AND FBX_LIBRARY_DEBUG AND FBX_INCLUDE_DIR)

View File

@@ -1,165 +0,0 @@
# Locate ffmpeg
# This module defines
# FFMPEG_LIBRARIES
# FFMPEG_FOUND, if false, do not try to link to ffmpeg
# FFMPEG_INCLUDE_DIR, where to find the headers
#
# $FFMPEG_DIR is an environment variable that would
# correspond to the ./configure --prefix=$FFMPEG_DIR
#
# Created by Robert Osfield.
#In ffmpeg code, old version use "#include <header.h>" and newer use "#include <libname/header.h>"
#In OSG ffmpeg plugin, we use "#include <header.h>" for compatibility with old version of ffmpeg
#We have to search the path which contain the header.h (usefull for old version)
#and search the path which contain the libname/header.h (usefull for new version)
#Then we need to include ${FFMPEG_libname_INCLUDE_DIRS} (in old version case, use by ffmpeg header and osg plugin code)
# (in new version case, use by ffmpeg header)
#and ${FFMPEG_libname_INCLUDE_DIRS/libname} (in new version case, use by osg plugin code)
# Macro to find header and lib directories
# example: FFMPEG_FIND(AVFORMAT avformat avformat.h)
MACRO(FFMPEG_FIND varname shortname headername)
# old version of ffmpeg put header in $prefix/include/[ffmpeg]
# so try to find header in include directory
FIND_PATH(FFMPEG_${varname}_INCLUDE_DIRS lib${shortname}/${headername}
PATHS
${FFMPEG_ROOT}/include
$ENV{FFMPEG_DIR}/include
~/Library/Frameworks
/Library/Frameworks
/usr/local/include
/usr/include
/sw/include # Fink
/opt/local/include # DarwinPorts
/opt/csw/include # Blastwave
/opt/include
/usr/freeware/include
PATH_SUFFIXES ffmpeg
DOC "Location of FFMPEG Headers"
)
FIND_PATH(FFMPEG_${varname}_INCLUDE_DIRS ${headername}
PATHS
${FFMPEG_ROOT}/include
$ENV{FFMPEG_DIR}/include
~/Library/Frameworks
/Library/Frameworks
/usr/local/include
/usr/include
/sw/include # Fink
/opt/local/include # DarwinPorts
/opt/csw/include # Blastwave
/opt/include
/usr/freeware/include
PATH_SUFFIXES ffmpeg
DOC "Location of FFMPEG Headers"
)
FIND_LIBRARY(FFMPEG_${varname}_LIBRARIES
NAMES ${shortname}
PATHS
${FFMPEG_ROOT}/lib
$ENV{FFMPEG_DIR}/lib
~/Library/Frameworks
/Library/Frameworks
/usr/local/lib
/usr/local/lib64
/usr/lib
/usr/lib64
/sw/lib
/opt/local/lib
/opt/csw/lib
/opt/lib
/usr/freeware/lib64
DOC "Location of FFMPEG Libraries"
)
IF (FFMPEG_${varname}_LIBRARIES AND FFMPEG_${varname}_INCLUDE_DIRS)
SET(FFMPEG_${varname}_FOUND 1)
ENDIF(FFMPEG_${varname}_LIBRARIES AND FFMPEG_${varname}_INCLUDE_DIRS)
ENDMACRO(FFMPEG_FIND)
SET(FFMPEG_ROOT "$ENV{FFMPEG_DIR}" CACHE PATH "Location of FFMPEG")
# find stdint.h
IF(WIN32)
FIND_PATH(FFMPEG_STDINT_INCLUDE_DIR stdint.h
PATHS
${FFMPEG_ROOT}/include
$ENV{FFMPEG_DIR}/include
~/Library/Frameworks
/Library/Frameworks
/usr/local/include
/usr/include
/sw/include # Fink
/opt/local/include # DarwinPorts
/opt/csw/include # Blastwave
/opt/include
/usr/freeware/include
PATH_SUFFIXES ffmpeg
DOC "Location of FFMPEG stdint.h Header"
)
IF (FFMPEG_STDINT_INCLUDE_DIR)
SET(STDINT_OK TRUE)
ENDIF()
ELSE()
SET(STDINT_OK TRUE)
ENDIF()
FFMPEG_FIND(LIBAVFORMAT avformat avformat.h)
FFMPEG_FIND(LIBAVDEVICE avdevice avdevice.h)
FFMPEG_FIND(LIBAVCODEC avcodec avcodec.h)
FFMPEG_FIND(LIBAVUTIL avutil avutil.h)
FFMPEG_FIND(LIBSWSCALE swscale swscale.h) # not sure about the header to look for here.
SET(FFMPEG_FOUND "NO")
# Note we don't check FFMPEG_LIBSWSCALE_FOUND here, it's optional.
IF (FFMPEG_LIBAVFORMAT_FOUND AND FFMPEG_LIBAVDEVICE_FOUND AND FFMPEG_LIBAVCODEC_FOUND AND FFMPEG_LIBAVUTIL_FOUND AND STDINT_OK)
SET(FFMPEG_FOUND "YES")
SET(FFMPEG_INCLUDE_DIRS
${FFMPEG_LIBAVFORMAT_INCLUDE_DIRS} ${FFMPEG_LIBAVFORMAT_INCLUDE_DIRS}/libavformat
${FFMPEG_LIBAVDEVICE_INCLUDE_DIRS} ${FFMPEG_LIBAVDEVICE_INCLUDE_DIRS}/libavdevice
${FFMPEG_LIBAVCODEC_INCLUDE_DIRS} ${FFMPEG_LIBAVCODEC_INCLUDE_DIRS}/libavcodec
${FFMPEG_LIBAVUTIL_INCLUDE_DIRS} ${FFMPEG_LIBAVUTIL_INCLUDE_DIRS}/libavutil
)
IF (${FFMPEG_STDINT_INCLUDE_DIR})
SET(FFMPEG_INCLUDE_DIRS
${FFMPEG_INCLUDE_DIRS}
${FFMPEG_STDINT_INCLUDE_DIR}
${FFMPEG_STDINT_INCLUDE_DIR}/libavformat
${FFMPEG_STDINT_INCLUDE_DIR}/libavdevice
${FFMPEG_STDINT_INCLUDE_DIR}/libavcodec
${FFMPEG_STDINT_INCLUDE_DIR}/libavutil
)
ENDIF()
SET(FFMPEG_LIBRARY_DIRS ${FFMPEG_LIBAVFORMAT_LIBRARY_DIRS})
# Note we don't add FFMPEG_LIBSWSCALE_LIBRARIES here, it will be added if found later.
SET(FFMPEG_LIBRARIES
${FFMPEG_LIBAVFORMAT_LIBRARIES}
${FFMPEG_LIBAVDEVICE_LIBRARIES}
${FFMPEG_LIBAVCODEC_LIBRARIES}
${FFMPEG_LIBAVUTIL_LIBRARIES})
ELSE ()
# MESSAGE(STATUS "Could not find FFMPEG")
ENDIF()

View File

@@ -1,41 +1,10 @@
# # - Locate Inventor
# Find Open Inventor
#
# This module defines: # This module defines:
# INVENTOR_FOUND, if false, do not try to link against Inventor. # INVENTOR_FOUND, if false, do not try to link against Inventor.
# INVENTOR_INCLUDE_DIR, where to find headers. # INVENTOR_INCLUDE_DIR, where to find headers.
# INVENTOR_LIBRARY, the library to link against. # INVENTOR_LIBRARY, the library to link against.
# INVENTOR_LIBRARY_DEBUG, the debug library to link against. # INVENTOR_LIBRARY_DEBUG, the debug library to link against.
# INVENTOR_SOWIN_LIBRARY, the SoWin library - window binding library for Inventor
# INVENTOR_SOWIN_LIBRARY, the SoWin debug library
# INVENTOR_SOXT_LIBRARY, the SoXt library - window binding library for Inventor
# INVENTOR_SOXT_LIBRARY, the SoXt debug library
#
#
# Inventor
#
# notes:
# - Coin is honored over SGI Inventor
# - Coin is detected by coin-config script, COINDIR environment variable,
# and finally standard system locations are searched
# - SGI Inventor is searched at standard system locations only
#
# coin-config tells much of Coin instalation (if present)
execute_process (COMMAND coin-config --prefix
OUTPUT_VARIABLE COIN_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE)
# try to find Inventor includes (priority paths)
FIND_PATH(INVENTOR_INCLUDE_DIR Inventor/So.h
${COIN_PREFIX}/include
$ENV{COINDIR}/include
NO_DEFAULT_PATH
)
# try to find Inventor includes (regular paths)
FIND_PATH(INVENTOR_INCLUDE_DIR Inventor/So.h FIND_PATH(INVENTOR_INCLUDE_DIR Inventor/So.h
/usr/local/include /usr/local/include
/usr/include /usr/include
@@ -43,164 +12,52 @@ FIND_PATH(INVENTOR_INCLUDE_DIR Inventor/So.h
/opt/local/include /opt/local/include
/opt/csw/include /opt/csw/include
/opt/include /opt/include
$ENV{COINDIR}/include
) )
# default Inventor lib search paths FIND_LIBRARY(INVENTOR_LIBRARY
SET(INVENTOR_LIB_SEARCH_PATH NAMES coin2 Coin
PATHS
/usr/local/lib /usr/local/lib
/usr/lib /usr/lib
/sw/lib /sw/lib
/opt/local/lib /opt/local/lib
/opt/csw/lib /opt/csw/lib
/opt/lib /opt/lib
$ENV{COINDIR}/lib
) )
IF(NOT INVENTOR_LIBRARY)
# If we can't find libCoin try libInventor
FIND_LIBRARY(INVENTOR_LIBRARY
NAMES Inventor
PATHS
/usr/local/lib
/usr/lib
/sw/lib
/opt/local/lib
/opt/csw/lib
/opt/lib
)
ENDIF(NOT INVENTOR_LIBRARY)
# try to find Coin release lib (priority paths)
FIND_LIBRARY(INVENTOR_LIBRARY_RELEASE
NAMES coin5 coin4 coin3 coin2 coin1 Coin
PATHS ${COIN_PREFIX}/lib
$ENV{COINDIR}/lib
NO_DEFAULT_PATH
)
# try to find Coin release lib (regular paths)
FIND_LIBRARY(INVENTOR_LIBRARY_RELEASE
NAMES coin5 coin4 coin3 coin2 coin1 Coin
PATHS ${INVENTOR_LIB_SEARCH_PATH}
)
# try to find SGI Inventor lib
FIND_LIBRARY(INVENTOR_LIBRARY_RELEASE
NAMES Inventor
PATHS ${INVENTOR_LIB_SEARCH_PATH}
)
# try to find Coin debug lib (priority paths)
FIND_LIBRARY(INVENTOR_LIBRARY_DEBUG FIND_LIBRARY(INVENTOR_LIBRARY_DEBUG
NAMES coin5d coin4d coin3d coin2d coin1d NAMES coin2d
PATHS ${COIN_PREFIX}/lib PATHS
$ENV{COINDIR}/lib /usr/local/lib
NO_DEFAULT_PATH /usr/lib
/sw/lib
/opt/local/lib
/opt/csw/lib
/opt/lib
$ENV{COINDIR}/lib
) )
IF(NOT INVENTOR_LIBRARY_DEBUG)
IF(INVENTOR_LIBRARY)
SET(INVENTOR_LIBRARY_DEBUG ${INVENTOR_LIBRARY})
ENDIF(INVENTOR_LIBRARY)
ENDIF(NOT INVENTOR_LIBRARY_DEBUG)
# try to find Coin debug lib (regular paths)
FIND_LIBRARY(INVENTOR_LIBRARY_DEBUG
NAMES coin5d coin4d coin3d coin2d coin1d
PATHS ${INVENTOR_LIB_SEARCH_PATH}
)
# set release to debug if only debug found
IF(NOT INVENTOR_LIBRARY_RELEASE AND INVENTOR_LIBRARY_DEBUG)
SET(INVENTOR_LIBRARY_RELEASE ${INVENTOR_LIBRARY_DEBUG})
ENDIF(NOT INVENTOR_LIBRARY_RELEASE AND INVENTOR_LIBRARY_DEBUG)
# set debug to release (if only release found)
IF(NOT INVENTOR_LIBRARY_DEBUG AND INVENTOR_LIBRARY_RELEASE)
SET(INVENTOR_LIBRARY_DEBUG ${INVENTOR_LIBRARY_RELEASE})
ENDIF(NOT INVENTOR_LIBRARY_DEBUG AND INVENTOR_LIBRARY_RELEASE)
# INVENTOR_LIBRARY
IF (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
SET(INVENTOR_LIBRARY
optimized ${INVENTOR_LIBRARY_RELEASE}
debug ${INVENTOR_LIBRARY_DEBUG})
ELSE(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
SET(INVENTOR_LIBRARY
${INVENTOR_LIBRARY_RELEASE})
ENDIF(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
# set INVENTOR_FOUND appropriately
SET(INVENTOR_FOUND "NO") SET(INVENTOR_FOUND "NO")
IF(INVENTOR_INCLUDE_DIR AND INVENTOR_LIBRARY) IF(INVENTOR_INCLUDE_DIR AND INVENTOR_LIBRARY)
SET(INVENTOR_FOUND "YES") SET(INVENTOR_FOUND "YES")
ENDIF(INVENTOR_INCLUDE_DIR AND INVENTOR_LIBRARY) ENDIF(INVENTOR_INCLUDE_DIR AND INVENTOR_LIBRARY)
#
# SoWin
#
# notes: SoWin is searched by COINDIR environment variable
# (as expected to be located at Windows platform)
# try to find SoWin lib (priority paths)
FIND_LIBRARY(INVENTOR_SOWIN_LIBRARY
NAMES sowin1
PATHS $ENV{COINDIR}/lib
NO_DEFAULT_PATH
)
# try to find SoWin lib (regular paths)
FIND_LIBRARY(INVENTOR_SOWIN_LIBRARY
NAMES sowin1
PATHS ${INVENTOR_LIB_SEARCH_PATH}
)
# try to find SoWin debug lib (priority paths)
FIND_LIBRARY(INVENTOR_SOWIN_LIBRARY_DEBUG
NAMES sowin1d
PATHS $ENV{COINDIR}/lib
NO_DEFAULT_PATH
)
# try to find SoWin debug lib (regular paths)
FIND_LIBRARY(INVENTOR_SOWIN_LIBRARY_DEBUG
NAMES sowin1d
PATHS ${INVENTOR_LIB_SEARCH_PATH}
)
# SoWin debug library defaults to non-debug lib
IF(NOT INVENTOR_SOWIN_LIBRARY_DEBUG)
IF(INVENTOR_SOWIN_LIBRARY)
SET(INVENTOR_SOWIN_LIBRARY_DEBUG INVENTOR_SOWIN_LIBRARY)
ENDIF(INVENTOR_SOWIN_LIBRARY)
ENDIF(NOT INVENTOR_SOWIN_LIBRARY_DEBUG)
#
# SoXt
#
# notes:
# - SoXt is detected by soxt-config script (as expected by
# Coin's SoXt on Linux/Unix) and on standard system locations
# - SGI's InventorXt support is missing now
#
# soxt-config tells much of SoXt instalation (if present)
execute_process (COMMAND soxt-config --prefix
OUTPUT_VARIABLE SOXT_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE)
# try to find SoXt lib (priority paths)
FIND_LIBRARY(INVENTOR_SOXT_LIBRARY
NAMES soxt1 SoXt
PATHS ${SOXT_PREFIX}/lib
$ENV{COINDIR}/lib
NO_DEFAULT_PATH
)
# try to find SoXt lib (regular paths)
FIND_LIBRARY(INVENTOR_SOXT_LIBRARY
NAMES soxt1 SoXt
PATHS ${INVENTOR_LIB_SEARCH_PATH}
)
# try to find SoXt debug lib (priority paths)
FIND_LIBRARY(INVENTOR_SOXT_LIBRARY_DEBUG
NAMES soxt1d
PATHS ${SOXT_PREFIX}/lib
$ENV{COINDIR}/lib
NO_DEFAULT_PATH
)
# try to find SoXt debug lib (regular paths)
FIND_LIBRARY(INVENTOR_SOXT_LIBRARY_DEBUG
NAMES soxt1d
PATHS ${INVENTOR_LIB_SEARCH_PATH}
)
# SoXt debug library defaults to non-debug lib
IF(NOT INVENTOR_SOXT_LIBRARY_DEBUG)
IF(INVENTOR_SOXT_LIBRARY)
SET(INVENTOR_SOXT_LIBRARY_DEBUG INVENTOR_SOXT_LIBRARY)
ENDIF(INVENTOR_SOXT_LIBRARY)
ENDIF(NOT INVENTOR_SOXT_LIBRARY_DEBUG)

View File

@@ -15,7 +15,7 @@
IF(APPLE) IF(APPLE)
FIND_PATH(QUICKTIME_INCLUDE_DIR QuickTime/QuickTime.h) FIND_PATH(QUICKTIME_INCLUDE_DIR QuickTime/QuickTime.h)
FIND_LIBRARY(QUICKTIME_LIBRARY QuickTime) FIND_LIBRARY(QUICKTIME_LIBRARY QuickTime)
ELSE() ELSE(APPLE)
FIND_PATH(QUICKTIME_INCLUDE_DIR QuickTime.h FIND_PATH(QUICKTIME_INCLUDE_DIR QuickTime.h
$ENV{QUICKTIME_DIR}/include $ENV{QUICKTIME_DIR}/include
$ENV{QUICKTIME_DIR} $ENV{QUICKTIME_DIR}
@@ -39,24 +39,11 @@ ELSE()
PATH_SUFFIXES lib64 lib PATH_SUFFIXES lib64 lib
) )
FIND_LIBRARY(QUICKTIME_LIBRARY QuickTime) FIND_LIBRARY(QUICKTIME_LIBRARY QuickTime)
ENDIF() ENDIF(APPLE)
SET(QUICKTIME_FOUND "NO") SET(QUICKTIME_FOUND "NO")
IF(QUICKTIME_LIBRARY AND QUICKTIME_INCLUDE_DIR) IF(QUICKTIME_LIBRARY AND QUICKTIME_INCLUDE_DIR)
SET(QUICKTIME_FOUND "YES") SET(QUICKTIME_FOUND "YES")
ENDIF() ENDIF(QUICKTIME_LIBRARY AND QUICKTIME_INCLUDE_DIR)
IF(APPLE)
#Quicktime is not supported under 64bit OSX build so we need to detect it and disable it.
#First check to see if we are running with a native 64-bit compiler (10.6 default) and implicit arch
IF(NOT CMAKE_OSX_ARCHITECTURES AND CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(QUICKTIME_FOUND "NO")
ELSE()
#Otherwise check to see if 64-bit is explicitly called for.
LIST(FIND CMAKE_OSX_ARCHITECTURES "x86_64" has64Compile)
IF(NOT has64Compile EQUAL -1)
SET(QUICKTIME_FOUND "NO")
ENDIF()
ENDIF()
ENDIF()

View File

@@ -9,36 +9,6 @@
# the content of this library for linking when in debugging # the content of this library for linking when in debugging
####################################################################################################### #######################################################################################################
# VALID_BUILDER_VERSION: used for replacing CMAKE_VERSION (available in v2.6.3 RC9) and VERSION_GREATER/VERSION_LESS (available in 2.6.2 RC4).
# This can be replaced by "IF(${CMAKE_VERSION} VERSION_LESS "x.y.z")" from 2.6.4.
SET(VALID_BUILDER_VERSION OFF)
MACRO(BUILDER_VERSION_GREATER MAJOR_VER MINOR_VER PATCH_VER)
SET(VALID_BUILDER_VERSION OFF)
IF(CMAKE_MAJOR_VERSION GREATER ${MAJOR_VER})
SET(VALID_BUILDER_VERSION ON)
ELSEIF(CMAKE_MAJOR_VERSION EQUAL ${MAJOR_VER})
IF(CMAKE_MINOR_VERSION GREATER ${MINOR_VER})
SET(VALID_BUILDER_VERSION ON)
ELSEIF(CMAKE_MINOR_VERSION EQUAL ${MINOR_VER})
IF(CMAKE_PATCH_VERSION GREATER ${PATCH_VER})
SET(VALID_BUILDER_VERSION ON)
ENDIF(CMAKE_PATCH_VERSION GREATER ${PATCH_VER})
ENDIF()
ENDIF()
ENDMACRO(BUILDER_VERSION_GREATER MAJOR_VER MINOR_VER PATCH_VER)
# CMAKE24: if CMake version is <2.6.0.
SET(CMAKE24 OFF)
IF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} LESS 5)
SET(CMAKE24 ON)
ENDIF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} LESS 5)
# CMAKE_VERSION_TEST: Define whether "IF(${CMAKE_VERSION} VERSION_LESS "x.y.z")" can be used or not.
BUILDER_VERSION_GREATER(2 6 3)
SET(CMAKE_VERSION_TEST ${VALID_BUILDER_VERSION}) # >= 2.6.4
SET(VALID_BUILDER_VERSION OFF)
MACRO(LINK_WITH_VARIABLES TRGTNAME) MACRO(LINK_WITH_VARIABLES TRGTNAME)
FOREACH(varname ${ARGN}) FOREACH(varname ${ARGN})
@@ -51,9 +21,9 @@ MACRO(LINK_WITH_VARIABLES TRGTNAME)
ENDMACRO(LINK_WITH_VARIABLES TRGTNAME) ENDMACRO(LINK_WITH_VARIABLES TRGTNAME)
MACRO(LINK_INTERNAL TRGTNAME) MACRO(LINK_INTERNAL TRGTNAME)
IF(NOT CMAKE24) IF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)
TARGET_LINK_LIBRARIES(${TRGTNAME} ${ARGN}) TARGET_LINK_LIBRARIES(${TRGTNAME} ${ARGN})
ELSE(NOT CMAKE24) ELSE(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)
FOREACH(LINKLIB ${ARGN}) FOREACH(LINKLIB ${ARGN})
IF(MSVC AND OSG_MSVC_VERSIONED_DLL) IF(MSVC AND OSG_MSVC_VERSIONED_DLL)
#when using versioned names, the .dll name differ from .lib name, there is a problem with that: #when using versioned names, the .dll name differ from .lib name, there is a problem with that:
@@ -66,7 +36,7 @@ MACRO(LINK_INTERNAL TRGTNAME)
TARGET_LINK_LIBRARIES(${TRGTNAME} optimized "${LINKLIB}" debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}") TARGET_LINK_LIBRARIES(${TRGTNAME} optimized "${LINKLIB}" debug "${LINKLIB}${CMAKE_DEBUG_POSTFIX}")
ENDIF(MSVC AND OSG_MSVC_VERSIONED_DLL) ENDIF(MSVC AND OSG_MSVC_VERSIONED_DLL)
ENDFOREACH(LINKLIB) ENDFOREACH(LINKLIB)
ENDIF(NOT CMAKE24) ENDIF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)
ENDMACRO(LINK_INTERNAL TRGTNAME) ENDMACRO(LINK_INTERNAL TRGTNAME)
MACRO(LINK_EXTERNAL TRGTNAME) MACRO(LINK_EXTERNAL TRGTNAME)
@@ -146,44 +116,6 @@ ENDMACRO(SETUP_LINK_LIBRARIES)
# this is the common set of command for all the plugins # this is the common set of command for all the plugins
# #
# Sets the output directory property for CMake >= 2.6.0, giving an output path RELATIVE to default one
MACRO(SET_OUTPUT_DIR_PROPERTY_260 TARGET_TARGETNAME RELATIVE_OUTDIR)
BUILDER_VERSION_GREATER(2 8 0)
IF(NOT VALID_BUILDER_VERSION)
# If CMake <= 2.8.0 (Testing CMAKE_VERSION is possible in >= 2.6.4)
IF(MSVC_IDE)
# Using the "prefix" hack
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PREFIX "../${RELATIVE_OUTDIR}/")
ELSE(MSVC_IDE)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PREFIX "${RELATIVE_OUTDIR}/")
ENDIF(MSVC_IDE)
ELSE(NOT VALID_BUILDER_VERSION)
# Using the output directory properties
# Global properties (All generators but VS & Xcode)
FILE(TO_CMAKE_PATH TMPVAR "CMAKE_ARCHIVE_OUTPUT_DIRECTORY/${RELATIVE_OUTDIR}")
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${TMPVAR}")
FILE(TO_CMAKE_PATH TMPVAR "CMAKE_RUNTIME_OUTPUT_DIRECTORY/${RELATIVE_OUTDIR}")
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TMPVAR}")
FILE(TO_CMAKE_PATH TMPVAR "CMAKE_LIBRARY_OUTPUT_DIRECTORY/${RELATIVE_OUTDIR}")
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${TMPVAR}")
# Per-configuration property (VS, Xcode)
FOREACH(CONF ${CMAKE_CONFIGURATION_TYPES}) # For each configuration (Debug, Release, MinSizeRel... and/or anything the user chooses)
STRING(TOUPPER "${CONF}" CONF) # Go uppercase (DEBUG, RELEASE...)
# We use "FILE(TO_CMAKE_PATH", to create nice looking paths
FILE(TO_CMAKE_PATH "${CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONF}}/${RELATIVE_OUTDIR}" TMPVAR)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONF}" "${TMPVAR}")
FILE(TO_CMAKE_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONF}}/${RELATIVE_OUTDIR}" TMPVAR)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONF}" "${TMPVAR}")
FILE(TO_CMAKE_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONF}}/${RELATIVE_OUTDIR}" TMPVAR)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONF}" "${TMPVAR}")
ENDFOREACH(CONF ${CMAKE_CONFIGURATION_TYPES})
ENDIF(NOT VALID_BUILDER_VERSION)
ENDMACRO(SET_OUTPUT_DIR_PROPERTY_260 TARGET_TARGETNAME RELATIVE_OUTDIR)
MACRO(SETUP_PLUGIN PLUGIN_NAME) MACRO(SETUP_PLUGIN PLUGIN_NAME)
SET(TARGET_NAME ${PLUGIN_NAME} ) SET(TARGET_NAME ${PLUGIN_NAME} )
@@ -220,10 +152,13 @@ MACRO(SETUP_PLUGIN PLUGIN_NAME)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES DEBUG_POSTFIX "") SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES DEBUG_POSTFIX "")
ENDIF(NOT UNIX) ENDIF(NOT UNIX)
ELSE(NOT MSVC) ELSE(NOT MSVC)
IF(NOT CMAKE24) IF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)
SET_OUTPUT_DIR_PROPERTY_260(${TARGET_TARGETNAME} "${OSG_PLUGINS}") # Sets the ouput to be /osgPlugin-X.X.X ; also ensures the /Debug /Release are removed IF(NOT MSVC_IDE)
ELSE(NOT CMAKE24) SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PREFIX "${OSG_PLUGINS}/")
ELSE(NOT MSVC_IDE)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PREFIX "../${OSG_PLUGINS}/")
ENDIF(NOT MSVC_IDE)
ELSE(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)
IF(OSG_MSVC_VERSIONED_DLL) IF(OSG_MSVC_VERSIONED_DLL)
#this is a hack... the build place is set to lib/<debug or release> by LIBARARY_OUTPUT_PATH equal to OUTPUT_LIBDIR #this is a hack... the build place is set to lib/<debug or release> by LIBARARY_OUTPUT_PATH equal to OUTPUT_LIBDIR
@@ -246,8 +181,7 @@ MACRO(SETUP_PLUGIN PLUGIN_NAME)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PREFIX "${OSG_PLUGINS}/") SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PREFIX "${OSG_PLUGINS}/")
ENDIF(OSG_MSVC_VERSIONED_DLL) ENDIF(OSG_MSVC_VERSIONED_DLL)
ENDIF(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)
ENDIF(NOT CMAKE24)
ENDIF(NOT MSVC) ENDIF(NOT MSVC)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PROJECT_LABEL "${TARGET_LABEL}") SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PROJECT_LABEL "${TARGET_LABEL}")
@@ -323,7 +257,7 @@ MACRO(SETUP_EXE IS_COMMANDLINE_APP)
SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME}) SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES OUTPUT_NAME ${TARGET_NAME})
IF(MSVC_IDE AND OSG_MSVC_VERSIONED_DLL) IF(MSVC_IDE AND OSG_MSVC_VERSIONED_DLL)
SET_OUTPUT_DIR_PROPERTY_260(${TARGET_TARGETNAME} "") # Ensure the /Debug /Release are removed SET_TARGET_PROPERTIES(${TARGET_TARGETNAME} PROPERTIES PREFIX "../")
ENDIF(MSVC_IDE AND OSG_MSVC_VERSIONED_DLL) ENDIF(MSVC_IDE AND OSG_MSVC_VERSIONED_DLL)
SETUP_LINK_LIBRARIES() SETUP_LINK_LIBRARIES()
@@ -407,19 +341,10 @@ MACRO(HANDLE_MSVC_DLL)
ELSE(${ARGC} GREATER 1) ELSE(${ARGC} GREATER 1)
SET(LIB_SOVERSION ${OPENSCENEGRAPH_SOVERSION}) SET(LIB_SOVERSION ${OPENSCENEGRAPH_SOVERSION})
ENDIF(${ARGC} GREATER 1) ENDIF(${ARGC} GREATER 1)
SET_OUTPUT_DIR_PROPERTY_260(${LIB_NAME} "") # Ensure the /Debug /Release are removed
IF(NOT MSVC_IDE) IF(NOT MSVC_IDE)
IF (NOT CMAKE24) SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../bin/${LIB_PREFIX}${LIB_SOVERSION}-")
BUILDER_VERSION_GREATER(2 8 0) IF (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
IF(NOT VALID_BUILDER_VERSION)
# If CMake < 2.8.1
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../bin/${LIB_PREFIX}${LIB_SOVERSION}-" IMPORT_PREFIX "../")
ELSE(NOT VALID_BUILDER_VERSION)
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "${LIB_PREFIX}${LIB_SOVERSION}-")
ENDIF(NOT VALID_BUILDER_VERSION)
ELSE (NOT CMAKE24)
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../bin/${LIB_PREFIX}${LIB_SOVERSION}-" IMPORT_PREFIX "../")
SET(NEW_LIB_NAME "${OUTPUT_BINDIR}/${LIB_PREFIX}${LIB_SOVERSION}-${LIB_NAME}") SET(NEW_LIB_NAME "${OUTPUT_BINDIR}/${LIB_PREFIX}${LIB_SOVERSION}-${LIB_NAME}")
ADD_CUSTOM_COMMAND( ADD_CUSTOM_COMMAND(
TARGET ${LIB_NAME} TARGET ${LIB_NAME}
@@ -429,19 +354,9 @@ MACRO(HANDLE_MSVC_DLL)
COMMAND ${CMAKE_COMMAND} -E remove "${NEW_LIB_NAME}.lib" COMMAND ${CMAKE_COMMAND} -E remove "${NEW_LIB_NAME}.lib"
COMMAND ${CMAKE_COMMAND} -E remove "${NEW_LIB_NAME}.exp" COMMAND ${CMAKE_COMMAND} -E remove "${NEW_LIB_NAME}.exp"
) )
ENDIF (NOT CMAKE24) ENDIF (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
ELSE(NOT MSVC_IDE) ELSE(NOT MSVC_IDE)
IF (NOT CMAKE24) SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../../bin/${LIB_PREFIX}${LIB_SOVERSION}-" IMPORT_PREFIX "../")
BUILDER_VERSION_GREATER(2 8 0)
IF(NOT VALID_BUILDER_VERSION)
# If CMake < 2.8.1
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../../bin/${LIB_PREFIX}${LIB_SOVERSION}-" IMPORT_PREFIX "../")
ELSE(NOT VALID_BUILDER_VERSION)
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "${LIB_PREFIX}${LIB_SOVERSION}-")
ENDIF(NOT VALID_BUILDER_VERSION)
ELSE (NOT CMAKE24)
SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../../bin/${LIB_PREFIX}${LIB_SOVERSION}-" IMPORT_PREFIX "../")
ENDIF (NOT CMAKE24)
ENDIF(NOT MSVC_IDE) ENDIF(NOT MSVC_IDE)
# SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../../bin/osg${OPENSCENEGRAPH_SOVERSION}-") # SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES PREFIX "../../bin/osg${OPENSCENEGRAPH_SOVERSION}-")

View File

@@ -8,6 +8,6 @@ set(CTEST_PROJECT_NAME "OpenSceneGraph")
set(CTEST_NIGHTLY_START_TIME "00:00:00 CET") set(CTEST_NIGHTLY_START_TIME "00:00:00 CET")
set(CTEST_DROP_METHOD "http") set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "cdash.openscenegraph.org") set(CTEST_DROP_SITE "www.cdash.org")
set(CTEST_DROP_LOCATION "/submit.php?project=OpenSceneGraph") set(CTEST_DROP_LOCATION "/CDashPublic/submit.php?project=OpenSceneGraph")
set(CTEST_DROP_SITE_CDASH TRUE) set(CTEST_DROP_SITE_CDASH TRUE)

430
ChangeLog
View File

@@ -1,433 +1,3 @@
2009-07-28 06:02 robert
* CMakeLists.txt, NEWS.txt, README.txt: Updated dates for 2.8.2
stable release
2009-07-24 12:12 robert
* CTestConfig.cmake: From Jean-Sebastien Guay, updated CTestConfig
to point to new cdash.openscenegraph.org site
2009-07-17 07:50 robert
* src/osgPlugins/jpeg, src/osgPlugins/jpeg/ReaderWriterJPEG.cpp:
From J.P. Delport, "attached a modified jpeg plugin that allows
writing of grayscale images."
2009-07-16 13:30 robert
* ChangeLog, NEWS.txt: Update ChangeLog and NEWS for 2.8.2-rc4
2009-07-16 13:18 robert
* CMakeLists.txt: Updated release candidate number to 4
2009-07-16 12:11 robert
* src/osgPlugins/OpenFlight,
src/osgPlugins/OpenFlight/FltExportVisitor.cpp: From Fabien
Lavignotte, "When exporting some models to OpenFlight, i found a
crash if the texture
unit does not contain a TexEnv object.
Here's the small fix, just a test on the pointer."
Merged from svn trunk using:
svn merge -r 10490:10491
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgPlugins/OpenFlight
2009-07-16 12:06 robert
* src/osgWidget, src/osgWidget/Window.cpp: From Stephane
Lamoliatte, "The vertical anchor is inverted in the
osgWidget::Window::update function.
Here is a small patch to fix that."
2009-07-16 11:52 robert
* examples/osganimationtimeline,
examples/osganimationtimeline/osganimationtimeline.cpp: From
Cedric Pinson, crash fix for osganimationtimeline that was caused
by not checking if nathan.osg test file had be loaded or not.
2009-07-16 11:42 robert
* src/osgPlugins/bsp, src/osgPlugins/bsp/VBSPEntity.cpp,
src/osgPlugins/bsp/VBSPEntity.h,
src/osgPlugins/bsp/VBSPGeometry.cpp,
src/osgPlugins/bsp/VBSPReader.cpp, src/osgPlugins/mdl,
src/osgPlugins/mdl/MDLReader.cpp,
src/osgPlugins/mdl/MDL_README.txt: From Jason Daly, "These are
some fixes to the mdl and bsp plugins to handle transparency and
lighting better, plus a few other tweaks."
2009-07-16 11:09 robert
* src/osgUtil/Optimizer.cpp: From Colin MacDonald, "The Optimizer
Merge Geometry visitor is always merging geometries,
even if they have had DataVariance DYNAMIC explicitly specified.
Then
when an application attempts to dynamically update the geometry
in the
frame loop the primitive sets and data arrays are no longer as
expected, leading to display and/or memory corruption.
Attached is a simple fix."
Note from Robert Osfield, tweaked Colin's changes so that it uses
!= DYNAMIC rather == STATIC in the additional test.
Merged from svn/trunk using:
svn merge -r 10479:10480
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgUtil/Optimizer.cpp
2009-07-14 16:02 robert
* NEWS.txt: Tweaked news
2009-07-14 15:49 robert
* AUTHORS.txt, CMakeLists.txt, ChangeLog, NEWS.txt,
applications/osgversion/Contributors.cpp: Updated contributors,
authors file, news and changelog for 2.8.2-rc3
2009-07-13 16:45 robert
* src/osgViewer, src/osgViewer/GraphicsWindowWin32.cpp: From Cory
Riddell based on suggestion from Robert Osfield, "I've been
running with your suggested changes for a few days now and it
has been working perfectly. I'm still not entirely clear why
adding a
slave/subgraph causes the problem."
2009-07-13 16:07 robert
* src/OpenThreads/win32,
src/OpenThreads/win32/Win32ConditionPrivateData.h: From David
Fries, "Here is a fix for a deadlock seen under Windows using
OpenThreads
Barrier operations. The error is with atomic operations in the
win32 condition implementation. The attached sample program will
reliably trigger with as few as three threads and a dual core
system,
though sometimes it will take 65,000 iterations.
2.8.1 was the base for these changes
Win32ConditionPrivateData.h
Win32ConditionPrivateData::wait does two operations to decrement
waiters_ then read, when InterlockedDecrement decrements and
returns
the value in one operation. The two operations allows another
thread
to also decrement with both getting 0 for an answer.
Win32ConditionPrivateData::broadcast is using waiters_ directly
instead of using the w value read earlier, if it was safe to use
waiters_ directly there would be no need for InterlockedGet or w.
overview of deadlock in barrier with three threads
one thread in broadcast, 2 threads in wait,
release semaphore 2, waits on waiters_done_
both threads wake, decrement waiters_, get 0 for w,
<logic error here>
one calls set waiters_done_,
broadcast thread comes out of waiters_done_,
other thread calls waiters_done_, (which leaves waiters_done_ in
the
signaled state)
<sets the trap>
broadcast thread returns releases mutex, other threads get
mutex and also return,
next barrier, first two threads enter wait, one goes to
broadcast, release
semaphore 2, skips waiters_done_ as it had been released last
time
returns, processes, enters the barrier for the next barrier
operation
and waits,
three threads are now in wait, two have the previous barrier
phase,
one the current phase, there's one count left in the semaphore
which a
thread gets, returns, enters the barrier as a waiter, sleeps, and
the
deadlock is completed"
Merged from svn/trunk using:
svn merge -r 10456:10457
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/OpenThreads/win32
2009-07-03 19:08 robert
* src/osgPlugins/dicom/CMakeLists.txt: From Paul Fotheringham,
fixed linux build error when compiling dicom plugin against ITK
by adding define VCL_CAN_STATIC_CONST_INIT_FLOAT to be zero.
From Robert Osfield, general clean up of CMakeLists.txt under ITK
side
2009-07-01 15:39 robert
* src/osgPlugins/OpenFlight/ExportOptions.cpp: From Bryan Thrall,
"The OpenFlight plugin doesn't handle unrecognized options or
extra
whitespace in all cases, causing it to crash."
2009-06-29 09:50 robert
* NEWS.txt, README.txt: Updated NEWS for and READE for 2.9.2-rc2.
2009-06-29 09:47 robert
* CMakeLists.txt: Updated release candidate to 2
2009-06-29 09:46 robert
* examples/osgshadow/osgshadow.cpp: Made --pssm and --sv options
use SingleThreaded viewer to workaround threading issues with
ParallelSplitShadowMap and ShadowVolume techniques.
2009-06-25 16:08 robert
* NEWS.txt: Updated to NEWS to map to wiki NEWS item
2009-06-25 14:06 robert
* src/osg/ArgumentParser.cpp, src/osg/CullSettings.cpp,
src/osg/DisplaySettings.cpp, src/osgDB/DatabasePager.cpp,
src/osgGA/DriveManipulator.cpp,
src/osgPlugins/bsp/VBSPEntity.cpp,
src/osgPlugins/cfg/ConfigParser.cpp,
src/osgPlugins/dw/ReaderWriterDW.cpp,
src/osgPlugins/ive/DataOutputStream.cpp,
src/osgPlugins/normals/ReaderWriterNormals.cpp,
src/osgPlugins/txp/ReaderWriterTXP.cpp,
src/osgPlugins/txp/TXPParser.cpp,
src/osgViewer/ViewerEventHandlers.cpp: From Mathias Froehlich,
changes from atof to use osg::asciiToFloat() to avoid locale
issues with atof
2009-06-25 13:27 robert
* include/osg, include/osg/Endian: From Mathias Froehlich, "Fix
possible problem with aliasing rules... and fix a gcc warning :)
Use a union to determine if we are on a little endian or big
endian machine."
Merged from svn/trunk using :
svn merge -r 10409:10410
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/include/osg/
2009-06-22 16:04 robert
* src/osgPlugins/txp, src/osgPlugins/txp/trpage_swap.cpp: Fixed
swap size error.
Merged from svn/trunk using:
svn merge -r 10386:10387
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgPlugins/txp/
2009-06-22 09:32 robert
* AUTHORS.txt, ChangeLog, NEWS.txt,
applications/osgversion/Contributors.cpp: Updated NEWS, AUTHORS
and ChangeLog for 2.8.2-rc1 release
2009-06-22 07:42 robert
* src/osgPlugins/osg/StateSet.cpp: Merged from svn/trunk fix to
initGLNames() which addressed thread safety issue
2009-06-20 11:38 robert
* src/osgText/TextBase.cpp: From Farshid Lashkari, "I found a bug
in the osgText library in version 1.2 that I believe still exists
in the latest version.
I found that changing the alignment of a text object does not
work properly if the text contains newline characters. I've
attached a simple test case that shows the problem. If I set the
text AFTER setting the alignment, everything works fine. But if I
set the text BEFORE setting the alignment then the text is
displayed incorrectly.
The fix is very simple. Instead of calling computePositions() in
TextBase::setAlignment(), it calls computeGlyphRepresentation().
I've attached the modified TextBase.cpp."
Merged from svn/trunk using:
svn merge -r 10375:10376
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgText/TextBase.cpp
2009-06-19 11:02 robert
* src/osgViewer, src/osgViewer/CompositeViewer.cpp,
src/osgViewer/GraphicsWindowWin32.cpp, src/osgViewer/Viewer.cpp:
Added clears of input vectors in various get*() methods
2009-06-19 10:44 robert
* ChangeLog: Updated ChangeLog
2009-06-18 08:19 robert
* src/osgManipulator, src/osgManipulator/AntiSquish.cpp: From Rene
Molenaar, "The bug is as described above:
"The dragger's corner tabs are no longer in the corners."
this fix places the cornertabs back in the corners.
(the manipulator does not make sense otherwise)."
2009-06-17 15:10 robert
* CMakeLists.txt: Added CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS
2009-06-17 08:55 robert
* include/osg/DisplaySettings: Fixed error in
DisplaySetting::setNumOfHttpDatabaseThreadsHint()
2009-06-12 09:53 robert
* src/osg/Texture2DArray.cpp: From Konstantin Sinitsyn, "I've fixed
bug with loading of compressed texture to texture array!"
Merged from svn/trunk using:
svn merge -r 10336:10337
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osg
2009-06-08 13:53 robert
* src/osg: From Mathias Froehlich, "Without this change packed
depth stencil attachments are only supported if the
GL_EXT_framebuffer_blit extension is available. This is due to
the early
return from the constructor if this is missing.
As far as I read the standard extension documents, this blit call
is not
required to have packed depth stencil fbos.
The change fixes this and allows packed stencil attachments on
machines
without the multisample blit command."
Merged from svn/trunk using:
svn merge -r 10326:10327
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk
2009-06-08 11:14 robert
* src/osgSim, src/osgSim/Sector.cpp: From Lionel Largade, "this
correction makes the intensity interpolated in the correct
direction when the angle is between _cosFadeAngle and _cosAngle."
Merged from svn/trunk using:
svn merge -r 10320:10321
http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk/src/osgSim
2009-06-06 10:08 robert
* include/osg/Referenced, src/osgUtil/RenderBin.cpp: Introduced
depend_on template and usage in RenderBin.cpp's singleton to
solve crash on exit in static builds.
2009-06-04 19:22 paulmelis
* applications/osgversion/CMakeLists.txt: Fixed incorrect ENDIF()
in applications/osgversion/CMakeLists.txt
(CMake 2.4 complained about this, while 2.6 seems to ignore it)
2009-06-02 14:48 robert
* ChangeLog, NEWS.txt: Update ChangeLog and NEWS
2009-06-02 14:44 robert
* src/osg/Texture2D.cpp: Merged from svn/trunk : "Moved assigned of
texture object to
_textureObjectBuffer to earlier in Texture2D::apply() to prevent
problems with non power of two texture mipmap generation."
2009-06-02 14:42 robert
* ChangeLog, NEWS.txt: Updated ChangeLog and NEWS.txt in prep for
2.8.2
2009-06-02 09:23 robert
* CMakeLists.txt, include/osg/Version: Updated version numbers for
2.8.2 release
2009-06-02 09:20 robert
* src/osg/GraphicsContext.cpp: Merged from svn/trunk : "Fixed
handling of case where the
master and the slave camera are placed on the same
GraphisContext, or when the master camera and slave camera are
assigned to different Camers. Note normally one doesn't mix
master with GraphicsContexts and slave cameras so neither case is
common."
2009-06-02 09:17 robert
* src/osgParticle/ParticleSystemUpdater.cpp: Merged from svn/trunk:
"Added initializer of ParticleSystemUpdater::_frameNumber"
2009-06-02 09:16 robert
* src/osgViewer/GraphicsWindowX11.cpp: Merged from svn/trunk two
submissions:
"Refactored the adaption of X11 key symbols into OSG key events
to fix problems with handling wide range of locales."
From Mathias Froehlich, "This frees some memory that is allocated
by the X11 functions."
2009-06-02 09:15 robert
* src/osgUtil/GLObjectsVisitor.cpp: Merged from svn/trunk.
2009-06-02 09:14 robert
* src/osg/Transform.cpp: From Emmanuel Roche, "I've also updated
the computeBound() method from the osg::Transform class : this
method was using float based temporary variables and thus the
double precision is lost here. I've changed that to use the
generic types osg::BoundingSphere::vec_type and
osg::BoundingSphere::value_type instead."
Merged from svn/trunk.
2009-05-27 12:11 robert
* src/osgUtil/RenderStage.cpp: Fixed glStencilMask setting.
2009-05-25 16:36 robert
* src/osgViewer/GraphicsWindowX11.cpp: Refactored the
GraphicsWindowX11::adaptKey() implementation so that it always
uses the reampX11Key(ks) method, and for the mapping to handle
case correctly. Merged from svn/trunk revision.
2009-05-19 16:21 robert
* AUTHORS.txt: Updated AUTHORS file to 2.8.1 release
2009-05-19 16:08 robert
* ChangeLog: Updated ChangeLog for 2.8.1 release
2009-05-19 16:05 robert 2009-05-19 16:05 robert
* CMakeLists.txt, NEWS.txt, README.txt: Updated dates and reset * CMakeLists.txt, NEWS.txt, README.txt: Updated dates and reset

117
NEWS.txt
View File

@@ -1,123 +1,6 @@
OSG News OSG News
======== ========
= !OpenSceneGraph 2.8.2 release - bug fix release =
PERTHSHIRE, Scotland - 28th July 2009 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 2.8.2, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 2.8 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 2.8 runs on all Microsoft Windows platforms, Apple OS/X, GNU/Linux, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.
=== Open-source development delivers industry-leading features and performance ===
The !OpenSceneGraph 2.8.2 release is the culmination of 10 years of work by the lead developers and the open-source community that has grown up around the project. The real-time graphics industry and academia embraced it from the very beginning, deploying it in real-world applications, and actively participating in its development, testing and refinement. The end result is a high-quality library with a feature set relevant to application developers' needs.
=== Updates between 2.8.2 and 2.8.1 releases include: ===
* Build fixes for:
* !RedHat Enterprise Linux
* Building of dicom plugin with ITK under Linux
* Crash fixes to:
* crash during window destruction under Windows when using closing a MFC based !GraphicsWindow
* deadlock under Windows due threading issues with atomic operations in Win32 Barrier implementation
* !OpenFlight plugin crashed due to not handling spaces at the end of option strings
* !OpenFlight plugin crashed when exported scene graphs contain no TexEnv objects
* osganimationtimeline crashed when example model was not found
* Bug fixes to :
* vertical anchor in osgWidget::Widow was inverted
* bsp an mdl plugins to better handling transparency and lighting
* computation of sector range in osgSim::!LightPoint
* extension checking of FBO packed stencil support
* position of tabs at corners of manipulators
* threading bug in .osg plugin that occurred during multi-threaded initialization
* alignment of Text what setting alignment after assign text string
* loading of compressed texture arrays
* texture generate mipmap for non power of two textures
* regression in X11 key symbol remapping, improved support for Russian keyboards
* regression of !StencilMask setting in !RenderStage
* small memory leak in X11 usage
* Transform::computeBound() double !BoundingSphere support
* Resize handling when master and slave Cameras share the same !GraphicsContext
* Handling of locale in plugins and env var parsing so it always follows the '.' decimal place convention regardless of the desktop/application locale.
=== Updates between 2.8.1 and 2.8.0 releases include: ===
* Build fixes under FreeBSD and IBM AIX, and RedHat Enterprise Linux
* Improved compatibility with SWIG wrapper building
* Crash fixes in osg::State, osg::Geometry and osgWidget
* Bug fixes to :
* draw instanced support
* Optimizer - MergeGeometryVisitor, RemoveLoadedProxyNodesVisitor and SpatializeGroupsVistor
* hdr image loader
* handling of opacity maps in 3ds loader
* dxf loader
* frame buffer object
* cursor/event handling in windows
* windows threading
* memory leak in Collada loader
* fixes to display lists/vbo creation that prevent crash under ATI drivers
* subface PolygonOffset setting in OpenFlight
* osgconv --formats under OSX
* osgTerrain::Layer bounding volume calculation
=== Updates between 2.8 and 2.6 include: ===
* New osgVolume library for volume rendering, with support for:
* High quality GPU based Ray tracing
* Transfer functions
* Per pixel lighting
* Iso surface rendering
* Maximum Intensity Projection rendering
* Non-power-of-two 3D textures, and 3D texture compression
* DICOM loading for reading dicom medical data
* New osgAnimation library for character and scene animation.
* New plugin for reading Biovision hierarchical files (.BVH) to generate character motion animations.
* New osgShadow support for Light Space Perspective Shadow Maps (LispSM).
* Three new scene graph widgets for placing traditional 2D capability into fully interactive 3D scenes:
* PDF widget (based on libPoppler)
* VNC client widget (based on libVNCServer)
* Internet browser client widget (based on Gecko/UBrowser)
* New plugins for loading Half-Life 2 maps and models.
* New plugin for loading EXR, high dynamic range imagery
* Improvements to !DatabasePager, tailored for low latency paging.
* Improved runtime stats collection and on screen reporting.
* Performance improvements through optimization of matrix operations.
* Support for the OpenGL "draw instanced" extension.
* Support for zlib compressed native .ive and .gz files
* Improvements to COLLADA support.
* Build reporting using CDash
* New packaging support using CPack
* A wide range of build and bug fixes
=== Downloads and Licensing ===
!OpenSceneGraph is open-source, so full source code is provided, and can be copied, modified and used free of charge for commercial and non-commercial use. Access to the source allows end users greater flexibility in how they develop, debug and deploy their applications. They gain productivity and freedom by being able to leverage the tool chain in accordance with their own release cycles. Downloads of binaries and source can be found in the [http://www.openscenegraph.org/projects/osg/wiki/Downloads Downloads] section of the openscenegraph.org website.
!OpenSceneGraph is released under the [http://www.openscenegraph.org/projects/osg/wiki/Legal OpenSceneGraph Public License], which is based on the Lesser GNU Public License (LGPL), permitting the software to be used free of charge across the full spectrum of commercial and open-source applications. Furthermore, it allows both static and dynamic linking of the !OpenSceneGraph libraries without restricting the licensing of the user's software.
=== !OpenSceneGraph Books now available ===
The !OpenSceneGraph Quick Start Guide is now available in Chinese as well as English, and alongside the Reference Manual, books can be found at [http://www.osgbooks.com OsgBooks].
=== Professional support and services ===
!OpenSceneGraph project is backed up with professional services by [http://www.openscenegraph.com OpenSceneGraph Professional Services], based in Scotland, and [http://www.skew-matrix.com Skew-Matrix] and [http://www.blue-newt.com Blue-Newt Software] both based in the USA, and a range of [wiki:Community/Contractors Contractors] from around the world. Services available include:
* Confidential Professional Support
* Bespoke development
* Consultancy
* Training
=== Community support and contributions ===
The diverse and growing community of over 2000 developers is centred around the public osg-users mailing list, where members discuss how best to use !OpenSceneGraph, provide mutual support, and coordinate development of new features and bug fixes. Members of this community come from many different countries with backgrounds ranging from some of the world's largest aerospace companies, game companies, and visual simulation specialists to university researchers, students and hobbyists.
The !OpenSceneGraph project owes a great deal to the community for its development and support, in particular we wish to thank the [http://www.openscenegraph.org/projects/osg/wiki/Support/Contributors/TwoPointEight 365 individuals] from around the world that have directly contributed to the development and refinement of the !OpenSceneGraph code base.
----
About !OpenSceneGraph: [[BR]]
The !OpenSceneGraph Project was founded in September 1999 by Don Burns and Robert Osfield.
Further information, screenshots, downloads, documentation, and support links can be found on the !OpenSceneGraph project website http://www.openscenegraph.org.
About !OpenSceneGraph Professional Services:[[BR]]
!OpenSceneGraph Professional Services, founded by project lead Robert Osfield in April 2001, is based in Callander, Perhshire, Scotland, and provides professional services on top of !OpenSceneGraph. Further information about the services it provides can be found at http://www.openscenegraph.com.
----------------------------------------------------------------------------------------
= !OpenSceneGraph 2.8.1 release - bug fix release = = !OpenSceneGraph 2.8.1 release - bug fix release =
PERTHSHIRE, Scotland - 19th May 2009 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 2.8.1, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 2.8 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 2.8 runs on all Microsoft Windows platforms, Apple OS/X, GNU/Linux, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems. PERTHSHIRE, Scotland - 19th May 2009 - !OpenSceneGraph Professional Services announces the release of !OpenSceneGraph 2.8.1, the industry's leading open-source scene graph technology, designed to accelerate application development and improve 3D graphics performance. !OpenSceneGraph 2.8 written entirely in Standard C++ and built upon OpenGL, offers developers working in the visual simulation, game development, virtual reality, scientific visualization and modeling markets - a real-time visualization tool which eclipses commercial scene graph toolkits in functionality, stability and performance. !OpenSceneGraph 2.8 runs on all Microsoft Windows platforms, Apple OS/X, GNU/Linux, IRIX, Solaris, HP-UX, AIX and FreeBSD operating systems.

View File

@@ -14,7 +14,7 @@ subscribe to our public mailing list:
Robert Osfield. Robert Osfield.
Project Lead. Project Lead.
28th July 2009. 19th May 2009.
-- --

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>OpenThreads</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>org.OpenThreads.OpenThreads</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>2.2.0</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,449 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 42;
objects = {
/* Begin PBXBuildFile section */
00DAF8AA0BBE1A0E00EFEB98 /* Block in Headers */ = {isa = PBXBuildFile; fileRef = 00DAF8A70BBE1A0E00EFEB98 /* Block */; settings = {ATTRIBUTES = (Public, ); }; };
00DAF8AB0BBE1A0F00EFEB98 /* ReadWriteMutex in Headers */ = {isa = PBXBuildFile; fileRef = 00DAF8A80BBE1A0E00EFEB98 /* ReadWriteMutex */; settings = {ATTRIBUTES = (Public, ); }; };
00DAF8AC0BBE1A0F00EFEB98 /* ReentrantMutex in Headers */ = {isa = PBXBuildFile; fileRef = 00DAF8A90BBE1A0E00EFEB98 /* ReentrantMutex */; settings = {ATTRIBUTES = (Public, ); }; };
8D07F2BE0486CC7A007CD1D0 /* OpenThreads_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 32BAE0B70371A74B00C91783 /* OpenThreads_Prefix.pch */; };
8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; };
8D07F2C40486CC7A007CD1D0 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08FB77AAFE841565C02AAC07 /* Carbon.framework */; };
BE11833405D6FE3900EB53E5 /* PThreadBarrierPrivateData.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11832C05D6FE3800EB53E5 /* PThreadBarrierPrivateData.h */; };
BE11833605D6FE3900EB53E5 /* PThreadConditionPrivateData.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11832E05D6FE3800EB53E5 /* PThreadConditionPrivateData.h */; };
BE11833805D6FE3900EB53E5 /* PThreadMutexPrivateData.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11833005D6FE3800EB53E5 /* PThreadMutexPrivateData.h */; };
BE11833905D6FE3900EB53E5 /* PThreadPrivateData.h in Headers */ = {isa = PBXBuildFile; fileRef = BE11833105D6FE3800EB53E5 /* PThreadPrivateData.h */; };
BE11835105D7022C00EB53E5 /* PThread.c++ in Sources */ = {isa = PBXBuildFile; fileRef = BE11832A05D6FE3800EB53E5 /* PThread.c++ */; };
BE11835205D7022C00EB53E5 /* PThreadBarrier.c++ in Sources */ = {isa = PBXBuildFile; fileRef = BE11832B05D6FE3800EB53E5 /* PThreadBarrier.c++ */; };
BE11835405D7022C00EB53E5 /* PThreadCondition.c++ in Sources */ = {isa = PBXBuildFile; fileRef = BE11832D05D6FE3800EB53E5 /* PThreadCondition.c++ */; };
BE11835605D7022C00EB53E5 /* PThreadMutex.c++ in Sources */ = {isa = PBXBuildFile; fileRef = BE11832F05D6FE3800EB53E5 /* PThreadMutex.c++ */; };
BE11837D05D7083B00EB53E5 /* Barrier in Headers */ = {isa = PBXBuildFile; fileRef = BE11836E05D7082A00EB53E5 /* Barrier */; settings = {ATTRIBUTES = (Public, ); }; };
BE11837E05D7083B00EB53E5 /* Condition in Headers */ = {isa = PBXBuildFile; fileRef = BE11836F05D7082A00EB53E5 /* Condition */; settings = {ATTRIBUTES = (Public, ); }; };
BE11837F05D7083B00EB53E5 /* Exports in Headers */ = {isa = PBXBuildFile; fileRef = BE11837005D7082A00EB53E5 /* Exports */; settings = {ATTRIBUTES = (Public, ); }; };
BE11838005D7083B00EB53E5 /* Mutex in Headers */ = {isa = PBXBuildFile; fileRef = BE11837105D7082A00EB53E5 /* Mutex */; settings = {ATTRIBUTES = (Public, ); }; };
BE11838105D7083B00EB53E5 /* ScopedLock in Headers */ = {isa = PBXBuildFile; fileRef = BE11837205D7082A00EB53E5 /* ScopedLock */; settings = {ATTRIBUTES = (Public, ); }; };
BE11838205D7083B00EB53E5 /* Thread in Headers */ = {isa = PBXBuildFile; fileRef = BE11837305D7082A00EB53E5 /* Thread */; settings = {ATTRIBUTES = (Public, ); }; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
00DAF8A70BBE1A0E00EFEB98 /* Block */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = Block; path = ../../include/OpenThreads/Block; sourceTree = SOURCE_ROOT; };
00DAF8A80BBE1A0E00EFEB98 /* ReadWriteMutex */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = ReadWriteMutex; path = ../../include/OpenThreads/ReadWriteMutex; sourceTree = SOURCE_ROOT; };
00DAF8A90BBE1A0E00EFEB98 /* ReentrantMutex */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = ReentrantMutex; path = ../../include/OpenThreads/ReentrantMutex; sourceTree = SOURCE_ROOT; };
089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
08FB77AAFE841565C02AAC07 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
32BAE0B70371A74B00C91783 /* OpenThreads_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenThreads_Prefix.pch; sourceTree = SOURCE_ROOT; };
8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D07F2C80486CC7A007CD1D0 /* OpenThreads.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenThreads.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BE11832A05D6FE3800EB53E5 /* PThread.c++ */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = "PThread.c++"; path = "../../src/OpenThreads/pthreads/PThread.c++"; sourceTree = SOURCE_ROOT; };
BE11832B05D6FE3800EB53E5 /* PThreadBarrier.c++ */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = "PThreadBarrier.c++"; path = "../../src/OpenThreads/pthreads/PThreadBarrier.c++"; sourceTree = SOURCE_ROOT; };
BE11832C05D6FE3800EB53E5 /* PThreadBarrierPrivateData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PThreadBarrierPrivateData.h; path = ../../src/OpenThreads/pthreads/PThreadBarrierPrivateData.h; sourceTree = SOURCE_ROOT; };
BE11832D05D6FE3800EB53E5 /* PThreadCondition.c++ */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = "PThreadCondition.c++"; path = "../../src/OpenThreads/pthreads/PThreadCondition.c++"; sourceTree = SOURCE_ROOT; };
BE11832E05D6FE3800EB53E5 /* PThreadConditionPrivateData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PThreadConditionPrivateData.h; path = ../../src/OpenThreads/pthreads/PThreadConditionPrivateData.h; sourceTree = SOURCE_ROOT; };
BE11832F05D6FE3800EB53E5 /* PThreadMutex.c++ */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = "PThreadMutex.c++"; path = "../../src/OpenThreads/pthreads/PThreadMutex.c++"; sourceTree = SOURCE_ROOT; };
BE11833005D6FE3800EB53E5 /* PThreadMutexPrivateData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PThreadMutexPrivateData.h; path = ../../src/OpenThreads/pthreads/PThreadMutexPrivateData.h; sourceTree = SOURCE_ROOT; };
BE11833105D6FE3800EB53E5 /* PThreadPrivateData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PThreadPrivateData.h; path = ../../src/OpenThreads/pthreads/PThreadPrivateData.h; sourceTree = SOURCE_ROOT; };
BE11836E05D7082A00EB53E5 /* Barrier */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 30; name = Barrier; path = ../../include/OpenThreads/Barrier; sourceTree = SOURCE_ROOT; };
BE11836F05D7082A00EB53E5 /* Condition */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 30; name = Condition; path = ../../include/OpenThreads/Condition; sourceTree = SOURCE_ROOT; };
BE11837005D7082A00EB53E5 /* Exports */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 30; name = Exports; path = ../../include/OpenThreads/Exports; sourceTree = SOURCE_ROOT; };
BE11837105D7082A00EB53E5 /* Mutex */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 30; name = Mutex; path = ../../include/OpenThreads/Mutex; sourceTree = SOURCE_ROOT; };
BE11837205D7082A00EB53E5 /* ScopedLock */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 30; name = ScopedLock; path = ../../include/OpenThreads/ScopedLock; sourceTree = SOURCE_ROOT; };
BE11837305D7082A00EB53E5 /* Thread */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; fileEncoding = 30; name = Thread; path = ../../include/OpenThreads/Thread; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8D07F2C30486CC7A007CD1D0 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8D07F2C40486CC7A007CD1D0 /* Carbon.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
034768DDFF38A45A11DB9C8B /* Products */ = {
isa = PBXGroup;
children = (
8D07F2C80486CC7A007CD1D0 /* OpenThreads.framework */,
);
name = Products;
sourceTree = "<group>";
};
0867D691FE84028FC02AAC07 /* OpenThreads */ = {
isa = PBXGroup;
children = (
BE11833F05D7005800EB53E5 /* Header */,
08FB77ACFE841707C02AAC07 /* Source */,
089C1665FE841158C02AAC07 /* Resources */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
034768DDFF38A45A11DB9C8B /* Products */,
);
name = OpenThreads;
sourceTree = "<group>";
};
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
08FB77AAFE841565C02AAC07 /* Carbon.framework */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
};
089C1665FE841158C02AAC07 /* Resources */ = {
isa = PBXGroup;
children = (
8D07F2C70486CC7A007CD1D0 /* Info.plist */,
089C1666FE841158C02AAC07 /* InfoPlist.strings */,
);
name = Resources;
sourceTree = "<group>";
};
08FB77ACFE841707C02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
BE11832A05D6FE3800EB53E5 /* PThread.c++ */,
BE11832B05D6FE3800EB53E5 /* PThreadBarrier.c++ */,
BE11832C05D6FE3800EB53E5 /* PThreadBarrierPrivateData.h */,
BE11832D05D6FE3800EB53E5 /* PThreadCondition.c++ */,
BE11832E05D6FE3800EB53E5 /* PThreadConditionPrivateData.h */,
BE11832F05D6FE3800EB53E5 /* PThreadMutex.c++ */,
BE11833005D6FE3800EB53E5 /* PThreadMutexPrivateData.h */,
BE11833105D6FE3800EB53E5 /* PThreadPrivateData.h */,
32BAE0B70371A74B00C91783 /* OpenThreads_Prefix.pch */,
);
name = Source;
sourceTree = "<group>";
};
BE11833F05D7005800EB53E5 /* Header */ = {
isa = PBXGroup;
children = (
BE11835905D7027D00EB53E5 /* OpenThreads */,
);
name = Header;
sourceTree = "<group>";
};
BE11835905D7027D00EB53E5 /* OpenThreads */ = {
isa = PBXGroup;
children = (
BE11836E05D7082A00EB53E5 /* Barrier */,
00DAF8A70BBE1A0E00EFEB98 /* Block */,
BE11836F05D7082A00EB53E5 /* Condition */,
BE11837005D7082A00EB53E5 /* Exports */,
BE11837105D7082A00EB53E5 /* Mutex */,
00DAF8A80BBE1A0E00EFEB98 /* ReadWriteMutex */,
00DAF8A90BBE1A0E00EFEB98 /* ReentrantMutex */,
BE11837205D7082A00EB53E5 /* ScopedLock */,
BE11837305D7082A00EB53E5 /* Thread */,
);
name = OpenThreads;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
8D07F2BD0486CC7A007CD1D0 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
00DAF8AA0BBE1A0E00EFEB98 /* Block in Headers */,
00DAF8AB0BBE1A0F00EFEB98 /* ReadWriteMutex in Headers */,
00DAF8AC0BBE1A0F00EFEB98 /* ReentrantMutex in Headers */,
BE11837D05D7083B00EB53E5 /* Barrier in Headers */,
BE11837E05D7083B00EB53E5 /* Condition in Headers */,
BE11837F05D7083B00EB53E5 /* Exports in Headers */,
BE11838005D7083B00EB53E5 /* Mutex in Headers */,
BE11838105D7083B00EB53E5 /* ScopedLock in Headers */,
BE11838205D7083B00EB53E5 /* Thread in Headers */,
8D07F2BE0486CC7A007CD1D0 /* OpenThreads_Prefix.pch in Headers */,
BE11833405D6FE3900EB53E5 /* PThreadBarrierPrivateData.h in Headers */,
BE11833605D6FE3900EB53E5 /* PThreadConditionPrivateData.h in Headers */,
BE11833805D6FE3900EB53E5 /* PThreadMutexPrivateData.h in Headers */,
BE11833905D6FE3900EB53E5 /* PThreadPrivateData.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
8D07F2BC0486CC7A007CD1D0 /* OpenThreads */ = {
isa = PBXNativeTarget;
buildConfigurationList = 0011012F0873634F0015C576 /* Build configuration list for PBXNativeTarget "OpenThreads" */;
buildPhases = (
8D07F2BD0486CC7A007CD1D0 /* Headers */,
8D07F2BF0486CC7A007CD1D0 /* Resources */,
8D07F2C10486CC7A007CD1D0 /* Sources */,
8D07F2C30486CC7A007CD1D0 /* Frameworks */,
8D07F2C50486CC7A007CD1D0 /* Rez */,
);
buildRules = (
);
dependencies = (
);
name = OpenThreads;
productInstallPath = "$(HOME)/Library/Frameworks";
productName = OpenThreads;
productReference = 8D07F2C80486CC7A007CD1D0 /* OpenThreads.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 001101330873634F0015C576 /* Build configuration list for PBXProject "OpenThreads" */;
hasScannedForEncodings = 1;
mainGroup = 0867D691FE84028FC02AAC07 /* OpenThreads */;
productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
projectDirPath = "";
targets = (
8D07F2BC0486CC7A007CD1D0 /* OpenThreads */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8D07F2BF0486CC7A007CD1D0 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXRezBuildPhase section */
8D07F2C50486CC7A007CD1D0 /* Rez */ = {
isa = PBXRezBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXRezBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8D07F2C10486CC7A007CD1D0 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
BE11835105D7022C00EB53E5 /* PThread.c++ in Sources */,
BE11835205D7022C00EB53E5 /* PThreadBarrier.c++ in Sources */,
BE11835405D7022C00EB53E5 /* PThreadCondition.c++ in Sources */,
BE11835605D7022C00EB53E5 /* PThreadMutex.c++ in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
089C1666FE841158C02AAC07 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
089C1667FE841158C02AAC07 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
001101300873634F0015C576 /* Development */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = NO;
DEBUGGING_SYMBOLS = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_ENABLE_TRIGRAPHS = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = OpenThreads_Prefix.pch;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
GCC_WARN_UNKNOWN_PRAGMAS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
LIBRARY_STYLE = Dynamic;
MACH_O_TYPE = mh_dylib;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = (
"-seg1addr",
0x1FF00000,
);
PRODUCT_NAME = OpenThreads;
SECTORDER_FLAGS = "";
SYMROOT = ../OpenSceneGraph/build;
WARNING_CFLAGS = (
"-Wmost",
"-Wno-four-char-constants",
"-Wno-unknown-pragmas",
);
WRAPPER_EXTENSION = framework;
ZERO_LINK = YES;
};
name = Development;
};
001101310873634F0015C576 /* Deployment */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_ENABLE_TRIGRAPHS = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = OpenThreads_Prefix.pch;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
GCC_WARN_UNKNOWN_PRAGMAS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
LIBRARY_STYLE = Dynamic;
MACH_O_TYPE = mh_dylib;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = (
"-seg1addr",
0x1FF00000,
);
PRODUCT_NAME = OpenThreads;
SECTORDER_FLAGS = "";
STRIP_INSTALLED_PRODUCT = YES;
WARNING_CFLAGS = (
"-Wmost",
"-Wno-four-char-constants",
"-Wno-unknown-pragmas",
);
WRAPPER_EXTENSION = framework;
ZERO_LINK = NO;
};
name = Deployment;
};
001101320873634F0015C576 /* Default */ = {
isa = XCBuildConfiguration;
buildSettings = {
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_ENABLE_TRIGRAPHS = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = OpenThreads_Prefix.pch;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
GCC_WARN_UNKNOWN_PRAGMAS = NO;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
LIBRARY_STYLE = Dynamic;
MACH_O_TYPE = mh_dylib;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = (
"-seg1addr",
0x1FF00000,
);
PRODUCT_NAME = OpenThreads;
SECTORDER_FLAGS = "";
WARNING_CFLAGS = (
"-Wmost",
"-Wno-four-char-constants",
"-Wno-unknown-pragmas",
);
WRAPPER_EXTENSION = framework;
};
name = Default;
};
001101340873634F0015C576 /* Development */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
);
GCC_AUTO_VECTORIZATION = YES;
GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
HEADER_SEARCH_PATHS = (
../../include,
"$(inherited)",
);
PREBINDING = NO;
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
STRIP_STYLE = "non-global";
};
name = Development;
};
001101350873634F0015C576 /* Deployment */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
);
DEPLOYMENT_POSTPROCESSING = YES;
GCC_AUTO_VECTORIZATION = YES;
GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = s;
HEADER_SEARCH_PATHS = ../../include;
PREBINDING = NO;
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
STRIP_STYLE = "non-global";
};
name = Deployment;
};
001101360873634F0015C576 /* Default */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
);
GCC_AUTO_VECTORIZATION = YES;
GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 3;
HEADER_SEARCH_PATHS = ../../include;
PREBINDING = NO;
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
STRIP_STYLE = "non-global";
};
name = Default;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
0011012F0873634F0015C576 /* Build configuration list for PBXNativeTarget "OpenThreads" */ = {
isa = XCConfigurationList;
buildConfigurations = (
001101300873634F0015C576 /* Development */,
001101310873634F0015C576 /* Deployment */,
001101320873634F0015C576 /* Default */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Default;
};
001101330873634F0015C576 /* Build configuration list for PBXProject "OpenThreads" */ = {
isa = XCConfigurationList;
buildConfigurations = (
001101340873634F0015C576 /* Development */,
001101350873634F0015C576 /* Deployment */,
001101360873634F0015C576 /* Default */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Default;
};
/* End XCConfigurationList section */
};
rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
}

View File

@@ -0,0 +1,5 @@
//
// Prefix header for all source files of the 'OpenThreads' target in the 'OpenThreads' project.
//
//#include <Carbon/Carbon.h>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildVersion</key>
<string>38</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>ProjectName</key>
<string>CarbonProjectTemplates</string>
<key>SourceVersion</key>
<string>140000</string>
</dict>
</plist>

View File

@@ -12,7 +12,6 @@ OrientationConverter::OrientationConverter( void )
R.makeIdentity(); R.makeIdentity();
T.makeIdentity(); T.makeIdentity();
_trans_set = false; _trans_set = false;
_use_world_frame = false;
S.makeIdentity(); S.makeIdentity();
} }
@@ -37,35 +36,21 @@ void OrientationConverter::setScale( const Vec3 &scale )
S = Matrix::scale(scale); S = Matrix::scale(scale);
} }
void OrientationConverter::useWorldFrame( bool worldFrame )
{
_use_world_frame = worldFrame;
}
Node* OrientationConverter::convert( Node *node ) Node* OrientationConverter::convert( Node *node )
{ {
// Order of operations here is : // Order of operations here is :
// 1. If world frame option not set, translate to world origin (0,0,0) // 1. Translate to world origin (0,0,0)
// 2. Rotate to new orientation // 2. Rotate to new orientation
// 3. Scale in new orientation coordinates // 3. Scale in new orientation coordinates
// 4. If an absolute translation was specified then // 4. If an absolute translation was specified then
// - translate to absolute translation in world coordinates // - translate to absolute translation in world coordinates
// else if world frame option not set, // else
// - translate back to model's original origin. // - translate back to model's original origin.
BoundingSphere bs = node->getBound(); BoundingSphere bs = node->getBound();
Matrix C; Matrix C = Matrix::translate( -bs.center() );
if( _trans_set == false )
if (_use_world_frame) T = Matrix::translate( bs.center() );
{
C.makeIdentity();
}
else
{
C = Matrix::translate( -bs.center() );
if( !_trans_set )
T = Matrix::translate( bs.center() );
}
osg::Group* root = new osg::Group; osg::Group* root = new osg::Group;
osg::MatrixTransform* transform = new osg::MatrixTransform; osg::MatrixTransform* transform = new osg::MatrixTransform;

View File

@@ -14,7 +14,6 @@ class OrientationConverter {
void setRotation( float degrees, const osg::Vec3 &axis ); void setRotation( float degrees, const osg::Vec3 &axis );
void setTranslation( const osg::Vec3 &trans); void setTranslation( const osg::Vec3 &trans);
void setScale( const osg::Vec3 &trans); void setScale( const osg::Vec3 &trans);
void useWorldFrame( bool worldFrame );
/** return the root of the updated subgraph as the subgraph /** return the root of the updated subgraph as the subgraph
* the node passed in my flatten during optimization.*/ * the node passed in my flatten during optimization.*/
@@ -26,7 +25,6 @@ class OrientationConverter {
osg::Matrix R, T, S; osg::Matrix R, T, S;
bool _trans_set; bool _trans_set;
bool _use_world_frame;
}; };
#endif #endif

View File

@@ -428,14 +428,12 @@ static void usage( const char *prog, const char *msg )
osg::notify(osg::NOTICE)<<" --compressed-dxt3 - Enable the usage of S3TC DXT3 compressed textures"<< std::endl; osg::notify(osg::NOTICE)<<" --compressed-dxt3 - Enable the usage of S3TC DXT3 compressed textures"<< std::endl;
osg::notify(osg::NOTICE)<<" --compressed-dxt5 - Enable the usage of S3TC DXT5 compressed textures"<< std::endl; osg::notify(osg::NOTICE)<<" --compressed-dxt5 - Enable the usage of S3TC DXT5 compressed textures"<< std::endl;
osg::notify(osg::NOTICE)<< std::endl; osg::notify(osg::NOTICE)<< std::endl;
osg::notify(osg::NOTICE)<<" --fix-transparency - fix statesets which are currently"<< std::endl; osg::notify(osg::NOTICE)<<" --fix-transparency - fix stateset which are curerntly declared as transprent,"<< std::endl;
osg::notify(osg::NOTICE)<<" declared as transparent, but should be opaque."<< std::endl; osg::notify(osg::NOTICE)<<" but should be opaque. Defaults to using the "<< std::endl;
osg::notify(osg::NOTICE)<<" Defaults to using the fixTranspancyMode"<< std::endl; osg::notify(osg::NOTICE)<<" fixTranspancyMode MAKE_OPAQUE_TEXTURE_STATESET_OPAQUE."<< std::endl;
osg::notify(osg::NOTICE)<<" MAKE_OPAQUE_TEXTURE_STATESET_OPAQUE."<< std::endl; osg::notify(osg::NOTICE)<<" --fix-transparency-mode <mode_string> - fix stateset which are curerntly declared as"<< std::endl;
osg::notify(osg::NOTICE)<<" --fix-transparency-mode <mode_string> - fix statesets which are currently"<< std::endl; osg::notify(osg::NOTICE)<<" transprent but should be opaque. The mode_string determines"<< std::endl;
osg::notify(osg::NOTICE)<<" declared as transparent but should be opaque."<< std::endl; osg::notify(osg::NOTICE)<<" algorithm is used to fix the transparency, options are: "<< std::endl;
osg::notify(osg::NOTICE)<<" The mode_string determines which algorithm is used"<< std::endl;
osg::notify(osg::NOTICE)<<" to fix the transparency, options are:"<< std::endl;
osg::notify(osg::NOTICE)<<" MAKE_OPAQUE_TEXTURE_STATESET_OPAQUE,"<<std::endl; osg::notify(osg::NOTICE)<<" MAKE_OPAQUE_TEXTURE_STATESET_OPAQUE,"<<std::endl;
osg::notify(osg::NOTICE)<<" MAKE_ALL_STATESET_OPAQUE."<<std::endl; osg::notify(osg::NOTICE)<<" MAKE_ALL_STATESET_OPAQUE."<<std::endl;
@@ -459,11 +457,10 @@ static void usage( const char *prog, const char *msg )
"\n" "\n"
" where X1,Y1,Z1 represent the UP vector in the input\n" " where X1,Y1,Z1 represent the UP vector in the input\n"
" files and X2,Y2,Z2 represent the UP vector of the\n" " files and X2,Y2,Z2 represent the UP vector of the\n"
" output file, or degrees is the rotation angle in\n" " output file, or degrees is the rotation angle in degrees\n"
" degrees around axis (A0,A1,A2). For example, to\n" " around axis (A0,A1,A2). For example, to convert a model\n"
" convert a model built in a Y-Up coordinate system to a\n" " built in a Y-Up coordinate system to a model with a Z-up\n"
" model with a Z-up coordinate system, the argument may\n" " coordinate system, the argument may look like\n"
" look like\n"
"\n" "\n"
" 0,1,0-0,0,1" " 0,1,0-0,0,1"
"\n" "\n"
@@ -478,14 +475,9 @@ static void usage( const char *prog, const char *msg )
" where X, Y, and Z represent the coordinates of the\n" " where X, Y, and Z represent the coordinates of the\n"
" absolute position in world space\n" " absolute position in world space\n"
<< std::endl; << std::endl;
osg::notify(osg::NOTICE)<<" --use-world-frame - Perform transformations in the world frame, rather\n" osg::notify(osg::NOTICE)<<" --simplify n - Run simplifier on prior to output. Argument must be a" << std::endl
" than relative to the center of the bounding sphere.\n" <<" normalized value for the resultant percentage reduction." << std::endl
<< std::endl; <<" Example: --simplify .5 will produce an 50 reduced model." << std::endl
osg::notify(osg::NOTICE)<<" --simplify n - Run simplifier prior to output. Argument must be a" << std::endl
<<" normalized value for the resultant percentage" << std::endl
<<" reduction." << std::endl
<<" Example: --simplify .5" << std::endl
<<" will produce a 50% reduced model." << std::endl
<< std::endl; << std::endl;
osg::notify(osg::NOTICE)<<" -s scale - Scale size of model. Scale argument must be the \n" osg::notify(osg::NOTICE)<<" -s scale - Scale size of model. Scale argument must be the \n"
" following :\n" " following :\n"
@@ -493,26 +485,25 @@ static void usage( const char *prog, const char *msg )
" SX,SY,SZ\n" " SX,SY,SZ\n"
"\n" "\n"
" where SX, SY, and SZ represent the scale factors\n" " where SX, SY, and SZ represent the scale factors\n"
" Caution: Scaling is done in destination orientation\n" " Caution: Scaling will be done in destination orientation\n"
<< std::endl; << std::endl;
osg::notify(osg::NOTICE)<<" --smooth - Smooth the surface by regenerating surface normals on\n" osg::notify(osg::NOTICE)<<" --smooth - Smooth the surface by regenerating surface normals on\n"
" all geometry nodes"<< std::endl; " all geometry"<< std::endl;
osg::notify(osg::NOTICE)<<" --addMissingColors - Add a white color value to all geometry nodes\n" osg::notify(osg::NOTICE)<<" --addMissingColors - Adding a white color value to all geometry that don't have\n"
" that don't have their own color values\n" " their own color values (--addMissingColours also accepted)."<< std::endl;
" (--addMissingColours also accepted)."<< std::endl;
osg::notify(osg::NOTICE)<<" --overallNormal - Replace normals with a single overall normal."<< std::endl; osg::notify(osg::NOTICE)<<" --overallNormal - Replace normals with a single overall normal."<< std::endl;
osg::notify( osg::NOTICE ) << std::endl; osg::notify( osg::NOTICE ) << std::endl;
osg::notify( osg::NOTICE ) << osg::notify( osg::NOTICE ) <<
" --formats - List all supported formats and their supported options." << std::endl; " --formats - Lists all supported formats and their supported options." << std::endl;
osg::notify( osg::NOTICE ) << osg::notify( osg::NOTICE ) <<
" --format <format> - Display information about the specified <format>,\n" " --format <format> - Displays information about the spefied <format>, where <format>\n"
" where <format> is the file extension, such as \"flt\"." << std::endl; " is the file extension, such as \"flt\"." << std::endl;
osg::notify( osg::NOTICE ) << osg::notify( osg::NOTICE ) <<
" --plugins - List all supported plugin files." << std::endl; " --plugins - Lists all supported plugin files." << std::endl;
osg::notify( osg::NOTICE ) << osg::notify( osg::NOTICE ) <<
" --plugin <plugin> - Display information about the specified <plugin>,\n" " --plugin >plugin> - Displays information about the spefied <plugin>, where <plugin>\n"
" where <plugin> is the plugin's full path and file name." << std::endl; " is the plugin's full path and file name." << std::endl;
} }
@@ -594,11 +585,6 @@ int main( int argc, char **argv )
OrientationConverter oc; OrientationConverter oc;
bool do_convert = false; bool do_convert = false;
if (arguments.read("--use-world-frame"))
{
oc.useWorldFrame(true);
}
std::string str; std::string str;
while (arguments.read("-O",str)) while (arguments.read("-O",str))
{ {
@@ -670,7 +656,7 @@ int main( int argc, char **argv )
if( sscanf( str.c_str(), "%f", if( sscanf( str.c_str(), "%f",
&nsimp ) != 1 ) &nsimp ) != 1 )
{ {
usage( argv[0], "Simplify argument format incorrect." ); usage( argv[0], "Scale argument format incorrect." );
return 1; return 1;
} }
std::cout << str << " " << nsimp << std::endl; std::cout << str << " " << nsimp << std::endl;

View File

@@ -3,7 +3,7 @@ SET(TARGET_SRC osgversion.cpp )
IF (OSG_MAINTAINER) IF (OSG_MAINTAINER)
SET(TARGET_SRC ${TARGET_SRC} Contributors.cpp ) SET(TARGET_SRC ${TARGET_SRC} Contributors.cpp )
ADD_DEFINITIONS("-DBUILD_CONTRIBUTORS") ADD_DEFINITIONS("-DBUILD_CONTRIBUTORS")
ENDIF(OSG_MAINTAINER) ENDIF()
SET(TARGET_COMMON_LIBRARIES SET(TARGET_COMMON_LIBRARIES
OpenThreads OpenThreads

View File

@@ -311,7 +311,6 @@ TypoCorrection typoCorrections[] =
{"Keuhne", "Kuehne"}, {"Keuhne", "Kuehne"},
{"Kheune", "Kuehne"}, {"Kheune", "Kuehne"},
{"Lagrade", "Lagarde"}, {"Lagrade", "Lagarde"},
{"Largade", "Lagarde"},
{"Larshkari", "Lashkari"}, {"Larshkari", "Lashkari"},
{"Lashakari", "Lashkari"}, {"Lashakari", "Lashkari"},
{"Lashari", "Lashkari"}, {"Lashari", "Lashkari"},
@@ -378,7 +377,6 @@ TypoCorrection typoCorrections[] =
{"Sylvan", "Sylvain"}, {"Sylvan", "Sylvain"},
{"Takeahei", "Takahei"}, {"Takeahei", "Takahei"},
{"Takehei", "Takahei"}, {"Takehei", "Takahei"},
{"Tery", "Terry"},
{"Tarantilils", "Tarantilis"}, {"Tarantilils", "Tarantilis"},
{"Trastenjak", "Trstenjak"}, {"Trastenjak", "Trstenjak"},
{"Urlich", "Ulrich"}, {"Urlich", "Ulrich"},

View File

@@ -57,6 +57,7 @@ IF(DYNAMIC_OPENSCENEGRAPH)
ADD_SUBDIRECTORY(osglogicop) ADD_SUBDIRECTORY(osglogicop)
ADD_SUBDIRECTORY(osglogo) ADD_SUBDIRECTORY(osglogo)
ADD_SUBDIRECTORY(osgmanipulator) ADD_SUBDIRECTORY(osgmanipulator)
ADD_SUBDIRECTORY(osgmemorytest)
ADD_SUBDIRECTORY(osgmotionblur) ADD_SUBDIRECTORY(osgmotionblur)
ADD_SUBDIRECTORY(osgmovie) ADD_SUBDIRECTORY(osgmovie)
ADD_SUBDIRECTORY(osgmultiplerendertargets) ADD_SUBDIRECTORY(osgmultiplerendertargets)
@@ -107,10 +108,10 @@ IF(DYNAMIC_OPENSCENEGRAPH)
ADD_SUBDIRECTORY(osgtexture3D) ADD_SUBDIRECTORY(osgtexture3D)
ADD_SUBDIRECTORY(osgtexturerectangle) ADD_SUBDIRECTORY(osgtexturerectangle)
ADD_SUBDIRECTORY(osgthirdpersonview) ADD_SUBDIRECTORY(osgthirdpersonview)
ADD_SUBDIRECTORY(osgunittests)
ADD_SUBDIRECTORY(osgvertexprogram) ADD_SUBDIRECTORY(osgvertexprogram)
ADD_SUBDIRECTORY(osgvolume) ADD_SUBDIRECTORY(osgvolume)
ADD_SUBDIRECTORY(osgwindows) ADD_SUBDIRECTORY(osgwindows)
ADD_SUBDIRECTORY(osganimationhardware)
ADD_SUBDIRECTORY(osganimationtimeline) ADD_SUBDIRECTORY(osganimationtimeline)
ADD_SUBDIRECTORY(osganimationnode) ADD_SUBDIRECTORY(osganimationnode)
ADD_SUBDIRECTORY(osganimationmakepath) ADD_SUBDIRECTORY(osganimationmakepath)
@@ -134,11 +135,6 @@ IF(DYNAMIC_OPENSCENEGRAPH)
ADD_SUBDIRECTORY(osgwidgettable) ADD_SUBDIRECTORY(osgwidgettable)
ADD_SUBDIRECTORY(osgwidgetwindow) ADD_SUBDIRECTORY(osgwidgetwindow)
IF(OSG_CPP_EXCEPTIONS_AVAILABLE)
ADD_SUBDIRECTORY(osgunittests)
ADD_SUBDIRECTORY(osgmemorytest)
ENDIF()
ADD_SUBDIRECTORY(osgpdf) ADD_SUBDIRECTORY(osgpdf)
IF (BUILD_OSG_WRAPPERS) IF (BUILD_OSG_WRAPPERS)
@@ -165,13 +161,9 @@ IF(DYNAMIC_OPENSCENEGRAPH)
ADD_SUBDIRECTORY(osgviewerWX) ADD_SUBDIRECTORY(osgviewerWX)
ENDIF(wxWidgets_FOUND) ENDIF(wxWidgets_FOUND)
IF (QT_FOUND) IF (QT_FOUND AND QT_QTOPENGL_LIBRARY)
OPTION(BUILD_QT_EXAMPLES "Enable the build of the examples that depend on Qt" ON) ADD_SUBDIRECTORY(osgviewerQT)
ENDIF(QT_FOUND AND QT_QTOPENGL_LIBRARY)
IF (BUILD_QT_EXAMPLES AND QT_QTOPENGL_LIBRARY)
ADD_SUBDIRECTORY(osgviewerQT)
ENDIF()
ENDIF()
IF (FLTK_FOUND) IF (FLTK_FOUND)
ADD_SUBDIRECTORY(osgviewerFLTK) ADD_SUBDIRECTORY(osgviewerFLTK)

View File

@@ -1,3 +0,0 @@
SET(TARGET_SRC osganimationhardware.cpp )
SET(TARGET_ADDED_LIBRARIES osgAnimation )
SETUP_EXAMPLE(osganimationhardware)

View File

@@ -1,264 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#include <iostream>
#include <osgDB/ReadFile>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osg/Drawable>
#include <osg/MatrixTransform>
#include <osgAnimation/BasicAnimationManager>
#include <osgAnimation/RigGeometry>
#include <osgAnimation/RigTransformHardware>
#include <osgAnimation/AnimationManagerBase>
#include <osgAnimation/BoneMapVisitor>
#include <sstream>
static unsigned int getRandomValueinRange(unsigned int v)
{
return static_cast<unsigned int>((rand() * 1.0 * v)/(RAND_MAX-1));
}
osg::ref_ptr<osg::Program> program;
// show how to override the default RigTransformHardware for customized usage
struct MyRigTransformHardware : public osgAnimation::RigTransformHardware
{
void operator()(osgAnimation::RigGeometry& geom)
{
if (_needInit)
if (!init(geom))
return;
computeMatrixPaletteUniform(geom.getMatrixFromSkeletonToGeometry(), geom.getInvMatrixFromSkeletonToGeometry());
}
bool init(osgAnimation::RigGeometry& geom)
{
osg::Vec3Array* pos = dynamic_cast<osg::Vec3Array*>(geom.getVertexArray());
if (!pos) {
osg::notify(osg::WARN) << "RigTransformHardware no vertex array in the geometry " << geom.getName() << std::endl;
return false;
}
if (!geom.getSkeleton()) {
osg::notify(osg::WARN) << "RigTransformHardware no skeleting set in geometry " << geom.getName() << std::endl;
return false;
}
osgAnimation::BoneMapVisitor mapVisitor;
geom.getSkeleton()->accept(mapVisitor);
osgAnimation::BoneMap bm = mapVisitor.getBoneMap();
if (!createPalette(pos->size(),bm, geom.getVertexInfluenceSet().getVertexToBoneList()))
return false;
int attribIndex = 11;
int nbAttribs = getNumVertexAttrib();
// use a global program for all avatar
if (!program.valid()) {
program = new osg::Program;
program->setName("HardwareSkinning");
if (!_shader.valid())
_shader = osg::Shader::readShaderFile(osg::Shader::VERTEX,"shaders/skinning.vert");
if (!_shader.valid()) {
osg::notify(osg::WARN) << "RigTransformHardware can't load VertexShader" << std::endl;
return false;
}
// replace max matrix by the value from uniform
{
std::string str = _shader->getShaderSource();
std::string toreplace = std::string("MAX_MATRIX");
std::size_t start = str.find(toreplace);
std::stringstream ss;
ss << getMatrixPaletteUniform()->getNumElements();
str.replace(start, toreplace.size(), ss.str());
_shader->setShaderSource(str);
osg::notify(osg::INFO) << "Shader " << str << std::endl;
}
program->addShader(_shader.get());
for (int i = 0; i < nbAttribs; i++)
{
std::stringstream ss;
ss << "boneWeight" << i;
program->addBindAttribLocation(ss.str(), attribIndex + i);
osg::notify(osg::INFO) << "set vertex attrib " << ss.str() << std::endl;
}
}
for (int i = 0; i < nbAttribs; i++)
{
std::stringstream ss;
ss << "boneWeight" << i;
geom.setVertexAttribData(attribIndex + i, osg::Geometry::ArrayData(getVertexAttrib(i),osg::Geometry::BIND_PER_VERTEX));
}
osg::ref_ptr<osg::StateSet> ss = new osg::StateSet;
ss->addUniform(getMatrixPaletteUniform());
ss->addUniform(new osg::Uniform("nbBonesPerVertex", getNumBonesPerVertex()));
ss->setAttributeAndModes(program.get());
geom.setStateSet(ss.get());
_needInit = false;
return true;
}
};
struct SetupRigGeometry : public osg::NodeVisitor
{
bool _hardware;
SetupRigGeometry( bool hardware = true) : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), _hardware(hardware) {}
void apply(osg::Geode& geode)
{
for (unsigned int i = 0; i < geode.getNumDrawables(); i++)
apply(*geode.getDrawable(i));
}
void apply(osg::Drawable& geom)
{
if (_hardware) {
osgAnimation::RigGeometry* rig = dynamic_cast<osgAnimation::RigGeometry*>(&geom);
if (rig)
rig->setRigTransformImplementation(new MyRigTransformHardware);
}
#if 0
if (geom.getName() != std::string("BoundingBox")) // we disable compute of bounding box for all geometry except our bounding box
geom.setComputeBoundingBoxCallback(new osg::Drawable::ComputeBoundingBoxCallback);
// geom.setInitialBound(new osg::Drawable::ComputeBoundingBoxCallback);
#endif
}
};
osg::Group* createCharacterInstance(osg::Group* character, bool hardware)
{
osg::ref_ptr<osg::Group> c ;
if (hardware)
c = osg::clone(character, osg::CopyOp::DEEP_COPY_ALL & ~osg::CopyOp::DEEP_COPY_PRIMITIVES & ~osg::CopyOp::DEEP_COPY_ARRAYS);
else
c = osg::clone(character, osg::CopyOp::DEEP_COPY_ALL);
osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(c->getUpdateCallback());
osgAnimation::BasicAnimationManager* anim = dynamic_cast<osgAnimation::BasicAnimationManager*>(animationManager);
const osgAnimation::AnimationList& list = animationManager->getAnimationList();
int v = getRandomValueinRange(list.size());
if (list[v]->getName() == std::string("MatIpo_ipo")) {
anim->playAnimation(list[v].get());
v = (v + 1)%list.size();
}
anim->playAnimation(list[v].get());
SetupRigGeometry switcher(hardware);
c->accept(switcher);
return c.release();
}
int main (int argc, char* argv[])
{
std::cerr << "This example works better with nathan.osg" << std::endl;
osg::ArgumentParser psr(&argc, argv);
osgViewer::Viewer viewer(psr);
bool hardware = true;
int maxChar = 10;
while (psr.read("--software")) { hardware = false; }
while (psr.read("--number", maxChar)) {}
osg::ref_ptr<osg::Group> root = dynamic_cast<osg::Group*>(osgDB::readNodeFiles(psr));
if (!root)
{
std::cout << psr.getApplicationName() <<": No data loaded" << std::endl;
return 1;
}
{
osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(root->getUpdateCallback());
if(!animationManager)
{
osg::notify(osg::FATAL) << "no AnimationManagerBase found, updateCallback need to animate elements" << std::endl;
return 1;
}
}
osg::ref_ptr<osg::Group> scene = new osg::Group;
// add the state manipulator
viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
// add the thread model handler
viewer.addEventHandler(new osgViewer::ThreadingHandler);
// add the window size toggle handler
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
// add the stats handler
viewer.addEventHandler(new osgViewer::StatsHandler);
// add the help handler
viewer.addEventHandler(new osgViewer::HelpHandler(psr.getApplicationUsage()));
// add the LOD Scale handler
viewer.addEventHandler(new osgViewer::LODScaleHandler);
// add the screen capture handler
viewer.addEventHandler(new osgViewer::ScreenCaptureHandler);
viewer.setSceneData(scene.get());
viewer.realize();
double xChar = maxChar;
double yChar = xChar * 9.0/16;
for (double i = 0.0; i < xChar; i++) {
for (double j = 0.0; j < yChar; j++) {
osg::ref_ptr<osg::Group> c = createCharacterInstance(root.get(), hardware);
osg::MatrixTransform* tr = new osg::MatrixTransform;
tr->setMatrix(osg::Matrix::translate( 2.0 * (i - xChar * .5),
0.0,
2.0 * (j - yChar * .5)));
tr->addChild(c.get());
scene->addChild(tr);
}
}
std::cout << "created " << xChar * yChar << " instance" << std::endl;
return viewer.run();
}

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -18,19 +18,14 @@
#include <osg/Geode> #include <osg/Geode>
#include <osgViewer/Viewer> #include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator> #include <osgGA/TrackballManipulator>
#include <osgDB/WriteFile>
#include <osgUtil/SmoothingVisitor> #include <osgUtil/SmoothingVisitor>
#include <osg/io_utils> #include <osg/io_utils>
#include <osgAnimation/Bone> #include <osgAnimation/Bone>
#include <osgAnimation/Skeleton> #include <osgAnimation/Skeleton>
#include <osgAnimation/RigGeometry> #include <osgAnimation/RigGeometry>
#include <osgAnimation/Skinning>
#include <osgAnimation/BasicAnimationManager> #include <osgAnimation/BasicAnimationManager>
#include <osgAnimation/UpdateMatrixTransform>
#include <osgAnimation/UpdateBone>
#include <osgAnimation/StackedTransform>
#include <osgAnimation/StackedTranslateElement>
#include <osgAnimation/StackedRotateAxisElement>
osg::Geode* createAxis() osg::Geode* createAxis()
{ {
@@ -64,9 +59,8 @@ osg::Geode* createAxis()
osgAnimation::RigGeometry* createTesselatedBox(int nsplit, float size) osgAnimation::RigGeometry* createTesselatedBox(int nsplit, float size)
{ {
osgAnimation::RigGeometry* riggeometry = new osgAnimation::RigGeometry; osgAnimation::RigGeometry* geometry = new osgAnimation::RigGeometry;
osg::Geometry* geometry = new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> vertices (new osg::Vec3Array()); osg::ref_ptr<osg::Vec3Array> vertices (new osg::Vec3Array());
osg::ref_ptr<osg::Vec3Array> colors (new osg::Vec3Array()); osg::ref_ptr<osg::Vec3Array> colors (new osg::Vec3Array());
geometry->setVertexArray (vertices.get()); geometry->setVertexArray (vertices.get());
@@ -126,8 +120,7 @@ osgAnimation::RigGeometry* createTesselatedBox(int nsplit, float size)
geometry->addPrimitiveSet(new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, array->size(), &array->front())); geometry->addPrimitiveSet(new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, array->size(), &array->front()));
geometry->setUseDisplayList( false ); geometry->setUseDisplayList( false );
riggeometry->setSourceGeometry(geometry); return geometry;
return riggeometry;
} }
@@ -171,27 +164,22 @@ int main (int argc, char* argv[])
osg::ref_ptr<osgAnimation::Skeleton> skelroot = new osgAnimation::Skeleton; osg::ref_ptr<osgAnimation::Skeleton> skelroot = new osgAnimation::Skeleton;
skelroot->setDefaultUpdateCallback(); skelroot->setDefaultUpdateCallback();
osg::ref_ptr<osgAnimation::Bone> root = new osgAnimation::Bone; osg::ref_ptr<osgAnimation::Bone> root = new osgAnimation::Bone;
root->setInvBindMatrixInSkeletonSpace(osg::Matrix::inverse(osg::Matrix::translate(-1,0,0))); {
root->setName("root"); root->setBindMatrixInBoneSpace(osg::Matrix::identity());
osgAnimation::UpdateBone* pRootUpdate = new osgAnimation::UpdateBone("root"); root->setBindMatrixInBoneSpace(osg::Matrix::translate(-1,0,0));
pRootUpdate->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("translate",osg::Vec3(-1,0,0))); root->setName("root");
root->setUpdateCallback(pRootUpdate); root->setDefaultUpdateCallback();
}
osg::ref_ptr<osgAnimation::Bone> right0 = new osgAnimation::Bone; osg::ref_ptr<osgAnimation::Bone> right0 = new osgAnimation::Bone;
right0->setInvBindMatrixInSkeletonSpace(osg::Matrix::inverse(osg::Matrix::translate(0,0,0))); right0->setBindMatrixInBoneSpace(osg::Matrix::translate(1,0,0));
right0->setName("right0"); right0->setName("right0");
osgAnimation::UpdateBone* pRight0Update = new osgAnimation::UpdateBone("right0"); right0->setDefaultUpdateCallback("right0");
pRight0Update->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("translate", osg::Vec3(1,0,0)));
pRight0Update->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("rotate", osg::Vec3(0,0,1), 0));
right0->setUpdateCallback(pRight0Update);
osg::ref_ptr<osgAnimation::Bone> right1 = new osgAnimation::Bone; osg::ref_ptr<osgAnimation::Bone> right1 = new osgAnimation::Bone;
right1->setInvBindMatrixInSkeletonSpace(osg::Matrix::inverse(osg::Matrix::translate(1,0,0))); right1->setBindMatrixInBoneSpace(osg::Matrix::translate(1,0,0));
right1->setName("right1"); right1->setName("right1");
osgAnimation::UpdateBone* pRight1Update = new osgAnimation::UpdateBone("right1"); right1->setDefaultUpdateCallback("right1");
pRight1Update->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("translate", osg::Vec3(1,0,0)));
pRight1Update->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("rotate", osg::Vec3(0,0,1), 0));
right1->setUpdateCallback(pRight1Update);
root->addChild(right0.get()); root->addChild(right0.get());
right0->addChild(right1.get()); right0->addChild(right1.get());
@@ -203,27 +191,33 @@ int main (int argc, char* argv[])
osgAnimation::Animation* anim = new osgAnimation::Animation; osgAnimation::Animation* anim = new osgAnimation::Animation;
{ {
osgAnimation::FloatKeyframeContainer* keys0 = new osgAnimation::FloatKeyframeContainer; osgAnimation::QuatKeyframeContainer* keys0 = new osgAnimation::QuatKeyframeContainer;
keys0->push_back(osgAnimation::FloatKeyframe(0,0)); osg::Quat rotate;
keys0->push_back(osgAnimation::FloatKeyframe(3,osg::PI_2)); rotate.makeRotate(osg::PI_2, osg::Vec3(0,0,1));
keys0->push_back(osgAnimation::FloatKeyframe(6,osg::PI_2)); keys0->push_back(osgAnimation::QuatKeyframe(0,osg::Quat(0,0,0,1)));
osgAnimation::FloatLinearSampler* sampler = new osgAnimation::FloatLinearSampler; keys0->push_back(osgAnimation::QuatKeyframe(3,rotate));
keys0->push_back(osgAnimation::QuatKeyframe(6,rotate));
osgAnimation::QuatSphericalLinearSampler* sampler = new osgAnimation::QuatSphericalLinearSampler;
sampler->setKeyframeContainer(keys0); sampler->setKeyframeContainer(keys0);
osgAnimation::FloatLinearChannel* channel = new osgAnimation::FloatLinearChannel(sampler); // osgAnimation::AnimationUpdateCallback* cb = dynamic_cast<osgAnimation::AnimationUpdateCallback*>(right0->getUpdateCallback());
channel->setName("rotate"); osgAnimation::QuatSphericalLinearChannel* channel = new osgAnimation::QuatSphericalLinearChannel(sampler);
channel->setName("quaternion");
channel->setTargetName("right0"); channel->setTargetName("right0");
anim->addChannel(channel); anim->addChannel(channel);
} }
{ {
osgAnimation::FloatKeyframeContainer* keys1 = new osgAnimation::FloatKeyframeContainer; osgAnimation::QuatKeyframeContainer* keys1 = new osgAnimation::QuatKeyframeContainer;
keys1->push_back(osgAnimation::FloatKeyframe(0,0)); osg::Quat rotate;
keys1->push_back(osgAnimation::FloatKeyframe(3,0)); rotate.makeRotate(osg::PI_2, osg::Vec3(0,0,1));
keys1->push_back(osgAnimation::FloatKeyframe(6,osg::PI_2)); keys1->push_back(osgAnimation::QuatKeyframe(0,osg::Quat(0,0,0,1)));
osgAnimation::FloatLinearSampler* sampler = new osgAnimation::FloatLinearSampler; keys1->push_back(osgAnimation::QuatKeyframe(3,osg::Quat(0,0,0,1)));
keys1->push_back(osgAnimation::QuatKeyframe(6,rotate));
osgAnimation::QuatSphericalLinearSampler* sampler = new osgAnimation::QuatSphericalLinearSampler;
sampler->setKeyframeContainer(keys1); sampler->setKeyframeContainer(keys1);
osgAnimation::FloatLinearChannel* channel = new osgAnimation::FloatLinearChannel(sampler); osgAnimation::QuatSphericalLinearChannel* channel = new osgAnimation::QuatSphericalLinearChannel(sampler);
channel->setName("rotate"); //osgAnimation::AnimationUpdateCallback* cb = dynamic_cast<osgAnimation::AnimationUpdateCallback*>(right1->getUpdateCallback());
channel->setName("quaternion");
channel->setTargetName("right1"); channel->setTargetName("right1");
anim->addChannel(channel); anim->addChannel(channel);
} }
@@ -252,7 +246,7 @@ int main (int argc, char* argv[])
osg::Geode* geode = new osg::Geode; osg::Geode* geode = new osg::Geode;
geode->addDrawable(geom); geode->addDrawable(geom);
skelroot->addChild(geode); skelroot->addChild(geode);
osg::ref_ptr<osg::Vec3Array> src = dynamic_cast<osg::Vec3Array*>(geom->getSourceGeometry()->getVertexArray()); osg::ref_ptr<osg::Vec3Array> src = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());
geom->getOrCreateStateSet()->setMode(GL_LIGHTING, false); geom->getOrCreateStateSet()->setMode(GL_LIGHTING, false);
geom->setDataVariance(osg::Object::DYNAMIC); geom->setDataVariance(osg::Object::DYNAMIC);
@@ -267,7 +261,6 @@ int main (int argc, char* argv[])
viewer.frame(); viewer.frame();
} }
osgDB::writeNodeFile(*scene, "skinning.osg");
return 0; return 0;
} }

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -22,8 +22,7 @@
#include <osgAnimation/BasicAnimationManager> #include <osgAnimation/BasicAnimationManager>
#include <osgAnimation/Channel> #include <osgAnimation/Channel>
#include <osgAnimation/UpdateMatrixTransform> #include <osgAnimation/UpdateCallback>
#include <osgAnimation/StackedTranslateElement>
using namespace osgAnimation; using namespace osgAnimation;
@@ -75,9 +74,7 @@ int main (int argc, char* argv[])
osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform(); osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform();
trans->setName("AnimatedNode"); trans->setName("AnimatedNode");
trans->setDataVariance(osg::Object::DYNAMIC); trans->setDataVariance(osg::Object::DYNAMIC);
osgAnimation::UpdateMatrixTransform* updatecb = new osgAnimation::UpdateMatrixTransform("AnimatedCallback"); trans->setUpdateCallback(new osgAnimation::UpdateTransform("AnimatedCallback"));
updatecb->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("position"));
trans->setUpdateCallback(updatecb);
trans->setMatrix(osg::Matrix::identity()); trans->setMatrix(osg::Matrix::identity());
trans->addChild (geode.get()); trans->addChild (geode.get());

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -26,19 +26,15 @@
#include <osgAnimation/Bone> #include <osgAnimation/Bone>
#include <osgAnimation/Skeleton> #include <osgAnimation/Skeleton>
#include <osgAnimation/RigGeometry> #include <osgAnimation/RigGeometry>
#include <osgAnimation/Skinning>
#include <osgAnimation/Timeline> #include <osgAnimation/Timeline>
#include <osgAnimation/AnimationManagerBase> #include <osgAnimation/AnimationManagerBase>
#include <osgAnimation/TimelineAnimationManager> #include <osgAnimation/TimelineAnimationManager>
#include <osgAnimation/ActionStripAnimation>
#include <osgAnimation/ActionBlendIn>
#include <osgAnimation/ActionBlendOut>
#include <osgAnimation/ActionAnimation>
struct NoseBegin : public osgAnimation::Action::Callback struct NoseBegin : public osgAnimation::Action::Callback
{ {
virtual void operator()(osgAnimation::Action* action, osgAnimation::ActionVisitor* nv) virtual void operator()(osgAnimation::Action* action)
{ {
std::cout << "sacrebleu, it scratches my nose, let me scratch it" << std::endl; std::cout << "sacrebleu, it scratches my nose, let me scratch it" << std::endl;
std::cout << "process NoseBegin call back " << action->getName() << std::endl << std::endl; std::cout << "process NoseBegin call back " << action->getName() << std::endl << std::endl;
@@ -47,7 +43,7 @@ struct NoseBegin : public osgAnimation::Action::Callback
struct NoseEnd : public osgAnimation::Action::Callback struct NoseEnd : public osgAnimation::Action::Callback
{ {
virtual void operator()(osgAnimation::Action* action, osgAnimation::ActionVisitor* nv) virtual void operator()(osgAnimation::Action* action)
{ {
std::cout << "shhhrt shrrrrt shhhhhhrrrrt, haaa it's better"<< std::endl; std::cout << "shhhrt shrrrrt shhhhhhrrrrt, haaa it's better"<< std::endl;
std::cout << "process NoseEnd call back " << action->getName() << std::endl << std::endl; std::cout << "process NoseEnd call back " << action->getName() << std::endl << std::endl;
@@ -56,9 +52,9 @@ struct NoseEnd : public osgAnimation::Action::Callback
struct ExampleTimelineUsage : public osgGA::GUIEventHandler struct ExampleTimelineUsage : public osgGA::GUIEventHandler
{ {
osg::ref_ptr<osgAnimation::ActionStripAnimation> _mainLoop; osg::ref_ptr<osgAnimation::StripAnimation> _mainLoop;
osg::ref_ptr<osgAnimation::ActionStripAnimation> _scratchHead; osg::ref_ptr<osgAnimation::StripAnimation> _scratchHead;
osg::ref_ptr<osgAnimation::ActionStripAnimation> _scratchNose; osg::ref_ptr<osgAnimation::StripAnimation> _scratchNose;
osg::ref_ptr<osgAnimation::TimelineAnimationManager> _manager; osg::ref_ptr<osgAnimation::TimelineAnimationManager> _manager;
bool _releaseKey; bool _releaseKey;
@@ -73,14 +69,14 @@ struct ExampleTimelineUsage : public osgGA::GUIEventHandler
for (osgAnimation::AnimationList::const_iterator it = list.begin(); it != list.end(); it++) for (osgAnimation::AnimationList::const_iterator it = list.begin(); it != list.end(); it++)
map[(*it)->getName()] = *it; map[(*it)->getName()] = *it;
_mainLoop = new osgAnimation::ActionStripAnimation(map["Idle_Main"].get(),0.0,0.0); _mainLoop = new osgAnimation::StripAnimation(map["Idle_Main"].get(),0.0,0.0);
_mainLoop->setLoop(0); // means forever _mainLoop->setLoop(0); // means forever
_scratchHead = new osgAnimation::ActionStripAnimation(map["Idle_Head_Scratch.02"].get(),0.2,0.3); _scratchHead = new osgAnimation::StripAnimation(map["Idle_Head_Scratch.02"].get(),0.2,0.3);
_scratchHead->setLoop(1); // one time _scratchHead->setLoop(1); // one time
map["Idle_Nose_Scratch.01"]->setDuration(10.0); // set this animation duration to 10 seconds map["Idle_Nose_Scratch.01"]->setDuration(10.0); // set this animation duration to 10 seconds
_scratchNose = new osgAnimation::ActionStripAnimation(map["Idle_Nose_Scratch.01"].get(),0.2,0.3); _scratchNose = new osgAnimation::StripAnimation(map["Idle_Nose_Scratch.01"].get(),0.2,0.3);
_scratchNose->setLoop(1); // one time _scratchNose->setLoop(1); // one time
// add the main loop at priority 0 at time 0. // add the main loop at priority 0 at time 0.
@@ -161,26 +157,22 @@ struct ExampleTimelineUsage : public osgGA::GUIEventHandler
int main (int argc, char* argv[]) int main (int argc, char* argv[])
{ {
std::cerr << "This example works only with nathan.osg" << std::endl; std::cerr << "This example works only with osgAnimation/nathan.osg" << std::endl;
osg::ArgumentParser psr(&argc, argv); osg::ArgumentParser psr(&argc, argv);
osgViewer::Viewer viewer(psr); osgViewer::Viewer viewer(psr);
std::string file = "nathan.osg"; std::string file = "osgAnimation/nathan.osg";
if(argc >= 2) if(argc >= 2)
file = psr[1]; file = psr[1];
// replace the manager // replace the manager
osg::Group* root = dynamic_cast<osg::Group*>(osgDB::readNodeFile(file)); osg::Group* root = dynamic_cast<osg::Group*>(osgDB::readNodeFile(file));
if (!root) {
osg::notify(osg::FATAL) << "can't read file " << file << std::endl;
return 1;
}
osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(root->getUpdateCallback()); osgAnimation::AnimationManagerBase* animationManager = dynamic_cast<osgAnimation::AnimationManagerBase*>(root->getUpdateCallback());
if(!animationManager) if(!animationManager)
{ {
osg::notify(osg::FATAL) << "Did not find AnimationManagerBase updateCallback needed to animate elements" << std::endl; std::cerr << "Did not find AnimationManagerBase updateCallback needed to animate elements" << std::endl;
return 1; return 1;
} }

View File

@@ -1,19 +1,7 @@
# INCLUDE_DIRECTORIES( ${OPENAL_INCLUDE_DIR} ) #this file is automatically generated
# SET(TARGET_EXTERNAL_LIBRARIES ${OPENAL_LIBRARY} alut)
IF (SDL_FOUND)
SET(TARGET_EXTERNAL_LIBRARIES ${SDL_LIBRARY} )
INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} )
ADD_DEFINITIONS(-DUSE_SDL)
IF (MINGW)
SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} winmm dinput ddraw dxguid)
ENDIF()
ENDIF(SDL_FOUND)
SET(TARGET_SRC osgmovie.cpp ) SET(TARGET_SRC osgmovie.cpp )
SET(TARGET_ADDED_LIBRARIES osgGA ) SET(TARGET_ADDED_LIBRARIES osgGA )
#### end var setup ### #### end var setup ###
SETUP_EXAMPLE(osgmovie) SETUP_EXAMPLE(osgmovie)

View File

@@ -43,7 +43,7 @@ class MovieEventHandler : public osgGA::GUIEventHandler
{ {
public: public:
MovieEventHandler():_trackMouse(false) {} MovieEventHandler():_playToggle(true),_trackMouse(false) {}
void setMouseTracking(bool track) { _trackMouse = track; } void setMouseTracking(bool track) { _trackMouse = track; }
bool getMouseTracking() const { return _trackMouse; } bool getMouseTracking() const { return _trackMouse; }
@@ -116,9 +116,9 @@ protected:
}; };
bool _playToggle;
bool _trackMouse; bool _trackMouse;
ImageStreamList _imageStreamList; ImageStreamList _imageStreamList;
unsigned int _seekIncr;
}; };
@@ -211,16 +211,17 @@ bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIAction
itr!=_imageStreamList.end(); itr!=_imageStreamList.end();
++itr) ++itr)
{ {
osg::ImageStream::StreamStatus playToggle = (*itr)->getStatus(); _playToggle = !_playToggle;
if (playToggle != osg::ImageStream::PLAYING) if ( _playToggle )
{ {
std::cout<< (*itr).get() << " Play"<<std::endl; // playing, so pause
std::cout<<"Play"<<std::endl;
(*itr)->play(); (*itr)->play();
} }
else else
{ {
// playing, so pause // playing, so pause
std::cout<< (*itr).get() << " Pause"<<std::endl; std::cout<<"Pause"<<std::endl;
(*itr)->pause(); (*itr)->pause();
} }
} }
@@ -232,29 +233,12 @@ bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIAction
itr!=_imageStreamList.end(); itr!=_imageStreamList.end();
++itr) ++itr)
{ {
std::cout<< (*itr).get() << " Restart"<<std::endl; std::cout<<"Restart"<<std::endl;
(*itr)->rewind(); (*itr)->rewind();
(*itr)->play(); (*itr)->play();
} }
return true; return true;
} }
else if (ea.getKey()=='>')
{
for(ImageStreamList::iterator itr=_imageStreamList.begin();
itr!=_imageStreamList.end();
++itr)
{
std::cout<<"Seeking"<<std::endl;
if(_seekIncr > 3) _seekIncr = 0;
double length = (*itr)->getLength();
double t_pos = (length/4.0f)*_seekIncr;
//(*itr)->rewind();
(*itr)->seek(t_pos);
(*itr)->play();
_seekIncr++;
}
return true;
}
else if (ea.getKey()=='L') else if (ea.getKey()=='L')
{ {
for(ImageStreamList::iterator itr=_imageStreamList.begin(); for(ImageStreamList::iterator itr=_imageStreamList.begin();
@@ -263,53 +247,17 @@ bool MovieEventHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIAction
{ {
if ( (*itr)->getLoopingMode() == osg::ImageStream::LOOPING) if ( (*itr)->getLoopingMode() == osg::ImageStream::LOOPING)
{ {
std::cout<< (*itr).get() << " Toggle Looping Off"<<std::endl; std::cout<<"Toggle Looping Off"<<std::endl;
(*itr)->setLoopingMode( osg::ImageStream::NO_LOOPING ); (*itr)->setLoopingMode( osg::ImageStream::NO_LOOPING );
} }
else else
{ {
std::cout<< (*itr).get() << " Toggle Looping On"<<std::endl; std::cout<<"Toggle Looping On"<<std::endl;
(*itr)->setLoopingMode( osg::ImageStream::LOOPING ); (*itr)->setLoopingMode( osg::ImageStream::LOOPING );
} }
} }
return true; return true;
} }
else if (ea.getKey()=='+')
{
for(ImageStreamList::iterator itr=_imageStreamList.begin();
itr!=_imageStreamList.end();
++itr)
{
double tm = (*itr)->getTimeMultiplier();
tm += 0.1;
(*itr)->setTimeMultiplier(tm);
std::cout << (*itr).get() << " Increase speed rate "<< (*itr)->getTimeMultiplier() << std::endl;
}
return true;
}
else if (ea.getKey()=='-')
{
for(ImageStreamList::iterator itr=_imageStreamList.begin();
itr!=_imageStreamList.end();
++itr)
{
double tm = (*itr)->getTimeMultiplier();
tm -= 0.1;
(*itr)->setTimeMultiplier(tm);
std::cout << (*itr).get() << " Decrease speed rate "<< (*itr)->getTimeMultiplier() << std::endl;
}
return true;
}
else if (ea.getKey()=='o')
{
for(ImageStreamList::iterator itr=_imageStreamList.begin();
itr!=_imageStreamList.end();
++itr)
{
std::cout<< (*itr).get() << " Frame rate "<< (*itr)->getFrameRate() <<std::endl;
}
return true;
}
return false; return false;
} }
@@ -324,10 +272,6 @@ void MovieEventHandler::getUsage(osg::ApplicationUsage& usage) const
usage.addKeyboardMouseBinding("p","Play/Pause movie"); usage.addKeyboardMouseBinding("p","Play/Pause movie");
usage.addKeyboardMouseBinding("r","Restart movie"); usage.addKeyboardMouseBinding("r","Restart movie");
usage.addKeyboardMouseBinding("l","Toggle looping of movie"); usage.addKeyboardMouseBinding("l","Toggle looping of movie");
usage.addKeyboardMouseBinding("+","Increase speed of movie");
usage.addKeyboardMouseBinding("-","Decrease speed of movie");
usage.addKeyboardMouseBinding("o","Display frame rate of movie");
usage.addKeyboardMouseBinding(">","Advance the movie using seek");
} }
@@ -376,33 +320,6 @@ osg::Geometry* myCreateTexturedQuadGeometry(const osg::Vec3& pos,float width,flo
} }
} }
#if USE_SDL
class SDLAudioSink : public osg::AudioSink
{
public:
SDLAudioSink(osg::AudioStream* audioStream):
_started(false),
_paused(false),
_audioStream(audioStream) {}
~SDLAudioSink();
virtual void play();
virtual void pause();
virtual void stop();
virtual bool playing() const { return _started && !_paused; }
bool _started;
bool _paused;
osg::observer_ptr<osg::AudioStream> _audioStream;
};
#endif
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
// use an ArgumentParser object to manage the program arguments. // use an ArgumentParser object to manage the program arguments.
@@ -508,13 +425,6 @@ int main(int argc, char** argv)
osg::Vec3 bottomright = pos; osg::Vec3 bottomright = pos;
bool xyPlane = fullscreen; bool xyPlane = fullscreen;
bool useAudioSink = false;
while(arguments.read("--audio")) { useAudioSink = true; }
#if USE_SDL
unsigned int numAudioStreamsEnabled = 0;
#endif
for(int i=1;i<arguments.argc();++i) for(int i=1;i<arguments.argc();++i)
{ {
@@ -522,50 +432,18 @@ int main(int argc, char** argv)
{ {
osg::Image* image = osgDB::readImageFile(arguments[i]); osg::Image* image = osgDB::readImageFile(arguments[i]);
osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image); osg::ImageStream* imagestream = dynamic_cast<osg::ImageStream*>(image);
if (imagestream) if (imagestream) imagestream->play();
{
osg::ImageStream::AudioStreams& audioStreams = imagestream->getAudioStreams();
if (useAudioSink && !audioStreams.empty())
{
osg::AudioStream* audioStream = audioStreams[0].get();
osg::notify(osg::NOTICE)<<"AudioStream read ["<<audioStream->getName()<<"]"<<std::endl;
#if USE_SDL
if (numAudioStreamsEnabled==0)
{
audioStream->setAudioSink(new SDLAudioSink(audioStream));
++numAudioStreamsEnabled;
}
#endif
}
imagestream->play();
}
if (image) if (image)
{ {
osg::notify(osg::NOTICE)<<"image->s()"<<image->s()<<" image-t()="<<image->t()<<" aspectRatio="<<image->getPixelAspectRatio()<<std::endl; osg::notify(osg::NOTICE)<<"image->s()"<<image->s()<<" image-t()="<<image->t()<<std::endl;
float width = image->s() * image->getPixelAspectRatio(); geode->addDrawable(myCreateTexturedQuadGeometry(pos,image->s(),image->t(),image, useTextureRectangle, xyPlane, flip));
float height = image->t();
osg::ref_ptr<osg::Drawable> drawable = myCreateTexturedQuadGeometry(pos, width, height,image, useTextureRectangle, xyPlane, flip); bottomright = pos + osg::Vec3(static_cast<float>(image->s()),static_cast<float>(image->t()),0.0f);
if (image->isImageTranslucent())
{
osg::notify(osg::NOTICE)<<"Transparent movie, enabling blending."<<std::endl;
drawable->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON); if (xyPlane) pos.y() += image->t()*1.05f;
drawable->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); else pos.z() += image->t()*1.05f;
}
geode->addDrawable(drawable.get());
bottomright = pos + osg::Vec3(width,height,0.0f);
if (xyPlane) pos.y() += height*1.05f;
else pos.z() += height*1.05f;
} }
else else
{ {
@@ -606,44 +484,8 @@ int main(int argc, char** argv)
if (fullscreen) if (fullscreen)
{ {
viewer.realize(); viewer.realize();
viewer.getCamera()->setClearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f));
float screenAspectRatio = 1280.0f/1024.0f;
osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
if (wsi)
{
unsigned int width, height;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);
screenAspectRatio = float(width) / float(height);
}
float modelAspectRatio = (bottomright.x()-topleft.x())/(bottomright.y()-topleft.y());
viewer.getCamera()->setViewMatrix(osg::Matrix::identity()); viewer.getCamera()->setViewMatrix(osg::Matrix::identity());
osg::Vec3 center = (bottomright + topleft)*0.5f;
osg::Vec3 dx(bottomright.x()-center.x(), 0.0f, 0.0f);
osg::Vec3 dy(0.0f, topleft.y()-center.y(), 0.0f);
float ratio = modelAspectRatio/screenAspectRatio;
if (ratio>1.0f)
{
// use model width as the control on model size.
bottomright = center + dx - dy * ratio;
topleft = center - dx + dy * ratio;
}
else
{
// use model height as the control on model size.
bottomright = center + dx / ratio - dy;
topleft = center - dx / ratio + dy;
}
viewer.getCamera()->setProjectionMatrixAsOrtho2D(topleft.x(),bottomright.x(),topleft.y(),bottomright.y()); viewer.getCamera()->setProjectionMatrixAsOrtho2D(topleft.x(),bottomright.x(),topleft.y(),bottomright.y());
while(!viewer.done()) while(!viewer.done())
@@ -659,83 +501,3 @@ int main(int argc, char** argv)
} }
} }
#if USE_SDL
#include "SDL.h"
static void soundReadCallback(void * user_data, uint8_t * data, int datalen)
{
SDLAudioSink * sink = reinterpret_cast<SDLAudioSink*>(user_data);
osg::ref_ptr<osg::AudioStream> as = sink->_audioStream.get();
if (as.valid())
{
as->consumeAudioBuffer(data, datalen);
}
}
SDLAudioSink::~SDLAudioSink()
{
stop();
}
void SDLAudioSink::play()
{
if (_started)
{
if (_paused)
{
SDL_PauseAudio(0);
_paused = false;
}
return;
}
_started = true;
_paused = false;
osg::notify(osg::NOTICE)<<"SDLAudioSink()::startPlaying()"<<std::endl;
osg::notify(osg::NOTICE)<<" audioFrequency()="<<_audioStream->audioFrequency()<<std::endl;
osg::notify(osg::NOTICE)<<" audioNbChannels()="<<_audioStream->audioNbChannels()<<std::endl;
osg::notify(osg::NOTICE)<<" audioSampleFormat()="<<_audioStream->audioSampleFormat()<<std::endl;
SDL_AudioSpec specs = { 0 };
SDL_AudioSpec wanted_specs = { 0 };
wanted_specs.freq = _audioStream->audioFrequency();
wanted_specs.format = AUDIO_S16SYS;
wanted_specs.channels = _audioStream->audioNbChannels();
wanted_specs.silence = 0;
wanted_specs.samples = 1024;
wanted_specs.callback = soundReadCallback;
wanted_specs.userdata = this;
if (SDL_OpenAudio(&wanted_specs, &specs) < 0)
throw "SDL_OpenAudio() failed (" + std::string(SDL_GetError()) + ")";
SDL_PauseAudio(0);
}
void SDLAudioSink::pause()
{
if (_started)
{
SDL_PauseAudio(1);
_paused = true;
}
}
void SDLAudioSink::stop()
{
if (_started)
{
if (!_paused) SDL_PauseAudio(1);
SDL_CloseAudio();
osg::notify(osg::NOTICE)<<"~SDLAudioSink() destructor, but still playing"<<std::endl;
}
}
#endif

View File

@@ -600,9 +600,6 @@ int main(int argc, char** argv)
if (arguments.read("--sv")) if (arguments.read("--sv"))
{ {
// sv isn't yet thread safe
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
// hint to tell viewer to request stencil buffer when setting up windows // hint to tell viewer to request stencil buffer when setting up windows
osg::DisplaySettings::instance()->setMinimumNumStencilBits(8); osg::DisplaySettings::instance()->setMinimumNumStencilBits(8);
@@ -625,9 +622,6 @@ int main(int argc, char** argv)
} }
else if (arguments.read("--pssm")) else if (arguments.read("--pssm"))
{ {
// pssm isn't yet thread safe
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
int mapcount = 3; int mapcount = 3;
while (arguments.read("--mapcount", mapcount)); while (arguments.read("--mapcount", mapcount));
osg::ref_ptr<osgShadow::ParallelSplitShadowMap> pssm = new osgShadow::ParallelSplitShadowMap(NULL,mapcount); osg::ref_ptr<osgShadow::ParallelSplitShadowMap> pssm = new osgShadow::ParallelSplitShadowMap(NULL,mapcount);

View File

@@ -489,7 +489,7 @@ void testThreadInitAndExit()
OpenThreads::Thread::microSleep(5000000); OpenThreads::Thread::microSleep(5000000);
} }
std::cout<<"pass notify thread test."<<std::endl<<std::endl; std::cout<<"pass noitfy thread test."<<std::endl<<std::endl;
} }
void testPolytope() void testPolytope()

View File

@@ -1,25 +1,20 @@
SET(TARGET_EXTERNAL_LIBRARIES ${SDL_LIBRARY} )
IF("${SDL_LIBRARY}" MATCHES "SDLmain") IF("${SDL_LIBRARY}" MATCHES "SDLmain")
# Found a precompiled SDLmain library. # Found a precompiled SDLmain library.
SET(TARGET_SRC osgviewerSDL.cpp) SET(TARGET_SRC osgviewerSDL.cpp)
ELSE() ELSE("${SDL_LIBRARY}" MATCHES "SDLmain")
# No SDLmain has been found. # No SDLmain has been found.
# Depending on platform, code may need to be provided for SDLmain. # Depending on platform, code may need to be provided for SDLmain.
IF(APPLE) IF(APPLE)
SET(TARGET_SRC osgviewerSDL.cpp SDLMainForMacOSX.m SDLMainForMacOSX.h) SET(TARGET_SRC osgviewerSDL.cpp SDLMainForMacOSX.m SDLMainForMacOSX.h)
ELSE() ELSE(APPLE)
# Unhandled case. No libsdlmain has been found and no code substitute. # Unhandled case. No libsdlmain has been found and no code substitute.
# Depending on platform (or SDL version), # Depending on platform (or SDL version),
# this may or may not link successfully. # this may or may not link successfully.
SET(TARGET_SRC osgviewerSDL.cpp) SET(TARGET_SRC osgviewerSDL.cpp)
SET(TARGET_EXTERNAL_LIBRARIES ${SDLMAIN_LIBRARY} ${TARGET_EXTERNAL_LIBRARIES} ) ENDIF(APPLE)
ENDIF() ENDIF("${SDL_LIBRARY}" MATCHES "SDLmain")
ENDIF()
IF (MINGW) SET(TARGET_EXTERNAL_LIBRARIES ${SDL_LIBRARY} )
SET(TARGET_EXTERNAL_LIBRARIES mingw32 ${TARGET_EXTERNAL_LIBRARIES} winmm dinput ddraw dxguid)
ENDIF()
INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ) INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} )

View File

@@ -17,17 +17,17 @@
#include <OpenThreads/Config> #include <OpenThreads/Config>
#include <OpenThreads/Exports> #include <OpenThreads/Exports>
#if defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC) #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) && defined(__i386__)
# include <libkern/OSAtomic.h> #define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
# define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
#elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) && defined(__i386__)
# define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
#elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)
# define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES #define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
#elif defined(_OPENTHREADS_ATOMIC_USE_SUN) #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
# include <atomic.h> # include <atomic.h>
# include "Mutex" # include "Mutex"
# include "ScopedLock" # include "ScopedLock"
#elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
# include <libkern/OSAtomic.h>
# define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
#elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
# include "Mutex" # include "Mutex"
# include "ScopedLock" # include "ScopedLock"

View File

@@ -1,85 +0,0 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSG_AUDIOSTREAM
#define OSG_AUDIOSTREAM 1
#include <osg/Image>
namespace osg {
/** Pure virtual AudioSink bass class that is used to connect the audio system with AudioStreams. */
class OSG_EXPORT AudioSink : public osg::Object
{
public:
AudioSink();
virtual const char * libraryName() const { return "osg"; }
virtual const char * className() const { return "AudioSinkInterface"; }
virtual void play() = 0;
virtual void pause() = 0;
virtual void stop() = 0;
virtual bool playing() const = 0;
virtual double getDelay() const { return _delay; }
virtual void setDelay(const double delay) { _delay = delay; }
virtual void setVolume(float) {}
virtual float getVolume() const { return 0.0f; }
private:
virtual AudioSink * cloneType() const { return 0; }
virtual AudioSink * clone(const osg::CopyOp &) const { return 0; }
double _delay;
};
/** Pure virtual AudioStream base class. Subclasses provide mechanism for reading/generating audio data*/
class OSG_EXPORT AudioStream : public osg::Object
{
public:
AudioStream();
/** Copy constructor using CopyOp to manage deep vs shallow copy. */
AudioStream(const AudioStream& audio,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const AudioStream*>(obj)!=0; }
virtual const char* libraryName() const { return "osg"; }
virtual const char* className() const { return "AudioStream"; }
virtual void setAudioSink(osg::AudioSink* audio_sink) = 0;
virtual void consumeAudioBuffer(void * const buffer, const size_t size) = 0;
virtual int audioFrequency() const = 0;
virtual int audioNbChannels() const = 0;
enum SampleFormat
{
SAMPLE_FORMAT_U8,
SAMPLE_FORMAT_S16,
SAMPLE_FORMAT_S24,
SAMPLE_FORMAT_S32,
SAMPLE_FORMAT_F32
};
virtual SampleFormat audioSampleFormat() const = 0;
};
} // namespace
#endif

View File

@@ -24,15 +24,12 @@ class Image;
class Texture; class Texture;
class StateSet; class StateSet;
class StateAttribute; class StateAttribute;
class StateAttributeCallback;
class Uniform; class Uniform;
class Node; class Node;
class Drawable; class Drawable;
class Array; class Array;
class PrimitiveSet; class PrimitiveSet;
class Shape; class Shape;
class NodeCallback;
/** Copy Op(erator) used to control whether shallow or deep copy is used /** Copy Op(erator) used to control whether shallow or deep copy is used
* during copy construction and clone operation.*/ * during copy construction and clone operation.*/
@@ -55,7 +52,6 @@ class OSG_EXPORT CopyOp
DEEP_COPY_PRIMITIVES = 1<<8, DEEP_COPY_PRIMITIVES = 1<<8,
DEEP_COPY_SHAPES = 1<<9, DEEP_COPY_SHAPES = 1<<9,
DEEP_COPY_UNIFORMS = 1<<10, DEEP_COPY_UNIFORMS = 1<<10,
DEEP_COPY_CALLBACKS = 1<<11,
DEEP_COPY_ALL = 0x7FFFFFFF DEEP_COPY_ALL = 0x7FFFFFFF
}; };
@@ -76,8 +72,6 @@ class OSG_EXPORT CopyOp
virtual PrimitiveSet* operator() (const PrimitiveSet* primitives) const; virtual PrimitiveSet* operator() (const PrimitiveSet* primitives) const;
virtual Shape* operator() (const Shape* shape) const; virtual Shape* operator() (const Shape* shape) const;
virtual Uniform* operator() (const Uniform* shape) const; virtual Uniform* operator() (const Uniform* shape) const;
virtual NodeCallback* operator() (const NodeCallback* nodecallback) const;
virtual StateAttributeCallback* operator() (const StateAttributeCallback* stateattributecallback) const;
protected: protected:

View File

@@ -191,7 +191,7 @@ class OSG_EXPORT DisplaySettings : public osg::Referenced
unsigned int getNumOfDatabaseThreadsHint() const { return _numDatabaseThreadsHint; } unsigned int getNumOfDatabaseThreadsHint() const { return _numDatabaseThreadsHint; }
/** Set the hint for number of threads in the DatbasePager to dedicate to reading http requests.*/ /** Set the hint for number of threads in the DatbasePager to dedicate to reading http requests.*/
void setNumOfHttpDatabaseThreadsHint(unsigned int numThreads) { _numHttpDatabaseThreadsHint = numThreads; } void setNumOfHttpDatabaseThreadsHint(unsigned int numThreads) { _numDatabaseThreadsHint = numThreads; }
/** Get the hint for number of threads in the DatbasePager dedicated to reading http requests.*/ /** Get the hint for number of threads in the DatbasePager dedicated to reading http requests.*/
unsigned int getNumOfHttpDatabaseThreadsHint() const { return _numHttpDatabaseThreadsHint; } unsigned int getNumOfHttpDatabaseThreadsHint() const { return _numHttpDatabaseThreadsHint; }

View File

@@ -26,14 +26,9 @@ enum Endian
inline Endian getCpuByteOrder() inline Endian getCpuByteOrder()
{ {
union { static char big_endian_1[2] = { 0, 1 };
char big_endian_1[2];
short is_it_really_1;
} u;
u.big_endian_1[0] = 0;
u.big_endian_1[1] = 1;
if (u.is_it_really_1 == 1) if ( (*((short*) big_endian_1)) == 1)
return BigEndian; return BigEndian;
else else
return LittleEndian; return LittleEndian;

View File

@@ -331,7 +331,6 @@ namespace osg
**************************************************************************/ **************************************************************************/
class Texture1D; class Texture1D;
class Texture2D; class Texture2D;
class Texture2DMultisample;
class Texture3D; class Texture3D;
class Texture2DArray; class Texture2DArray;
class TextureCubeMap; class TextureCubeMap;
@@ -346,7 +345,6 @@ namespace osg
explicit FrameBufferAttachment(RenderBuffer* target); explicit FrameBufferAttachment(RenderBuffer* target);
explicit FrameBufferAttachment(Texture1D* target, int level = 0); explicit FrameBufferAttachment(Texture1D* target, int level = 0);
explicit FrameBufferAttachment(Texture2D* target, int level = 0); explicit FrameBufferAttachment(Texture2D* target, int level = 0);
explicit FrameBufferAttachment(Texture2DMultisample* target, int level = 0);
explicit FrameBufferAttachment(Texture3D* target, int zoffset, int level = 0); explicit FrameBufferAttachment(Texture3D* target, int zoffset, int level = 0);
explicit FrameBufferAttachment(Texture2DArray* target, int layer, int level = 0); explicit FrameBufferAttachment(Texture2DArray* target, int layer, int level = 0);
explicit FrameBufferAttachment(TextureCubeMap* target, int face, int level = 0); explicit FrameBufferAttachment(TextureCubeMap* target, int face, int level = 0);

View File

@@ -185,9 +185,6 @@ class OSG_EXPORT Image : public Object
void setPacking(unsigned int packing) { _packing = packing; } void setPacking(unsigned int packing) { _packing = packing; }
inline unsigned int getPacking() const { return _packing; } inline unsigned int getPacking() const { return _packing; }
inline void setPixelAspectRatio(float pixelAspectRatio) { _pixelAspectRatio = pixelAspectRatio; }
inline float getPixelAspectRatio() const { return _pixelAspectRatio; }
/** Return the number of bits required for each pixel. */ /** Return the number of bits required for each pixel. */
inline unsigned int getPixelSizeInBits() const { return computePixelSizeInBits(_pixelFormat,_dataType); } inline unsigned int getPixelSizeInBits() const { return computePixelSizeInBits(_pixelFormat,_dataType); }
@@ -349,7 +346,6 @@ class OSG_EXPORT Image : public Object
GLenum _pixelFormat; GLenum _pixelFormat;
GLenum _dataType; GLenum _dataType;
unsigned int _packing; unsigned int _packing;
float _pixelAspectRatio;
AllocationMode _allocationMode; AllocationMode _allocationMode;
unsigned char* _data; unsigned char* _data;

View File

@@ -105,7 +105,7 @@ class OSG_EXPORT ImageSequence : public ImageStream
virtual void update(NodeVisitor* nv); virtual void update(NodeVisitor* nv);
struct OSG_EXPORT UpdateCallback : public osg::StateAttributeCallback struct OSG_EXPORT UpdateCallback : public osg::StateAttribute::Callback
{ {
virtual void operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv); virtual void operator () (osg::StateAttribute* attr, osg::NodeVisitor* nv);
}; };

View File

@@ -15,7 +15,6 @@
#define OSG_IMAGESTREAM 1 #define OSG_IMAGESTREAM 1
#include <osg/Image> #include <osg/Image>
#include <osg/AudioStream>
namespace osg { namespace osg {
@@ -78,8 +77,7 @@ class OSG_EXPORT ImageStream : public Image
virtual double getLength() const { return 0.0; } virtual double getLength() const { return 0.0; }
virtual double getFrameRate() const { return 0.0; }
virtual void setReferenceTime(double) {} virtual void setReferenceTime(double) {}
virtual double getReferenceTime() const { return 0.0; } virtual double getReferenceTime() const { return 0.0; }
@@ -88,11 +86,6 @@ class OSG_EXPORT ImageStream : public Image
virtual void setVolume(float) {} virtual void setVolume(float) {}
virtual float getVolume() const { return 0.0f; } virtual float getVolume() const { return 0.0f; }
typedef std::vector< osg::ref_ptr<osg::AudioStream> > AudioStreams;
void setAudioStreams(const AudioStreams& asl) { _audioStreams = asl; }
AudioStreams& getAudioStreams() { return _audioStreams; }
const AudioStreams& getAudioStreams() const { return _audioStreams; }
protected: protected:
@@ -102,8 +95,6 @@ class OSG_EXPORT ImageStream : public Image
StreamStatus _status; StreamStatus _status;
LoopingMode _loopingMode; LoopingMode _loopingMode;
AudioStreams _audioStreams;
}; };
} // namespace } // namespace

View File

@@ -18,8 +18,6 @@
#include <osg/NodeCallback> #include <osg/NodeCallback>
#include <osg/observer_ptr> #include <osg/observer_ptr>
#include <iterator>
namespace osg namespace osg
{ {

View File

@@ -11,11 +11,10 @@
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSG_NOTIFY_H #ifndef OSG_NOTIFY
#define OSG_NOTIFY_H 1 #define OSG_NOTIFY 1
#include <osg/Export> #include <osg/Export>
#include <osg/Referenced> // for NotifyHandler
#include <ostream> #include <ostream>
@@ -24,8 +23,8 @@ namespace osg {
/** Range of notify levels from DEBUG_FP through to FATAL, ALWAYS /** Range of notify levels from DEBUG_FP through to FATAL, ALWAYS
* is reserved for forcing the absorption of all messages. The * is reserved for forcing the absorption of all messages. The
* keywords are also used verbatim when specified by the environmental * keywords are also used verbatim when specified by the environmental
* variable OSGNOTIFYLEVEL or OSG_NOTIFY_LEVEL. * variable OSGNOTIFYLEVEL. See documentation on osg::notify() for
* See documentation on osg::notify() for further details. * further details.
*/ */
enum NotifySeverity { enum NotifySeverity {
ALWAYS=0, ALWAYS=0,
@@ -38,108 +37,38 @@ enum NotifySeverity {
}; };
/** set the notify level, overriding the default or the value set by /** set the notify level, overriding the default or the value set by
* the environmental variable OSGNOTIFYLEVEL or OSG_NOTIFY_LEVEL. * the environmental variable OSGNOTIFYLEVEL.
*/ */
extern OSG_EXPORT void setNotifyLevel(NotifySeverity severity); extern OSG_EXPORT void setNotifyLevel(NotifySeverity severity);
/** get the notify level. */ /** get the notify level. */
extern OSG_EXPORT NotifySeverity getNotifyLevel(); extern OSG_EXPORT NotifySeverity getNotifyLevel();
/** is notification enabled, given the current setNotifyLevel() setting? */
extern OSG_EXPORT bool isNotifyEnabled(NotifySeverity severity);
/** initialize notify level. */ /** initialize notify level. */
extern OSG_EXPORT bool initNotifyLevel(); extern OSG_EXPORT bool initNotifyLevel();
#ifdef OSG_NOTIFY_DISABLED
inline bool isNotifyEnabled(NotifySeverity) { return false; }
#else
/** is notification enabled, given the current setNotifyLevel() setting? */
extern OSG_EXPORT bool isNotifyEnabled(NotifySeverity severity);
#endif
/** notify messaging function for providing fatal through to verbose /** notify messaging function for providing fatal through to verbose
* debugging messages. Level of messages sent to the console can * debugging messages. Level of messages sent to the console can
* be controlled by setting the NotifyLevel either within your * be controlled by setting the NotifyLevel either within your
* application or via the an environmental variable i.e. * application or via the an environmental variable. For instance
* - setenv OSGNOTIFYLEVEL DEBUG (for tsh) * setenv OSGNOTIFYLEVEL DEBUG (for tsh), export OSGNOTIFYLEVEL=DEBUG
* - export OSGNOTIFYLEVEL=DEBUG (for bourne shell) * (for bourne shell) or set OSGNOTIFYLEVEL=DEBUG (for Windows) all
* - set OSGNOTIFYLEVEL=DEBUG (for Windows) * tell the osg to redirect all debugging and more important messages
* * to the console (useful for debugging :-) setting ALWAYS will force
* All tell the osg to redirect all debugging and more important messages
* to the notification stream (useful for debugging) setting ALWAYS will force
* all messages to be absorbed, which might be appropriate for final * all messages to be absorbed, which might be appropriate for final
* applications. Default NotifyLevel is NOTICE. Check the enum * applications. Default NotifyLevel is NOTICE. Check the enum
* #NotifySeverity for full range of possibilities. To use the notify * NotifySeverity for full range of possibilities. To use the notify
* with your code simply use the notify function as a normal file * with your code simply use the notify function as a normal file
* stream (like std::cout) i.e * stream (like cout) i.e osg::notify(osg::DEBUG) << "Hello Bugs!"<<endl;
* @code
* osg::notify(osg::DEBUG) << "Hello Bugs!" << std::endl;
* @endcode
* @see setNotifyLevel, setNotifyHandler
*/ */
extern OSG_EXPORT std::ostream& notify(const NotifySeverity severity); extern OSG_EXPORT std::ostream& notify(const NotifySeverity severity);
inline std::ostream& notify(void) { return notify(osg::INFO); } inline std::ostream& notify(void) { return notify(osg::INFO); }
#define OSG_NOTIFY(level) if (osg::isNotifyEnabled(level)) osg::notify(level)
#define OSG_ALWAYS OSG_NOTIFY(osg::ALWAYS)
#define OSG_FATAL OSG_NOTIFY(osg::FATAL)
#define OSG_WARN OSG_NOTIFY(osg::WARN)
#define OSG_NOTICE OSG_NOTIFY(osg::NOTICE)
#define OSG_INFO OSG_NOTIFY(osg::INFO)
#define OSG_DEBUG OSG_NOTIFY(osg::DEBUG_INFO)
#define OSG_DEBUG_FP OSG_NOTIFY(osg::DEBUG_FP)
/** Handler processing output of notification stream. It acts as a sink to
* notification messages. It is called when notification stream needs to be
* synchronized (i.e. after osg::notify() << std::endl).
* StandardNotifyHandler is used by default, it writes notifications to stderr
* (severity <= WARN) or stdout (severity > WARN).
* Notifications can be redirected to other sinks such as GUI widgets or
* windows debugger (WinDebugNotifyHandler) with custom handlers.
* Use setNotifyHandler to set custom handler.
* Note that osg notification API is not thread safe although notification
* handler is called from many threads. When incorporating handlers into GUI
* widgets you must take care of thread safety on your own.
* @see setNotifyHandler
*/
class OSG_EXPORT NotifyHandler : public osg::Referenced
{
public:
virtual void notify(osg::NotifySeverity severity, const char *message) = 0;
};
/** Set notification handler, by default StandardNotifyHandler is used.
* @see NotifyHandler
*/
extern OSG_EXPORT void setNotifyHandler(NotifyHandler *handler);
/** Get currrent notification handler. */
extern OSG_EXPORT NotifyHandler *getNotifyHandler();
/** Redirects notification stream to stderr (severity <= WARN) or stdout (severity > WARN).
* The fputs() function is used to write messages to standard files. Note that
* std::out and std::cerr streams are not used.
* @see setNotifyHandler
*/
class OSG_EXPORT StandardNotifyHandler : public NotifyHandler
{
public:
void notify(osg::NotifySeverity severity, const char *message);
};
#if defined(WIN32) && !defined(__CYGWIN__)
/** Redirects notification stream to windows debugger with use of
* OuputDebugString functions.
* @see setNotifyHandler
*/
class OSG_EXPORT WinDebugNotifyHandler : public NotifyHandler
{
public:
void notify(osg::NotifySeverity severity, const char *message);
};
#endif
} }
#endif #endif

View File

@@ -96,14 +96,10 @@ class OSG_EXPORT Object : public Referenced
/** Set the name of object using C++ style string.*/ /** Set the name of object using C++ style string.*/
virtual void setName( const std::string& name ) { _name = name; } inline void setName( const std::string& name ) { _name = name; }
/** Set the name of object using a C style string.*/ /** Set the name of object using a C style string.*/
inline void setName( const char* name ) inline void setName( const char* name ) { _name = name; }
{
if (name) setName(std::string(name));
else setName(std::string());
}
/** Get the name of object.*/ /** Get the name of object.*/
inline const std::string& getName() const { return _name; } inline const std::string& getName() const { return _name; }

View File

@@ -18,75 +18,11 @@
#include <osg/Export> #include <osg/Export>
#include <osg/CopyOp> #include <osg/CopyOp>
#include <osg/Group> #include <osg/Group>
#include <osg/Geometry>
namespace osg { namespace osg {
// Create and return a StateSet appropriate for performing an occlusion
// query test (disable lighting, texture mapping, etc). Probably some
// room for improvement here. Could disable shaders, for example.
osg::StateSet* initOQState();
// Create and return a StateSet for rendering a debug representation of query geometry.
osg::StateSet* initOQDebugState();
// TestResult -- stores (per context) results of an occlusion query
// test performed by QueryGeometry. An OcclusionQueryNode has a
// Geode owning a single QueryGeometry that
// draws the occlusion query geometry. QueryGeometry keeps a
// TestResult per context to store the result/status of each query.
// Accessed during the cull and draw traversals.
class TestResult : public osg::Referenced
{
public:
TestResult() : _init( false ), _id( 0 ), _contextID( 0 ), _active( false ), _numPixels( 0 ) {}
~TestResult() {}
bool _init;
// Query ID for this context.
GLuint _id;
// Context ID owning this query ID.
unsigned int _contextID;
// Set to true when a query gets issued and set to
// false when the result is retrieved.
mutable bool _active;
// Result of last query.
GLint _numPixels;
};
// QueryGeometry -- A Drawable that performs an occlusion query,
// using its geometric data as the query geometry.
class QueryGeometry : public osg::Geometry
{
public:
QueryGeometry( const std::string& oqnName=std::string("") );
~QueryGeometry();
void reset();
// TBD implement copy constructor
virtual void drawImplementation( osg::RenderInfo& renderInfo ) const;
unsigned int getNumPixels();
void releaseGLObjects( osg::State* state = 0 );
static void deleteQueryObject( unsigned int contextID, GLuint handle );
static void flushDeletedQueryObjects( unsigned int contextID, double currentTime, double& availableTime );
static void discardDeletedQueryObjects( unsigned int contextID );
protected:
typedef osg::buffered_object< TestResult > ResultMap;
mutable ResultMap _results;
// Needed for debug only
std::string _oqnName;
};
// This Node performs occlusion query testing on its children. // This Node performs occlusion query testing on its children.
// You can use it directly to occlusion query test a portion // You can use it directly to occlusion query test a portion
@@ -152,7 +88,7 @@ public:
// These methods are public so that osgUtil::CullVisitor can access them. // These methods are public so that osgUtil::CullVisitor can access them.
// Not intended for application use. // Not intended for application use.
virtual bool getPassed( const osg::Camera* camera, osg::NodeVisitor& nv ); bool getPassed( const osg::Camera* camera, float distanceToEyePoint );
void traverseQuery( const osg::Camera* camera, osg::NodeVisitor& nv ); void traverseQuery( const osg::Camera* camera, osg::NodeVisitor& nv );
void traverseDebug( osg::NodeVisitor& nv ); void traverseDebug( osg::NodeVisitor& nv );
@@ -169,7 +105,7 @@ public:
protected: protected:
virtual ~OcclusionQueryNode(); virtual ~OcclusionQueryNode();
virtual void createSupportNodes(); void createSupportNodes();
osg::ref_ptr< osg::Geode > _queryGeode; osg::ref_ptr< osg::Geode > _queryGeode;
osg::ref_ptr< osg::Geode > _debugGeode; osg::ref_ptr< osg::Geode > _debugGeode;

View File

@@ -449,12 +449,6 @@ class DrawElements : public PrimitiveSet
{ {
if (_ebo.valid()) _ebo->releaseGLObjects(state); if (_ebo.valid()) _ebo->releaseGLObjects(state);
} }
virtual void reserveElements(unsigned int numIndices) = 0;
virtual void setElement(unsigned int, unsigned int) = 0;
virtual unsigned int getElement(unsigned int) = 0;
virtual void addElement(unsigned int) = 0;
protected: protected:
@@ -532,11 +526,6 @@ class OSG_EXPORT DrawElementsUByte : public DrawElements, public VectorGLubyte
_rangeModifiedCount = _modifiedCount; _rangeModifiedCount = _modifiedCount;
} }
virtual void reserveElements(unsigned int numIndices) { reserve(numIndices); }
virtual void setElement(unsigned int i, unsigned int v) { (*this)[i] = v; }
virtual unsigned int getElement(unsigned int i) { return (*this)[i]; }
virtual void addElement(unsigned int v) { push_back(GLubyte(v)); }
protected: protected:
virtual ~DrawElementsUByte(); virtual ~DrawElementsUByte();
@@ -612,11 +601,6 @@ class OSG_EXPORT DrawElementsUShort : public DrawElements, public VectorGLushort
_rangeModifiedCount = _modifiedCount; _rangeModifiedCount = _modifiedCount;
} }
virtual void reserveElements(unsigned int numIndices) { reserve(numIndices); }
virtual void setElement(unsigned int i, unsigned int v) { (*this)[i] = v; }
virtual unsigned int getElement(unsigned int i) { return (*this)[i]; }
virtual void addElement(unsigned int v) { push_back(GLushort(v)); }
protected: protected:
virtual ~DrawElementsUShort(); virtual ~DrawElementsUShort();
@@ -692,11 +676,6 @@ class OSG_EXPORT DrawElementsUInt : public DrawElements, public VectorGLuint
_rangeModifiedCount = _modifiedCount; _rangeModifiedCount = _modifiedCount;
} }
virtual void reserveElements(unsigned int numIndices) { reserve(numIndices); }
virtual void setElement(unsigned int i, unsigned int v) { (*this)[i] = v; }
virtual unsigned int getElement(unsigned int i) { return (*this)[i]; }
virtual void addElement(unsigned int v) { push_back(GLuint(v)); }
protected: protected:
virtual ~DrawElementsUInt(); virtual ~DrawElementsUInt();

View File

@@ -142,9 +142,8 @@ class OSG_EXPORT Program : public osg::StateAttribute
GLenum _type; GLenum _type;
GLint _size; GLint _size;
}; };
typedef std::map< unsigned int, ActiveVarInfo > ActiveUniformMap;
typedef std::map< std::string, ActiveVarInfo > ActiveVarInfoMap; typedef std::map< std::string, ActiveVarInfo > ActiveVarInfoMap;
const ActiveUniformMap& getActiveUniforms(unsigned int contextID) const; const ActiveVarInfoMap& getActiveUniforms(unsigned int contextID) const;
const ActiveVarInfoMap& getActiveAttribs(unsigned int contextID) const; const ActiveVarInfoMap& getActiveAttribs(unsigned int contextID) const;
public: public:
@@ -185,7 +184,7 @@ class OSG_EXPORT Program : public osg::StateAttribute
inline void apply(const Uniform& uniform) const inline void apply(const Uniform& uniform) const
{ {
GLint location = getUniformLocation(uniform.getNameID()); GLint location = getUniformLocation(uniform.getName());
if (location>=0) if (location>=0)
{ {
if ((unsigned int)location>=_lastAppliedUniformList.size()) _lastAppliedUniformList.resize(location+1); if ((unsigned int)location>=_lastAppliedUniformList.size()) _lastAppliedUniformList.resize(location+1);
@@ -207,21 +206,10 @@ class OSG_EXPORT Program : public osg::StateAttribute
} }
} }
const ActiveUniformMap& getActiveUniforms() const {return _uniformInfoMap;} const ActiveVarInfoMap& getActiveUniforms() const {return _uniformInfoMap;}
const ActiveVarInfoMap& getActiveAttribs() const {return _attribInfoMap;} const ActiveVarInfoMap& getActiveAttribs() const {return _attribInfoMap;}
inline GLint getUniformLocation( unsigned int uniformNameID ) const { ActiveUniformMap::const_iterator itr = _uniformInfoMap.find(uniformNameID); return (itr!=_uniformInfoMap.end()) ? itr->second._location : -1; } inline GLint getUniformLocation( const std::string& name ) const { ActiveVarInfoMap::const_iterator itr = _uniformInfoMap.find(name); return (itr!=_uniformInfoMap.end()) ? itr->second._location : -1; }
/**
* Alternative version of getUniformLocation( unsigned int uniformNameID )
* retrofited into OSG for backward compatibility with osgCal,
* after uniform ids were refactored from std::strings to GLints in OSG version 2.9.10.
*
* Drawbacks: This method is not particularly fast. It has to access mutexed static
* map of uniform ids. So don't overuse it or your app performance will suffer.
*/
inline GLint getUniformLocation( const std::string & uniformName ) const { return getUniformLocation( Uniform::getNameID( uniformName ) ); }
inline GLint getAttribLocation( const std::string& name ) const { ActiveVarInfoMap::const_iterator itr = _attribInfoMap.find(name); return (itr!=_attribInfoMap.end()) ? itr->second._location : -1; } inline GLint getAttribLocation( const std::string& name ) const { ActiveVarInfoMap::const_iterator itr = _attribInfoMap.find(name); return (itr!=_attribInfoMap.end()) ? itr->second._location : -1; }
inline void addShaderToAttach(Shader *shader) inline void addShaderToAttach(Shader *shader)
@@ -250,7 +238,7 @@ class OSG_EXPORT Program : public osg::StateAttribute
bool _isLinked; bool _isLinked;
const unsigned int _contextID; const unsigned int _contextID;
ActiveUniformMap _uniformInfoMap; ActiveVarInfoMap _uniformInfoMap;
ActiveVarInfoMap _attribInfoMap; ActiveVarInfoMap _attribInfoMap;
typedef std::pair<osg::ref_ptr<const osg::Uniform>, unsigned int> UniformModifiedCountPair; typedef std::pair<osg::ref_ptr<const osg::Uniform>, unsigned int> UniformModifiedCountPair;

View File

@@ -31,13 +31,6 @@ namespace osg {
class DeleteHandler; class DeleteHandler;
class Observer; class Observer;
/** template class to help enforce static initialization order. */
template <typename T, T M()>
struct depends_on
{
depends_on() { M(); }
};
/** Base class from providing referencing counted objects.*/ /** Base class from providing referencing counted objects.*/
class OSG_EXPORT Referenced class OSG_EXPORT Referenced
{ {

View File

@@ -975,16 +975,7 @@ class OSG_EXPORT State : public Referenced, public Observer
} }
inline const Program::PerContextProgram* getLastAppliedProgramObject() const { return _lastAppliedProgramObject; } inline const Program::PerContextProgram* getLastAppliedProgramObject() const { return _lastAppliedProgramObject; }
inline GLint getUniformLocation( unsigned int uniformNameID ) const { return _lastAppliedProgramObject ? _lastAppliedProgramObject->getUniformLocation(uniformNameID) : -1; } inline GLint getUniformLocation( const std::string& name ) const { return _lastAppliedProgramObject ? _lastAppliedProgramObject->getUniformLocation(name) : -1; }
/**
* Alternative version of getUniformLocation( unsigned int uniformNameID )
* retrofited into OSG for backward compatibility with osgCal,
* after uniform ids were refactored from std::strings to GLints in OSG version 2.9.10.
*
* Drawbacks: This method is not particularly fast. It has to access mutexed static
* map of uniform ids. So don't overuse it or your app performance will suffer.
*/
inline GLint getUniformLocation( const std::string & uniformName ) const { return _lastAppliedProgramObject ? _lastAppliedProgramObject->getUniformLocation(uniformName) : -1; }
inline GLint getAttribLocation( const std::string& name ) const { return _lastAppliedProgramObject ? _lastAppliedProgramObject->getAttribLocation(name) : -1; } inline GLint getAttribLocation( const std::string& name ) const { return _lastAppliedProgramObject ? _lastAppliedProgramObject->getAttribLocation(name) : -1; }

View File

@@ -16,7 +16,6 @@
#include <osg/Export> #include <osg/Export>
#include <osg/Object> #include <osg/Object>
#include <osg/StateAttributeCallback>
#include <osg/GL> #include <osg/GL>
#include <typeinfo> #include <typeinfo>
@@ -191,9 +190,7 @@ class OSG_EXPORT StateAttribute : public Object
StateAttribute(); StateAttribute();
StateAttribute(const StateAttribute& sa,const CopyOp& copyop=CopyOp::SHALLOW_COPY): StateAttribute(const StateAttribute& sa,const CopyOp& copyop=CopyOp::SHALLOW_COPY):
Object(sa,copyop), Object(sa,copyop) {}
_updateCallback(copyop(sa._updateCallback.get()))
{}
/** Clone the type of an attribute, with Object* return type. /** Clone the type of an attribute, with Object* return type.
@@ -284,28 +281,37 @@ class OSG_EXPORT StateAttribute : public Object
// default to no black listed GLMode's associated with use of the StateAttribute. // default to no black listed GLMode's associated with use of the StateAttribute.
return true; return true;
} }
struct Callback : public virtual osg::Object
{
Callback() {}
// provide callback for backwards compatibility. Callback(const Callback&,const CopyOp&) {}
typedef osg::StateAttributeCallback Callback;
META_Object(osg,Callback);
/** do customized update code.*/
virtual void operator () (StateAttribute*, NodeVisitor*) {}
};
/** Set the UpdateCallback which allows users to attach customize the updating of an object during the update traversal.*/ /** Set the UpdateCallback which allows users to attach customize the updating of an object during the update traversal.*/
void setUpdateCallback(StateAttributeCallback* uc); void setUpdateCallback(Callback* uc);
/** Get the non const UpdateCallback.*/ /** Get the non const UpdateCallback.*/
StateAttributeCallback* getUpdateCallback() { return _updateCallback.get(); } Callback* getUpdateCallback() { return _updateCallback.get(); }
/** Get the const UpdateCallback.*/ /** Get the const UpdateCallback.*/
const StateAttributeCallback* getUpdateCallback() const { return _updateCallback.get(); } const Callback* getUpdateCallback() const { return _updateCallback.get(); }
/** Set the EventCallback which allows users to attach customize the updating of an object during the Event traversal.*/ /** Set the EventCallback which allows users to attach customize the updating of an object during the Event traversal.*/
void setEventCallback(StateAttributeCallback* ec); void setEventCallback(Callback* ec);
/** Get the non const EventCallback.*/ /** Get the non const EventCallback.*/
StateAttributeCallback* getEventCallback() { return _eventCallback.get(); } Callback* getEventCallback() { return _eventCallback.get(); }
/** Get the const EventCallback.*/ /** Get the const EventCallback.*/
const StateAttributeCallback* getEventCallback() const { return _eventCallback.get(); } const Callback* getEventCallback() const { return _eventCallback.get(); }
/** apply the OpenGL state attributes. /** apply the OpenGL state attributes.
@@ -337,8 +343,8 @@ class OSG_EXPORT StateAttribute : public Object
ParentList _parents; ParentList _parents;
friend class osg::StateSet; friend class osg::StateSet;
ref_ptr<StateAttributeCallback> _updateCallback; ref_ptr<Callback> _updateCallback;
ref_ptr<StateAttributeCallback> _eventCallback; ref_ptr<Callback> _eventCallback;
}; };
} }

View File

@@ -1,39 +0,0 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSG_STATEATTRIBUTECALLBACK
#define OSG_STATEATTRIBUTECALLBACK 1
#include <osg/Export>
#include <osg/Object>
namespace osg {
class StateAttribute;
class NodeVisitor;
class OSG_EXPORT StateAttributeCallback : public virtual osg::Object
{
public:
StateAttributeCallback() {}
StateAttributeCallback(const StateAttributeCallback&,const CopyOp&) {}
META_Object(osg,StateAttributeCallback);
/** do customized update code.*/
virtual void operator () (StateAttribute*, NodeVisitor*) {}
};
}
#endif

View File

@@ -199,10 +199,6 @@
#define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_DEPTH 0x8071
#endif #endif
#ifndef GL_TEXTURE_2D_MULTISAMPLE
#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
#endif
// Integer teture extension as in http://www.opengl.org/registry/specs/EXT/texture_integer.txt // Integer teture extension as in http://www.opengl.org/registry/specs/EXT/texture_integer.txt
#ifndef GL_EXT_texture_integer #ifndef GL_EXT_texture_integer
#define GL_RGBA32UI_EXT 0x8D70 #define GL_RGBA32UI_EXT 0x8D70
@@ -583,6 +579,12 @@ class OSG_EXPORT Texture : public osg::StateAttribute
public: public:
Extensions(unsigned int contextID); Extensions(unsigned int contextID);
Extensions(const Extensions& rhs);
void lowestCommonDenominator(const Extensions& rhs);
void setupGLExtensions(unsigned int contextID);
void setMultiTexturingSupported(bool flag) { _isMultiTexturingSupported=flag; } void setMultiTexturingSupported(bool flag) { _isMultiTexturingSupported=flag; }
bool isMultiTexturingSupported() const { return _isMultiTexturingSupported; } bool isMultiTexturingSupported() const { return _isMultiTexturingSupported; }
@@ -607,9 +609,6 @@ class OSG_EXPORT Texture : public osg::StateAttribute
void setGenerateMipMapSupported(bool flag) { _isGenerateMipMapSupported=flag; } void setGenerateMipMapSupported(bool flag) { _isGenerateMipMapSupported=flag; }
bool isGenerateMipMapSupported() const { return _isGenerateMipMapSupported; } bool isGenerateMipMapSupported() const { return _isGenerateMipMapSupported; }
void setTextureMultisampledSupported(bool flag) { _isTextureMultisampledSupported=flag; }
bool isTextureMultisampledSupported() const { return _isTextureMultisampledSupported; }
void setShadowSupported(bool flag) { _isShadowSupported = flag; } void setShadowSupported(bool flag) { _isShadowSupported = flag; }
bool isShadowSupported() const { return _isShadowSupported; } bool isShadowSupported() const { return _isShadowSupported; }
@@ -625,6 +624,10 @@ class OSG_EXPORT Texture : public osg::StateAttribute
bool isCompressedTexImage2DSupported() const { return _glCompressedTexImage2D!=0; } bool isCompressedTexImage2DSupported() const { return _glCompressedTexImage2D!=0; }
bool isCompressedTexSubImage2DSupported() const { return _glCompressedTexSubImage2D!=0; } bool isCompressedTexSubImage2DSupported() const { return _glCompressedTexSubImage2D!=0; }
void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) const;
void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei type, const GLvoid *data) const;
void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *data) const;
bool isClientStorageSupported() const { return _isClientStorageSupported; } bool isClientStorageSupported() const { return _isClientStorageSupported; }
bool isNonPowerOfTwoTextureSupported(GLenum filter) const bool isNonPowerOfTwoTextureSupported(GLenum filter) const
@@ -637,55 +640,13 @@ class OSG_EXPORT Texture : public osg::StateAttribute
void setTextureIntegerSupported(bool flag) { _isTextureIntegerEXTSupported=flag; } void setTextureIntegerSupported(bool flag) { _isTextureIntegerEXTSupported=flag; }
bool isTextureIntegerSupported() const { return _isTextureIntegerEXTSupported; } bool isTextureIntegerSupported() const { return _isTextureIntegerEXTSupported; }
void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) const void glTexParameterIiv(GLenum target, GLenum pname, const GLint* data) const;
{ void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint* data) const;
_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);
}
void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) const
{
_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
}
void glGetCompressedTexImage(GLenum target, GLint level, GLvoid *data) const
{
_glGetCompressedTexImage(target, level, data);
}
void glTexImage2DMultisample(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) const
{
_glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);
}
void glTexParameterIiv(GLenum target, GLenum pname, const GLint* data) const
{
_glTexParameterIiv(target, pname, data);
}
void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint* data) const
{
_glTexParameterIuiv(target, pname, data);
}
protected: protected:
~Extensions() {} ~Extensions() {}
typedef void (APIENTRY * CompressedTexImage2DArbProc) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * CompressedTexSubImage2DArbProc) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * GetCompressedTexImageArbProc) (GLenum target, GLint level, GLvoid *data);
typedef void (APIENTRY * TexImage2DMultisample)(GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
typedef void (APIENTRY * TexParameterIivProc)(GLenum target, GLenum pname, const GLint* data);
typedef void (APIENTRY * TexParameterIuivProc)(GLenum target, GLenum pname, const GLuint* data);
CompressedTexImage2DArbProc _glCompressedTexImage2D;
CompressedTexSubImage2DArbProc _glCompressedTexSubImage2D;
GetCompressedTexImageArbProc _glGetCompressedTexImage;
TexImage2DMultisample _glTexImage2DMultisample;
TexParameterIivProc _glTexParameterIiv;
TexParameterIuivProc _glTexParameterIuiv;
bool _isMultiTexturingSupported; bool _isMultiTexturingSupported;
bool _isTextureFilterAnisotropicSupported; bool _isTextureFilterAnisotropicSupported;
bool _isTextureCompressionARBSupported; bool _isTextureCompressionARBSupported;
@@ -694,7 +655,6 @@ class OSG_EXPORT Texture : public osg::StateAttribute
bool _isTextureEdgeClampSupported; bool _isTextureEdgeClampSupported;
bool _isTextureBorderClampSupported; bool _isTextureBorderClampSupported;
bool _isGenerateMipMapSupported; bool _isGenerateMipMapSupported;
bool _isTextureMultisampledSupported;
bool _isShadowSupported; bool _isShadowSupported;
bool _isShadowAmbientSupported; bool _isShadowAmbientSupported;
bool _isClientStorageSupported; bool _isClientStorageSupported;
@@ -704,6 +664,19 @@ class OSG_EXPORT Texture : public osg::StateAttribute
GLint _maxTextureSize; GLint _maxTextureSize;
GLint _numTextureUnits; GLint _numTextureUnits;
typedef void (APIENTRY * CompressedTexImage2DArbProc) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * CompressedTexSubImage2DArbProc) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data);
typedef void (APIENTRY * GetCompressedTexImageArbProc) (GLenum target, GLint level, GLvoid *data);
typedef void (APIENTRY * TexParameterIivProc)(GLenum target, GLenum pname, const GLint* data);
typedef void (APIENTRY * TexParameterIuivProc)(GLenum target, GLenum pname, const GLuint* data);
CompressedTexImage2DArbProc _glCompressedTexImage2D;
CompressedTexSubImage2DArbProc _glCompressedTexSubImage2D;
GetCompressedTexImageArbProc _glGetCompressedTexImage;
TexParameterIivProc _glTexParameterIiv;
TexParameterIuivProc _glTexParameterIuiv;
}; };
/** Gets the extension for the specified context. Creates the /** Gets the extension for the specified context. Creates the
@@ -737,7 +710,6 @@ class OSG_EXPORT Texture : public osg::StateAttribute
* unless you're implementing a subload callback. */ * unless you're implementing a subload callback. */
void applyTexImage2D_subload(State& state, GLenum target, const Image* image, GLsizei width, GLsizei height, GLint inInternalFormat, GLsizei numMipmapLevels) const; void applyTexImage2D_subload(State& state, GLenum target, const Image* image, GLsizei width, GLsizei height, GLint inInternalFormat, GLsizei numMipmapLevels) const;
/** Returned by mipmapBeforeTexImage() to indicate what /** Returned by mipmapBeforeTexImage() to indicate what
* mipmapAfterTexImage() should do */ * mipmapAfterTexImage() should do */
enum GenerateMipmapMode enum GenerateMipmapMode

View File

@@ -1,95 +0,0 @@
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2010 Robert Osfield
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*
* Texture2DMultisample codes Copyright (C) 2010 Marcin Hajder
* Thanks to to my company http://www.ai.com.pl for allowing me free this work.
*/
#ifndef OSG_TEXTURE2DMS
#define OSG_TEXTURE2DMS 1
#include <osg/Texture>
namespace osg {
/** Texture2DMultisample state class which encapsulates OpenGL 2D multisampled texture functionality.
* Multisampled texture were introduced with OpenGL 3.1 and extension GL_ARB_texture_multisample.
* See http://www.opengl.org/registry/specs/ARB/texture_multisample.txt for more info.
*/
class OSG_EXPORT Texture2DMultisample : public Texture
{
public :
Texture2DMultisample();
Texture2DMultisample(GLsizei numSamples, GLboolean fixedsamplelocations);
/** Copy constructor using CopyOp to manage deep vs shallow copy. */
Texture2DMultisample(const Texture2DMultisample& text,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
META_StateAttribute(osg, Texture2DMultisample,TEXTURE);
/** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
virtual int compare(const StateAttribute& rhs) const;
virtual GLenum getTextureTarget() const
{
return GL_TEXTURE_2D_MULTISAMPLE;
}
/** Sets the texture width and height. If width or height are zero,
* calculate the respective value from the source image size. */
inline void setTextureSize(int width, int height) const
{
_textureWidth = width;
_textureHeight = height;
}
inline void setNumSamples( int samples ) { _numSamples = samples; }
// unnecessary for Texture2DMultisample
virtual void setImage(unsigned int /*face*/, Image* /*image*/) {}
virtual Image* getImage(unsigned int /*face*/) { return NULL; }
virtual const Image* getImage(unsigned int /*face*/) const { return NULL; }
virtual unsigned int getNumImages() const {return 0; }
virtual void allocateMipmap(State& /*state*/) const {}
void setTextureWidth(int width) { _textureWidth=width; }
void setTextureHeight(int height) { _textureHeight=height; }
virtual int getTextureWidth() const { return _textureWidth; }
virtual int getTextureHeight() const { return _textureHeight; }
virtual int getTextureDepth() const { return 1; }
/** Bind the texture object. If the texture object hasn't already been
* compiled, create the texture mipmap levels. */
virtual void apply(State& state) const;
protected :
virtual ~Texture2DMultisample();
virtual void computeInternalFormat() const;
/** Subloaded images can have different texture and image sizes. */
mutable GLsizei _textureWidth, _textureHeight;
mutable GLsizei _numSamples;
mutable GLboolean _fixedsamplelocations;
};
}
#endif

View File

@@ -232,7 +232,7 @@ class OSG_EXPORT Uniform : public Object
Type getType() const { return _type; } Type getType() const { return _type; }
/** Set the name of the glUniform, ensuring it is only set once.*/ /** Set the name of the glUniform, ensuring it is only set once.*/
virtual void setName( const std::string& name ); void setName( const std::string& name );
/** Set the length of a uniform, ensuring it is only set once (1==scalar)*/ /** Set the length of a uniform, ensuring it is only set once (1==scalar)*/
void setNumElements( unsigned int numElements ); void setNumElements( unsigned int numElements );
@@ -259,9 +259,6 @@ class OSG_EXPORT Uniform : public Object
/** Return the internal data array type corresponding to a GLSL type */ /** Return the internal data array type corresponding to a GLSL type */
static GLenum getInternalArrayType( Type t ); static GLenum getInternalArrayType( Type t );
/** Return the number that the name maps to uniquely */
static unsigned int getNameID(const std::string& name);
/** convenient scalar (non-array) constructors w/ assignment */ /** convenient scalar (non-array) constructors w/ assignment */
explicit Uniform( const char* name, float f ); explicit Uniform( const char* name, float f );
explicit Uniform( const char* name, int i ); explicit Uniform( const char* name, int i );
@@ -466,8 +463,6 @@ class OSG_EXPORT Uniform : public Object
inline void setModifiedCount(unsigned int mc) { _modifiedCount = mc; } inline void setModifiedCount(unsigned int mc) { _modifiedCount = mc; }
inline unsigned int getModifiedCount() const { return _modifiedCount; } inline unsigned int getModifiedCount() const { return _modifiedCount; }
/** Get the number that the Uniform's name maps to uniquely */
unsigned int getNameID() const;
void apply(const GL2Extensions* ext, GLint location) const; void apply(const GL2Extensions* ext, GLint location) const;
@@ -489,8 +484,6 @@ class OSG_EXPORT Uniform : public Object
Type _type; Type _type;
unsigned int _numElements; unsigned int _numElements;
unsigned int _nameID;
// The internal data for osg::Uniforms are stored as an array of // The internal data for osg::Uniforms are stored as an array of
// getInternalArrayType() of length getInternalArrayNumElements(). // getInternalArrayType() of length getInternalArrayNumElements().

View File

@@ -21,20 +21,8 @@ extern "C" {
#define OPENSCENEGRAPH_MAJOR_VERSION 2 #define OPENSCENEGRAPH_MAJOR_VERSION 2
#define OPENSCENEGRAPH_MINOR_VERSION 8 #define OPENSCENEGRAPH_MINOR_VERSION 8
#define OPENSCENEGRAPH_PATCH_VERSION 5 #define OPENSCENEGRAPH_PATCH_VERSION 1
#define OPENSCENEGRAPH_SOVERSION 74 #define OPENSCENEGRAPH_SOVERSION 55
/** convinience macro that can be used to decide whether a feature is present or not i.e.
* #if OSG_MIN_VERSION_REQUIRED(2,9,5)
* your code here
* #endif
*/
#define OSG_MIN_VERSION_REQUIRED(MAJOR, MINOR, PATCH) ((OPENSCENEGRAPH_MAJOR_VERSION>MAJOR) || (OPENSCENEGRAPH_MAJOR_VERSION==MAJOR && (OPENSCENEGRAPH_MINOR_VERSION>MINOR || (OPENSCENEGRAPH_MINOR_VERSION==MINOR && OPENSCENEGRAPH_PATCH_VERSION>=PATCH))))
#define OSG_VERSION_LESS_THAN(MAJOR, MINOR, PATCH) ((OPENSCENEGRAPH_MAJOR_VERSION<MAJOR) || (OPENSCENEGRAPH_MAJOR_VERSION==MAJOR && (OPENSCENEGRAPH_MINOR_VERSION<MINOR || (OPENSCENEGRAPH_MINOR_VERSION==MINOR && OPENSCENEGRAPH_PATCH_VERSION<PATCH))))
#define OSG_VERSION_LESS_OR_EQUAL(MAJOR, MINOR, PATCH) ((OPENSCENEGRAPH_MAJOR_VERSION<MAJOR) || (OPENSCENEGRAPH_MAJOR_VERSION==MAJOR && (OPENSCENEGRAPH_MINOR_VERSION<MINOR || (OPENSCENEGRAPH_MINOR_VERSION==MINOR && OPENSCENEGRAPH_PATCH_VERSION<=PATCH))))
#define OSG_VERSION_GREATER_THAN(MAJOR, MINOR, PATCH) ((OPENSCENEGRAPH_MAJOR_VERSION>MAJOR) || (OPENSCENEGRAPH_MAJOR_VERSION==MAJOR && (OPENSCENEGRAPH_MINOR_VERSION>MINOR || (OPENSCENEGRAPH_MINOR_VERSION==MINOR && OPENSCENEGRAPH_PATCH_VERSION>PATCH))))
#define OSG_VERSION_GREATER_OR_EQUAL(MAJOR, MINOR, PATCH) ((OPENSCENEGRAPH_MAJOR_VERSION>MAJOR) || (OPENSCENEGRAPH_MAJOR_VERSION==MAJOR && (OPENSCENEGRAPH_MINOR_VERSION>MINOR || (OPENSCENEGRAPH_MINOR_VERSION==MINOR && OPENSCENEGRAPH_PATCH_VERSION>=PATCH))))
/** /**
* osgGetVersion() returns the library version number. * osgGetVersion() returns the library version number.

View File

@@ -1,147 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ACTION_H
#define OSGANIMATION_ACTION_H
#include <osgAnimation/Export>
#include <osgAnimation/Animation>
#include <osgAnimation/ActionVisitor>
#include <osgAnimation/FrameAction>
#include <iostream>
#define META_Action(library,name) \
virtual osg::Object* cloneType() const { return new name (); } \
virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new name (*this,copyop); } \
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const name *>(obj)!=NULL; } \
virtual const char* className() const { return #name; } \
virtual const char* libraryName() const { return #library; } \
virtual void accept(osgAnimation::ActionVisitor& nv) { nv.apply(*this); } \
namespace osgAnimation
{
class OSGANIMATION_EXPORT Action : public osg::Object
{
public:
class Callback : public osg::Object
{
public:
Callback(){}
Callback(const Callback& nc,const osg::CopyOp&) :
_nestedCallback(nc._nestedCallback) {}
META_Object(osgAnimation,Callback);
virtual void operator()(Action* action, osgAnimation::ActionVisitor* nv) {}
Callback* getNestedCallback() { return _nestedCallback.get(); }
void addNestedCallback(Callback* callback)
{
if (callback) {
if (_nestedCallback.valid())
_nestedCallback->addNestedCallback(callback);
else
_nestedCallback = callback;
}
}
void removeCallback(Callback* cb)
{
if (!cb)
return;
if (_nestedCallback.get() == cb)
_nestedCallback = _nestedCallback->getNestedCallback();
else if (_nestedCallback.valid())
_nestedCallback->removeCallback(cb);
}
protected:
osg::ref_ptr<Callback> _nestedCallback;
};
typedef std::map<unsigned int, osg::ref_ptr<Callback> > FrameCallback;
META_Action(osgAnimation, Action);
Action();
Action(const Action&,const osg::CopyOp&);
void setCallback(double when, Callback* callback)
{
setCallback(static_cast<unsigned int>(floor(when*_fps)), callback);
}
void setCallback(unsigned int frame, Callback* callback)
{
if (_framesCallback[frame].valid())
_framesCallback[frame]->addNestedCallback(callback);
else
_framesCallback[frame] = callback;
}
Callback* getCallback(unsigned int frame)
{
if (_framesCallback.find(frame) == _framesCallback.end())
return 0;
return _framesCallback[frame].get();
}
void removeCallback(Callback*);
Callback* getFrameCallback(unsigned int frame);
Callback* getFrameCallback(double time);
unsigned int getFramesPerSecond() const { return _fps; }
void setNumFrames(unsigned int numFrames) { _numberFrame = numFrames;}
void setDuration(double duration) { _numberFrame = static_cast<unsigned int>(floor(duration * _fps)); }
unsigned int getNumFrames() const { return _numberFrame;}
double getDuration() const { return _numberFrame * 1.0 / _fps; }
// 0 means infini else it's the number of loop
virtual void setLoop(int nb) { _loop = nb; }
virtual unsigned int getLoop() const { return _loop;}
// get the number of loop, the frame relative to loop.
// return true if in range, and false if out of range.
bool evaluateFrame(unsigned int frame, unsigned int& resultframe, unsigned int& nbloop );
virtual void traverse(ActionVisitor& visitor) {}
//virtual void evaluate(unsigned int frame);
protected:
FrameCallback _framesCallback;
double _speed;
unsigned int _fps;
unsigned int _numberFrame;
unsigned int _loop;
enum Status
{
Play,
Stop
};
Status _state;
};
}
#endif

View File

@@ -1,41 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ACTION_ANIMATION_H
#define OSGANIMATION_ACTION_ANIMATION_H
#include <osgAnimation/Action>
#include <osgAnimation/Export>
namespace osgAnimation {
class OSGANIMATION_EXPORT ActionAnimation : public Action
{
public:
META_Action(osgAnimation, ActionAnimation);
ActionAnimation();
ActionAnimation(const ActionAnimation& a, const osg::CopyOp& c);
ActionAnimation(Animation* animation);
void updateAnimation(unsigned int frame, int priority);
Animation* getAnimation() { return _animation.get(); }
protected:
osg::ref_ptr<Animation> _animation;
};
}
#endif

View File

@@ -1,44 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ACTION_BLENDIN_H
#define OSGANIMATION_ACTION_BLENDIN_H
#include <osgAnimation/Action>
#include <osgAnimation/Export>
namespace osgAnimation {
/// blend in from 0 to weight in duration
class OSGANIMATION_EXPORT ActionBlendIn : public Action
{
public:
META_Action(osgAnimation, ActionBlendIn);
ActionBlendIn();
ActionBlendIn(const ActionBlendIn& a, const osg::CopyOp& c);
ActionBlendIn(Animation* animation, double duration, double weight);
double getWeight() const { return _weight;}
Animation* getAnimation() { return _animation.get(); }
void computeWeight(unsigned int frame);
protected:
double _weight;
osg::ref_ptr<Animation> _animation;
};
}
#endif

View File

@@ -1,45 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ACTION_BLENDOUT_H
#define OSGANIMATION_ACTION_BLENDOUT_H
#include <osgAnimation/Action>
#include <osgAnimation/Export>
namespace osgAnimation {
/// blend out from weight to 0 in duration
class OSGANIMATION_EXPORT ActionBlendOut : public Action
{
public:
META_Action(osgAnimation, ActionBlendOut);
ActionBlendOut();
ActionBlendOut(const ActionBlendOut& a, const osg::CopyOp& c);
ActionBlendOut(Animation* animation, double duration);
Animation* getAnimation() { return _animation.get(); }
double getWeight() const { return _weight;}
void computeWeight(unsigned int frame);
protected:
double _weight;
osg::ref_ptr<Animation> _animation;
};
}
#endif

View File

@@ -1,41 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ACTION_CALLBACK_H
#define OSGANIMATION_ACTION_CALLBACK_H
#include <osgAnimation/Export>
#include <osgAnimation/Action>
namespace osgAnimation
{
/** Callback used to run new action on the timeline.*/
class OSGANIMATION_EXPORT RunAction : public Action::Callback
{
public:
RunAction(Action* a, int priority = 0) : _action(a), _priority(priority) {}
virtual void operator()(Action* action, ActionVisitor* visitor);
Action* getAction() const { return _action.get(); }
int getPriority() const { return _priority; }
protected:
osg::ref_ptr<Action> _action;
int _priority;
};
}
#endif

View File

@@ -1,57 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ACTION_STRIPANIMATION_H
#define OSGANIMATION_ACTION_STRIPANIMATION_H
#include <osgAnimation/Action>
#include <osgAnimation/Export>
#include <osgAnimation/FrameAction>
#include <osgAnimation/ActionBlendIn>
#include <osgAnimation/ActionBlendOut>
#include <osgAnimation/ActionAnimation>
namespace osgAnimation
{
// encapsulate animation with blend in blend out for classic usage
class OSGANIMATION_EXPORT ActionStripAnimation : public Action
{
public:
META_Action(osgAnimation, ActionStripAnimation);
ActionStripAnimation() {}
ActionStripAnimation(const ActionStripAnimation& a, const osg::CopyOp& c);
ActionStripAnimation(Animation* animation, double blendInDuration = 0.0, double blendOutDuration = 0.0, double blendInWeightTarget = 1.0 );
ActionAnimation* getAnimation();
ActionBlendIn* getBlendIn();
ActionBlendOut* getBlendOut();
const ActionAnimation* getAnimation() const;
const ActionBlendIn* getBlendIn() const;
const ActionBlendOut* getBlendOut() const;
unsigned int getBlendOutStartFrame() const;
unsigned int getLoop() const;
void setLoop(unsigned int loop);
void traverse(ActionVisitor& visitor);
protected:
typedef std::pair<unsigned int, osg::ref_ptr<ActionBlendOut> > FrameBlendOut;
osg::ref_ptr<ActionBlendIn> _blendIn;
FrameBlendOut _blendOut;
osg::ref_ptr<ActionAnimation> _animation;
};
}
#endif

View File

@@ -1,117 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ACTIONVISITOR_H
#define OSGANIMATION_ACTIONVISITOR_H
#include <vector>
#include <osgAnimation/Export>
#include <osg/Referenced>
#include <osgAnimation/FrameAction>
namespace osgAnimation
{
class Timeline;
class Action;
class ActionBlendIn;
class ActionBlendOut;
class ActionAnimation;
class ActionStripAnimation;
#define META_ActionVisitor(library,name) \
virtual const char* libraryName() const { return #library; }\
virtual const char* className() const { return #name; }
class OSGANIMATION_EXPORT ActionVisitor : public osg::Referenced
{
public:
META_ActionVisitor(osgAnimation, ActionVisitor);
ActionVisitor();
void traverse(Action& visitor);
void pushFrameActionOnStack(const FrameAction& fa);
void popFrameAction();
void pushTimelineOnStack(Timeline* tm);
void popTimeline();
Timeline* getCurrentTimeline();
void setCurrentLayer(int layer) { _currentLayer = layer;}
int getCurrentLayer() const { return _currentLayer; }
const std::vector<FrameAction>& getStackedFrameAction() const { return _stackFrameAction; }
virtual void apply(Action& action);
virtual void apply(Timeline& tm);
virtual void apply(ActionBlendIn& action);
virtual void apply(ActionBlendOut& action);
virtual void apply(ActionAnimation& action);
virtual void apply(ActionStripAnimation& action);
protected:
std::vector<FrameAction> _stackFrameAction;
std::vector<Timeline*> _stackTimeline;
int _currentLayer;
};
class OSGANIMATION_EXPORT UpdateActionVisitor : public osgAnimation::ActionVisitor
{
protected:
unsigned int _frame;
unsigned int _currentAnimationPriority;
public:
META_ActionVisitor(osgAnimation, UpdateActionVisitor);
UpdateActionVisitor();
void setFrame(unsigned int frame) { _frame = frame;}
bool isActive(Action& action) const;
unsigned int getLocalFrame() const;
void apply(Timeline& action);
void apply(Action& action);
void apply(ActionBlendIn& action);
void apply(ActionBlendOut& action);
void apply(ActionAnimation& action);
void apply(ActionStripAnimation& action);
};
class OSGANIMATION_EXPORT ClearActionVisitor : public osgAnimation::ActionVisitor
{
public:
enum ClearType {
BEFORE_FRAME,
AFTER_FRAME
};
META_ActionVisitor(osgAnimation, ClearActionVisitor);
ClearActionVisitor(ClearType type = BEFORE_FRAME);
void setFrame(unsigned int frame) { _frame = frame;}
void apply(Timeline& action);
void apply(Action& action);
protected:
unsigned int _frame;
std::vector<osg::ref_ptr<Action> > _remove;
ClearType _clearType;
};
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -31,7 +31,7 @@ namespace osgAnimation
META_Object(osgAnimation, Animation) META_Object(osgAnimation, Animation)
Animation() : _duration(0), _weight(0), _startTime(0), _playmode(LOOP) {} Animation() : _duration(0), _weight(0), _startTime(0), _playmode(LOOP) {}
Animation(const osgAnimation::Animation&, const osg::CopyOp&); Animation(const osgAnimation::Animation& anim, const osg::CopyOp&);
enum PlayMode enum PlayMode
{ {
@@ -71,12 +71,10 @@ namespace osgAnimation
void setWeight (float weight); void setWeight (float weight);
float getWeight() const; float getWeight() const;
bool update (float time, int priority = 0); bool update (float time);
void resetTargets(); void resetTargets();
void setPlaymode (PlayMode mode) { _playmode = mode; } void setPlaymode (PlayMode mode) { _playmode = mode; }
PlayMode getPlayMode() const { return _playmode; }
void setStartTime(float time) { _startTime = time;} void setStartTime(float time) { _startTime = time;}
float getStartTime() const { return _startTime;} float getStartTime() const { return _startTime;}

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -12,10 +12,9 @@
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSGANIMATION_ANIMATION_MANAGER_BASE #ifndef OSGANIMATION_ANIMATION_MANAGER_BASE_H
#define OSGANIMATION_ANIMATION_MANAGER_BASE 1 #define OSGANIMATION_ANIMATION_MANAGER_BASE_H
#include <osgAnimation/LinkVisitor>
#include <osgAnimation/Animation> #include <osgAnimation/Animation>
#include <osgAnimation/Export> #include <osgAnimation/Export>
#include <osg/FrameStamp> #include <osg/FrameStamp>
@@ -34,8 +33,7 @@ namespace osgAnimation
AnimationManagerBase(const AnimationManagerBase& b, const osg::CopyOp& copyop= osg::CopyOp::SHALLOW_COPY); AnimationManagerBase(const AnimationManagerBase& b, const osg::CopyOp& copyop= osg::CopyOp::SHALLOW_COPY);
virtual ~AnimationManagerBase(); virtual ~AnimationManagerBase();
virtual void buildTargetReference(); virtual void buildTargetReference();
virtual void registerAnimation (Animation*); virtual void registerAnimation (Animation* animation);
virtual void unregisterAnimation (Animation*);
virtual void link(osg::Node* subgraph); virtual void link(osg::Node* subgraph);
virtual void update(double t) = 0; virtual void update(double t) = 0;
virtual bool needToLink() const; virtual bool needToLink() const;
@@ -44,26 +42,16 @@ namespace osgAnimation
/** Callback method called by the NodeVisitor when visiting a node.*/ /** Callback method called by the NodeVisitor when visiting a node.*/
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv); virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
/** Reset the value of targets /// Operation that must be done each frame
this Operation must be done each frame */
void clearTargets(); void clearTargets();
void normalizeTargets();
LinkVisitor* getOrCreateLinkVisitor();
void setLinkVisitor(LinkVisitor*);
/// set a flag to define the behaviour
void setAutomaticLink(bool);
bool isAutomaticLink() const;
void dirty();
protected: protected:
osg::ref_ptr<LinkVisitor> _linker;
AnimationList _animations; AnimationList _animations;
TargetSet _targets; TargetSet _targets;
bool _needToLink; bool _needToLink;
bool _automaticLink;
}; };
} }
#endif #endif

View File

@@ -1,72 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_ANIMATION_UPDATE_CALLBACK
#define OSGANIMATION_ANIMATION_UPDATE_CALLBACK 1
#include <osg/Object>
#include <osgAnimation/Channel>
#include <osgAnimation/Animation>
#include <string>
namespace osgAnimation
{
class AnimationUpdateCallbackBase : public virtual osg::Object
{
public:
virtual bool link(Channel* channel) = 0;
virtual int link(Animation* animation) = 0;
};
template <class T>
class AnimationUpdateCallback : public AnimationUpdateCallbackBase, public T
{
public:
AnimationUpdateCallback() {}
AnimationUpdateCallback(const std::string& name) { T::setName(name);}
AnimationUpdateCallback(const AnimationUpdateCallback& apc,const osg::CopyOp& copyop): T(apc, copyop) {}
META_Object(osgAnimation, AnimationUpdateCallback<T>);
const std::string& getName() const { return T::getName(); }
bool link(Channel* channel) { return 0; }
int link(Animation* animation)
{
if (T::getName().empty())
{
osg::notify(osg::WARN) << "An update callback has no name, it means it could link only with \"\" named Target, often an error, discard" << std::endl;
return 0;
}
int nbLinks = 0;
for (ChannelList::iterator it = animation->getChannels().begin();
it != animation->getChannels().end();
++it)
{
std::string targetName = (*it)->getTargetName();
if (targetName == T::getName())
{
AnimationUpdateCallbackBase* a = this;
a->link((*it).get());
nbLinks++;
}
}
return nbLinks;
}
};
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -10,26 +10,39 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
* */
* Authors:
* Cedric Pinson <cedric.pinson@plopbyte.net>
* Michael Platings <mplatings@pixelpower.com>
*/
#ifndef OSGANIMATION_BONE #ifndef OSGANIMATION_BONE_H
#define OSGANIMATION_BONE 1 #define OSGANIMATION_BONE_H
#include <osg/MatrixTransform> #include <osg/Transform>
#include <osg/Quat>
#include <osg/Vec3>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Notify>
#include <osg/io_utils>
#include <osgAnimation/Export> #include <osgAnimation/Export>
#include <osgAnimation/Target>
#include <osgAnimation/Sampler>
#include <osgAnimation/Channel>
#include <osgAnimation/Keyframe>
#include <osgAnimation/UpdateCallback>
#include <osgAnimation/Animation>
#include <osgAnimation/AnimationManagerBase>
#include <osgAnimation/VertexInfluence>
namespace osgAnimation namespace osgAnimation
{ {
// A bone can't have more than one parent Bone, so sharing a part of Bone's hierarchy // A bone can't have more than one parent Bone, so sharing a part of Bone's hierarchy
// makes no sense. You can share the entire hierarchy but not only a part of it. // has not sense. You can share the entire hierarchie but not only a part of
class OSGANIMATION_EXPORT Bone : public osg::MatrixTransform class OSGANIMATION_EXPORT Bone : public osg::Transform
{ {
public: public:
typedef osg::ref_ptr<Bone> PointerType;
typedef std::map<std::string, PointerType > BoneMap;
typedef osg::Matrix MatrixType; typedef osg::Matrix MatrixType;
META_Node(osgAnimation, Bone); META_Node(osgAnimation, Bone);
@@ -38,24 +51,230 @@ namespace osgAnimation
void setDefaultUpdateCallback(const std::string& name = ""); void setDefaultUpdateCallback(const std::string& name = "");
struct BoneMapVisitor : public osg::NodeVisitor
{
BoneMap _map;
BoneMapVisitor(): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}
META_NodeVisitor("osgAnimation","BoneMapVisitor")
void apply(osg::Node&) { return; }
void apply(osg::Transform& node)
{
Bone* bone = dynamic_cast<Bone*>(&node);
if (bone)
{
_map[bone->getName()] = bone;
traverse(node);
}
}
};
struct FindNearestParentAnimationManager : public osg::NodeVisitor
{
osg::ref_ptr<osgAnimation::AnimationManagerBase> _manager;
FindNearestParentAnimationManager() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS) {}
void apply(osg::Node& node)
{
if (_manager.valid())
return;
osg::NodeCallback* callback = node.getUpdateCallback();
while (callback)
{
_manager = dynamic_cast<osgAnimation::AnimationManagerBase*>(callback);
if (_manager.valid())
return;
callback = callback->getNestedCallback();
}
traverse(node);
}
};
class OSGANIMATION_EXPORT UpdateBone : public AnimationUpdateCallback
{
public:
osg::ref_ptr<osgAnimation::Vec3Target> _position;
osg::ref_ptr<osgAnimation::QuatTarget> _quaternion;
osg::ref_ptr<osgAnimation::Vec3Target> _scale;
public:
META_Object(osgAnimation, UpdateBone);
UpdateBone(const UpdateBone& apc,const osg::CopyOp& copyop);
UpdateBone(const std::string& name = "")
{
setName(name);
_quaternion = new osgAnimation::QuatTarget;
_position = new osgAnimation::Vec3Target;
_scale = new osgAnimation::Vec3Target;
}
void update(osgAnimation::Bone& bone)
{
bone.setTranslation(_position->getValue());
bone.setRotation(_quaternion->getValue());
bone.setScale(_scale->getValue());
bone.dirtyBound();
}
bool needLink() const
{
// the idea is to return true if nothing is linked
return !((_position->getCount() + _quaternion->getCount() + _scale->getCount()) > 3);
}
bool link(osgAnimation::Channel* channel)
{
if (channel->getName().find("quaternion") != std::string::npos)
{
osgAnimation::QuatSphericalLinearChannel* qc = dynamic_cast<osgAnimation::QuatSphericalLinearChannel*>(channel);
if (qc)
{
qc->setTarget(_quaternion.get());
return true;
}
}
else if (channel->getName().find("position") != std::string::npos)
{
osgAnimation::Vec3LinearChannel* vc = dynamic_cast<osgAnimation::Vec3LinearChannel*>(channel);
if (vc)
{
vc->setTarget(_position.get());
return true;
}
}
else if (channel->getName().find("scale") != std::string::npos)
{
osgAnimation::Vec3LinearChannel* vc = dynamic_cast<osgAnimation::Vec3LinearChannel*>(channel);
if (vc)
{
vc->setTarget(_scale.get());
return true;
}
}
else
{
std::cerr << "Channel " << channel->getName() << " does not contain a valid symbolic name for this class" << std::endl;
}
return false;
}
/** Callback method called by the NodeVisitor when visiting a node.*/
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
if (nv && nv->getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
{
Bone* b = dynamic_cast<Bone*>(node);
if (b && !_manager.valid())
{
FindNearestParentAnimationManager finder;
if (b->getParents().size() > 1)
{
osg::notify(osg::WARN) << "A Bone should not have multi parent ( " << b->getName() << " ) has parents ";
osg::notify(osg::WARN) << "( " << b->getParents()[0]->getName();
for (int i = 1; i < (int)b->getParents().size(); i++)
osg::notify(osg::WARN) << ", " << b->getParents()[i]->getName();
osg::notify(osg::WARN) << ")" << std::endl;
return;
}
b->getParents()[0]->accept(finder);
if (!finder._manager.valid())
{
osg::notify(osg::WARN) << "Warning can't update Bone, path to parent AnimationManagerBase not found" << std::endl;
return;
}
_manager = finder._manager.get();
}
updateLink();
update(*b);
}
traverse(node,nv);
}
};
virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const;
virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const;
Bone* getBoneParent(); Bone* getBoneParent();
const Bone* getBoneParent() const; const Bone* getBoneParent() const;
const osg::Matrix& getMatrixInBoneSpace() const { return getMatrix();} void setTranslation(const osg::Vec3& trans) { _position = trans;}
void setRotation(const osg::Quat& quat) { _rotation = quat;}
void setScale(const osg::Vec3& scale) { _scale = scale;}
const osg::Vec3& getTranslation() const { return _position;}
const osg::Quat& getRotation() const { return _rotation;}
osg::Matrix getMatrixInBoneSpace() const { return (osg::Matrix(getRotation())) * osg::Matrix::translate(getTranslation()) * _bindInBoneSpace;}
const osg::Matrix& getBindMatrixInBoneSpace() const { return _bindInBoneSpace; }
const osg::Matrix& getMatrixInSkeletonSpace() const { return _boneInSkeletonSpace; } const osg::Matrix& getMatrixInSkeletonSpace() const { return _boneInSkeletonSpace; }
const osg::Matrix& getInvBindMatrixInSkeletonSpace() const { return _invBindInSkeletonSpace;} const osg::Matrix& getInvBindMatrixInSkeletonSpace() const { return _invBindInSkeletonSpace;}
void setMatrixInSkeletonSpace(const osg::Matrix& matrix) { _boneInSkeletonSpace = matrix; } void setMatrixInSkeletonSpace(const osg::Matrix& matrix) { _boneInSkeletonSpace = matrix; }
void setInvBindMatrixInSkeletonSpace(const osg::Matrix& matrix) { _invBindInSkeletonSpace = matrix; } void setBindMatrixInBoneSpace(const osg::Matrix& matrix)
{
_bindInBoneSpace = matrix;
_needToRecomputeBindMatrix = true;
}
inline bool needToComputeBindMatrix() { return _needToRecomputeBindMatrix;}
virtual void computeBindMatrix();
bool needLink() const;
void setNeedToComputeBindMatrix(bool state) { _needToRecomputeBindMatrix = state; }
/** Add Node to Group.
* If node is not NULL and is not contained in Group then increment its
* reference count, add it to the child list and dirty the bounding
* sphere to force it to recompute on next getBound() and return true for success.
* Otherwise return false. Scene nodes can't be added as child nodes.
*/
virtual bool addChild( Node *child );
BoneMap getBoneMap();
protected: protected:
osg::Vec3 _position;
osg::Quat _rotation;
osg::Vec3 _scale;
// flag to recompute bind pose
bool _needToRecomputeBindMatrix;
// bind data // bind data
osg::Matrix _bindInBoneSpace;
osg::Matrix _invBindInSkeletonSpace; osg::Matrix _invBindInSkeletonSpace;
// bone updated // bone updated
osg::Matrix _boneInSkeletonSpace; osg::Matrix _boneInSkeletonSpace;
}; };
typedef std::map<std::string, osg::ref_ptr<Bone> > BoneMap;
inline bool Bone::computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor*) const
{
if (_referenceFrame==RELATIVE_RF)
matrix.preMult(getMatrixInBoneSpace());
else
matrix = getMatrixInBoneSpace();
return true;
}
inline bool Bone::computeWorldToLocalMatrix(osg::Matrix& matrix,osg::NodeVisitor*) const
{
if (_referenceFrame==RELATIVE_RF)
matrix.postMult(osg::Matrix::inverse(getMatrixInBoneSpace()));
else
matrix = osg::Matrix::inverse(getMatrixInBoneSpace());
return true;
}
} }
#endif #endif

View File

@@ -1,42 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*
* Authors:
* Cedric Pinson <cedric.pinson@plopbyte.net>
*/
#ifndef OSGANIMATION_BONEMAP_VISITOR
#define OSGANIMATION_BONEMAP_VISITOR 1
#include <osgAnimation/Export>
#include <osgAnimation/Bone>
#include <osg/NodeVisitor>
namespace osgAnimation
{
class OSGANIMATION_EXPORT BoneMapVisitor : public osg::NodeVisitor
{
public:
META_NodeVisitor("osgAnimation","BoneMapVisitor")
BoneMapVisitor();
void apply(osg::Node&);
void apply(osg::Transform& node);
const BoneMap& getBoneMap() const;
protected:
BoneMap _map;
};
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -10,11 +10,7 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
* */
* Authors:
* Cedric Pinson <cedric.pinson@plopbyte.net>
* Michael Platings <mplatings@pixelpower.com>
*/
#ifndef OSGANIMATION_CHANNEL_H #ifndef OSGANIMATION_CHANNEL_H
#define OSGANIMATION_CHANNEL_H #define OSGANIMATION_CHANNEL_H
@@ -33,14 +29,11 @@ namespace osgAnimation
public: public:
Channel(); Channel();
Channel(const Channel& channel);
virtual ~Channel(); virtual ~Channel();
virtual Channel* clone() const = 0;
virtual void update(float time, float weight, int priority) = 0; virtual void update(float time) = 0;
virtual void reset() = 0; virtual void reset() = 0;
virtual Target* getTarget() = 0; virtual Target* getTarget() = 0;
virtual bool setTarget(Target*) = 0;
const std::string& getName() const; const std::string& getName() const;
void setName(const std::string& name); void setName(const std::string& name);
@@ -51,18 +44,17 @@ namespace osgAnimation
const std::string& getTargetName() const; const std::string& getTargetName() const;
void setTargetName(const std::string& name); void setTargetName(const std::string& name);
float getWeight() const;
void setWeight(float w);
virtual Sampler* getSampler() = 0; virtual Sampler* getSampler() = 0;
virtual const Sampler* getSampler() const = 0; virtual const Sampler* getSampler() const = 0;
// create a keyframe container from current target value
// with one key only, can be used for debug or to create
// easily a default channel from an existing one
virtual bool createKeyframeContainerFromTargetValue() = 0;
protected: protected:
std::string _targetName; std::string _targetName;
std::string _name; std::string _name;
float _weight;
}; };
@@ -74,19 +66,8 @@ namespace osgAnimation
typedef typename SamplerType::UsingType UsingType; typedef typename SamplerType::UsingType UsingType;
typedef TemplateTarget<UsingType> TargetType; typedef TemplateTarget<UsingType> TargetType;
typedef TemplateKeyframeContainer<typename SamplerType::KeyframeType> KeyframeContainerType; typedef TemplateKeyframeContainer<typename SamplerType::KeyframeType> KeyframeContainerType;
Channel* clone() const { return new TemplateChannel<SamplerType>(*this); }
TemplateChannel (const TemplateChannel& channel) : TemplateChannel (SamplerType* s = 0,TargetType* target = 0)
Channel(channel)
{
if (channel.getTargetTyped())
_target = new TargetType(*channel.getTargetTyped());
if (channel.getSamplerTyped())
_sampler = new SamplerType(*channel.getSamplerTyped());
}
TemplateChannel (SamplerType* s = 0,TargetType* target = 0)
{ {
if (target) if (target)
_target = target; _target = target;
@@ -95,42 +76,20 @@ namespace osgAnimation
_sampler = s; _sampler = s;
} }
virtual bool createKeyframeContainerFromTargetValue()
{
if (!_target.valid()) // no target it does not make sense to do it
{
return false;
}
// create a key from current target value
typename KeyframeContainerType::KeyType key(0, _target->getValue());
// recreate the keyframe container
getOrCreateSampler()->setKeyframeContainer(0);
getOrCreateSampler()->getOrCreateKeyframeContainer();
// add the key
_sampler->getKeyframeContainerTyped()->push_back(key);
return true;
}
virtual ~TemplateChannel() {} virtual ~TemplateChannel() {}
virtual void update(float time, float weight, int priority) virtual void update(float time)
{ {
// skip if weight == 0 // skip if weight == 0
if (weight < 1e-4) if (_weight < 1e-4)
return; return;
typename SamplerType::UsingType value; typename SamplerType::UsingType value;
_sampler->getValueAt(time, value); _sampler->getValueAt(time, value);
_target->update(weight, value, priority); _target->update(_weight, value);
} }
virtual void reset() { _target->reset(); } virtual void reset() { _target->reset(); }
virtual Target* getTarget() { return _target.get();} virtual Target* getTarget() { return _target.get();}
virtual bool setTarget(Target* target)
{
_target = dynamic_cast<TargetType*>(target);
return _target.get() == target;
}
SamplerType* getOrCreateSampler() SamplerType* getOrCreateSampler()
{ {
if (!_sampler.valid()) if (!_sampler.valid())
_sampler = new SamplerType; _sampler = new SamplerType;
@@ -145,7 +104,6 @@ namespace osgAnimation
void setSampler(SamplerType* sampler) { _sampler = sampler; } void setSampler(SamplerType* sampler) { _sampler = sampler; }
TargetType* getTargetTyped() { return _target.get(); } TargetType* getTargetTyped() { return _target.get(); }
const TargetType* getTargetTyped() const { return _target.get(); }
void setTarget(TargetType* target) { _target = target; } void setTarget(TargetType* target) { _target = target; }
virtual float getStartTime() const { return _sampler->getStartTime(); } virtual float getStartTime() const { return _sampler->getStartTime(); }
@@ -158,21 +116,13 @@ namespace osgAnimation
typedef std::vector<osg::ref_ptr<osgAnimation::Channel> > ChannelList; typedef std::vector<osg::ref_ptr<osgAnimation::Channel> > ChannelList;
typedef TemplateChannel<DoubleStepSampler> DoubleStepChannel;
typedef TemplateChannel<FloatStepSampler> FloatStepChannel;
typedef TemplateChannel<Vec2StepSampler> Vec2StepChannel;
typedef TemplateChannel<Vec3StepSampler> Vec3StepChannel;
typedef TemplateChannel<Vec4StepSampler> Vec4StepChannel;
typedef TemplateChannel<QuatStepSampler> QuatStepChannel;
typedef TemplateChannel<DoubleLinearSampler> DoubleLinearChannel; typedef TemplateChannel<DoubleLinearSampler> DoubleLinearChannel;
typedef TemplateChannel<FloatLinearSampler> FloatLinearChannel; typedef TemplateChannel<FloatLinearSampler> FloatLinearChannel;
typedef TemplateChannel<Vec2LinearSampler> Vec2LinearChannel; typedef TemplateChannel<Vec2LinearSampler> Vec2LinearChannel;
typedef TemplateChannel<Vec3LinearSampler> Vec3LinearChannel; typedef TemplateChannel<Vec3LinearSampler> Vec3LinearChannel;
typedef TemplateChannel<Vec4LinearSampler> Vec4LinearChannel; typedef TemplateChannel<Vec4LinearSampler> Vec4LinearChannel;
typedef TemplateChannel<QuatSphericalLinearSampler> QuatSphericalLinearChannel; typedef TemplateChannel<QuatSphericalLinearSampler> QuatSphericalLinearChannel;
typedef TemplateChannel<MatrixLinearSampler> MatrixLinearChannel;
typedef TemplateChannel<FloatCubicBezierSampler> FloatCubicBezierChannel; typedef TemplateChannel<FloatCubicBezierSampler> FloatCubicBezierChannel;
typedef TemplateChannel<DoubleCubicBezierSampler> DoubleCubicBezierChannel; typedef TemplateChannel<DoubleCubicBezierSampler> DoubleCubicBezierChannel;

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -12,62 +12,39 @@
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSGANIMATION_CUBIC_BEZIER #ifndef OSGANIMATION_CUBIC_BEZIER_H
#define OSGANIMATION_CUBIC_BEZIER 1 #define OSGANIMATION_CUBIC_BEZIER_H
#include <osg/Vec2> #include <osg/Vec2>
#include <osg/Vec3> #include <osg/Vec3>
#include <osg/Vec4> #include <osg/Vec4>
#include <osg/Quat>
namespace osgAnimation namespace osgAnimation
{ {
template <class T> template <class T>
class TemplateCubicBezier struct TemplateCubicBezier
{ {
public: T mPoint[3];
const T& getP0() const { return mPoint[0];}
const T& getP1() const { return mPoint[1];}
const T& getP2() const { return mPoint[2];}
TemplateCubicBezier(const T& v0, const T& v1, const T& v2)
{
mPoint[0] = v0;
mPoint[1] = v1;
mPoint[2] = v2;
}
TemplateCubicBezier() {} TemplateCubicBezier() {}
TemplateCubicBezier(const T& p, const T& i, const T& o) : _position(p), _controlPointIn(i), _controlPointOut(o) const T& getPosition() const { return mPoint[0];}
{ const T& getTangentPoint1() const { return mPoint[1];}
} const T& getTangentPoint2() const { return mPoint[2];}
// Constructor with value only
TemplateCubicBezier(const T& p) : _position(p), _controlPointIn(p), _controlPointOut(p)
{
}
const T& getPosition() const { return _position;}
const T& getControlPointIn() const { return _controlPointIn;}
const T& getControlPointOut() const { return _controlPointOut;}
T& getPosition() { return _position;}
T& getControlPointIn() { return _controlPointIn;}
T& getControlPointOut() { return _controlPointOut;}
void setPosition(const T& v) {_position = v;}
void setControlPointIn(const T& v) {_controlPointIn = v;}
void setControlPointOut(const T& v) {_controlPointOut = v;}
// steaming operators.
friend std::ostream& operator << (std::ostream& output, const TemplateCubicBezier<T>& tcb)
{
output << tcb._position << " "
<< tcb._controlPointIn << " "
<< tcb._controlPointOut;
return output; // to enable cascading
}
friend std::istream& operator >> (std::istream& input, TemplateCubicBezier<T>& tcb)
{
input >> tcb._position >> tcb._controlPointIn >> tcb._controlPointOut;
return input;
}
protected:
T _position, _controlPointIn, _controlPointOut;
}; };
typedef TemplateCubicBezier<float> FloatCubicBezier; typedef TemplateCubicBezier<float> FloatCubicBezier;
typedef TemplateCubicBezier<double> DoubleCubicBezier; typedef TemplateCubicBezier<double> DoubleCubicBezier;
typedef TemplateCubicBezier<osg::Vec2> Vec2CubicBezier; typedef TemplateCubicBezier<osg::Vec2> Vec2CubicBezier;

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -10,10 +10,10 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSGANIMATION_EASE_MOTION #ifndef OSGANIMATION_EASE_MOTION_H
#define OSGANIMATION_EASE_MOTION 1 #define OSGANIMATION_EASE_MOTION_H
#include <osg/Referenced> #include <osg/Referenced>
#include <osg/ref_ptr> #include <osg/ref_ptr>
@@ -21,8 +21,9 @@
#include <osg/Math> #include <osg/Math>
#include <vector> #include <vector>
namespace osgAnimation namespace osgAnimation {
{
struct OutBounceFunction struct OutBounceFunction
{ {
inline static void getValueAt(float t, float& result) inline static void getValueAt(float t, float& result)
@@ -75,12 +76,14 @@ namespace osgAnimation
} }
}; };
/// Linear function /// Linear function
struct LinearFunction struct LinearFunction
{ {
inline static void getValueAt(float t, float& result) { result = t;} inline static void getValueAt(float t, float& result) { result = t;}
}; };
/// Quad function /// Quad function
struct OutQuadFunction struct OutQuadFunction
{ {
@@ -91,47 +94,46 @@ namespace osgAnimation
{ {
inline static void getValueAt(float t, float& result) { result = t*t;} inline static void getValueAt(float t, float& result) { result = t*t;}
}; };
struct InOutQuadFunction struct InOutQuadFunction
{ {
inline static void getValueAt(float t, float& result) inline static void getValueAt(float t, float& result)
{ {
t *= 2.0; t = t * 2.0;
if (t < 1.0) if (t < 1.0)
result = 0.5 * t * t; result = 0.5 * t * t;
else else
{ {
t -= 1.0; t = t - 1.0;
result = - 0.5 * (t * ( t - 2) - 1); result = - 0.5 * t * ( t - 2) - 1;
} }
} }
}; };
/// Cubic function /// Cubic function
struct OutCubicFunction struct OutCubicFunction
{ {
inline static void getValueAt(float t, float& result) { t = t-1.0; result = t*t*t + 1;} inline static void getValueAt(float t, float& result) { t = t-1.0; result = t*t*t + 1;}
}; };
struct InCubicFunction struct InCubicFunction
{ {
inline static void getValueAt(float t, float& result) { result = t*t*t;} inline static void getValueAt(float t, float& result) { result = t*t*t;}
}; };
struct InOutCubicFunction struct InOutCubicFunction
{ {
inline static void getValueAt(float t, float& result) inline static void getValueAt(float t, float& result)
{ {
t *= 2.0f; t = t * 2;
if (t < 1.0f) if (t < 1.0)
result = 0.5f * t * t * t; result = 0.5 * t * t * t;
else { else {
t -= 2.0f; t = t - 2;
result = 0.5 * (t * t * t + 2.0f); result = 0.5 * t * t * t + 2;
} }
} }
}; };
/// Quart function /// Quart function
struct InQuartFunction struct InQuartFunction
{ {
@@ -158,191 +160,7 @@ namespace osgAnimation
} }
}; };
/// Elastic function
struct OutElasticFunction
{
inline static void getValueAt(float t, float& result)
{
result = pow(2.0f, -10.0f * t) * sinf((t - 0.3f / 4.0f) * (2.0f * osg::PI) / 0.3f) + 1.0f;
}
};
struct InElasticFunction
{
inline static void getValueAt(float t, float& result)
{
OutElasticFunction::getValueAt(1.0f - t, result);
result = 1.0f - result;
}
};
struct InOutElasticFunction
{
inline static void getValueAt(float t, float& result)
{
t *= 2.0f;
if (t < 1.0f)
{
t -= 1.0f;
result = -0.5 * (1.0f * pow(2.0f, 10.0f * t) * sinf((t - 0.45f / 4.0f) * (2.0f * osg::PI) / 0.45f));
}
else
{
t -= 1.0f;
result = pow(2.0f, -10.0f * t) * sinf((t - 0.45f / 4.0f) * (2.0f * osg::PI) / 0.45f) * 0.5f + 1.0f;
}
}
};
// Sine function
struct OutSineFunction
{
inline static void getValueAt(float t, float& result)
{
result = sinf(t * (osg::PI / 2.0f));
}
};
struct InSineFunction
{
inline static void getValueAt(float t, float& result)
{
result = -cosf(t * (osg::PI / 2.0f)) + 1.0f;
}
};
struct InOutSineFunction
{
inline static void getValueAt(float t, float& result)
{
result = -0.5f * (cosf((osg::PI * t)) - 1.0f);
}
};
// Back function
struct OutBackFunction
{
inline static void getValueAt(float t, float& result)
{
t -= 1.0f;
result = t * t * ((1.70158 + 1.0f) * t + 1.70158) + 1.0f;
}
};
struct InBackFunction
{
inline static void getValueAt(float t, float& result)
{
result = t * t * ((1.70158 + 1.0f) * t - 1.70158);
}
};
struct InOutBackFunction
{
inline static void getValueAt(float t, float& result)
{
float s = 1.70158 * 1.525f;
t *= 2.0f;
if (t < 1.0f)
{
result = 0.5f * (t * t * ((s + 1.0f) * t - s));
}
else
{
float p = t -= 2.0f;
result = 0.5f * ((p) * t * ((s + 1.0f) * t + s) + 2.0f);
}
}
};
// Circ function
struct OutCircFunction
{
inline static void getValueAt(float t, float& result)
{
t -= 1.0f;
result = sqrt(1.0f - t * t);
}
};
struct InCircFunction
{
inline static void getValueAt(float t, float& result)
{
result = -(sqrt(1.0f - (t * t)) - 1.0f);
}
};
struct InOutCircFunction
{
inline static void getValueAt(float t, float& result)
{
t *= 2.0f;
if (t < 1.0f)
{
result = -0.5f * (sqrt(1.0f - t * t) - 1.0f);
}
else
{
t -= 2.0f;
result = 0.5f * (sqrt(1 - t * t) + 1.0f);
}
}
};
// Expo function
struct OutExpoFunction
{
inline static void getValueAt(float t, float& result)
{
if(t == 1.0f)
{
result = 0.0f;
}
else
{
result = -powf(2.0f, -10.0f * t) + 1.0f;
}
}
};
struct InExpoFunction
{
inline static void getValueAt(float t, float& result)
{
if(t == 0.0f)
{
result = 0.0f;
}
else
{
result = powf(2.0f, 10.0f * (t - 1.0f));
}
}
};
struct InOutExpoFunction
{
inline static void getValueAt(float t, float& result)
{
if(t == 0.0f || t == 1.0f)
{
result = 0.0f;
}
else
{
t *= 2.0f;
if(t < 1.0f)
{
result = 0.5f * powf(2.0f, 10.0f * (t - 1.0f));
}
else
{
result = 0.5f * (-powf(2.0f, -10.0f * (t - 1.0f)) + 2.0f);
}
}
}
};
class Motion : public osg::Referenced class Motion : public osg::Referenced
{ {
@@ -460,7 +278,7 @@ namespace osgAnimation
osg::notify(osg::WARN) << "CompositeMotion::getValueInNormalizedRange no Motion in the CompositeMotion, add motion to have result" << std::endl; osg::notify(osg::WARN) << "CompositeMotion::getValueInNormalizedRange no Motion in the CompositeMotion, add motion to have result" << std::endl;
return; return;
} }
for (MotionList::const_iterator it = _motions.begin(); it != _motions.end(); ++it) for (MotionList::const_iterator it = _motions.begin(); it != _motions.end(); it++)
{ {
const Motion* motion = static_cast<const Motion*>(it->get()); const Motion* motion = static_cast<const Motion*>(it->get());
float durationInRange = motion->getDuration() / getDuration(); float durationInRange = motion->getDuration() / getDuration();
@@ -496,35 +314,13 @@ namespace osgAnimation
typedef MathMotionTemplate<InQuartFunction> InQuartMotion; typedef MathMotionTemplate<InQuartFunction> InQuartMotion;
typedef MathMotionTemplate<InOutQuartFunction> InOutQuartMotion; typedef MathMotionTemplate<InOutQuartFunction> InOutQuartMotion;
// bounce // bounce
typedef MathMotionTemplate<OutBounceFunction > OutBounceMotion; typedef MathMotionTemplate<OutBounceFunction > OutBounceMotion;
typedef MathMotionTemplate<InBounceFunction> InBounceMotion; typedef MathMotionTemplate<InBounceFunction> InBounceMotion;
typedef MathMotionTemplate<InOutBounceFunction> InOutBounceMotion; typedef MathMotionTemplate<InOutBounceFunction> InOutBounceMotion;
// elastic
typedef MathMotionTemplate<OutElasticFunction > OutElasticMotion;
typedef MathMotionTemplate<InElasticFunction > InElasticMotion;
typedef MathMotionTemplate<InOutElasticFunction > InOutElasticMotion;
// sine
typedef MathMotionTemplate<OutSineFunction > OutSineMotion;
typedef MathMotionTemplate<InSineFunction > InSineMotion;
typedef MathMotionTemplate<InOutSineFunction > InOutSineMotion;
// back
typedef MathMotionTemplate<OutBackFunction > OutBackMotion;
typedef MathMotionTemplate<InBackFunction > InBackMotion;
typedef MathMotionTemplate<InOutBackFunction > InOutBackMotion;
// circ
typedef MathMotionTemplate<OutCircFunction > OutCircMotion;
typedef MathMotionTemplate<InCircFunction > InCircMotion;
typedef MathMotionTemplate<InOutCircFunction > InOutCircMotion;
// expo
typedef MathMotionTemplate<OutExpoFunction > OutExpoMotion;
typedef MathMotionTemplate<InExpoFunction > InExpoMotion;
typedef MathMotionTemplate<InOutExpoFunction > InOutExpoMotion;
} }
#endif #endif

View File

@@ -1,26 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_FRAMEACTION_H
#define OSGANIMATION_FRAMEACTION_H
#include <map>
#include <osg/ref_ptr>
namespace osgAnimation
{
class Action;
typedef std::pair<unsigned int, osg::ref_ptr<Action> > FrameAction;
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -10,16 +10,13 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
* */
* Authors:
* Cedric Pinson <cedric.pinson@plopbyte.net>
* Michael Platings <mplatings@pixelpower.com>
*/
#ifndef OSGANIMATION_INTERPOLATOR #ifndef OSGANIMATION_INTERPOLATOR_H
#define OSGANIMATION_INTERPOLATOR 1 #define OSGANIMATION_INTERPOLATOR_H
#include <osg/Notify> #include <osg/Notify>
#include <osgAnimation/Interpolator>
#include <osgAnimation/Keyframe> #include <osgAnimation/Keyframe>
namespace osgAnimation namespace osgAnimation
@@ -64,32 +61,6 @@ namespace osgAnimation
}; };
template <class TYPE, class KEY=TYPE>
class TemplateStepInterpolator : public TemplateInterpolatorBase<TYPE,KEY>
{
public:
TemplateStepInterpolator() {}
void getValue(const TemplateKeyframeContainer<KEY>& keyframes, float time, TYPE& result) const
{
if (time >= keyframes.back().getTime())
{
result = keyframes.back().getValue();
return;
}
else if (time <= keyframes.front().getTime())
{
result = keyframes.front().getValue();
return;
}
int i = getKeyIndexFromTime(keyframes,time);
result = keyframes[i].getValue();
}
};
template <class TYPE, class KEY=TYPE> template <class TYPE, class KEY=TYPE>
class TemplateLinearInterpolator : public TemplateInterpolatorBase<TYPE,KEY> class TemplateLinearInterpolator : public TemplateInterpolatorBase<TYPE,KEY>
{ {
@@ -205,22 +176,14 @@ namespace osgAnimation
float t2 = t * t; float t2 = t * t;
TYPE v0 = keyframes[i].getValue().getPosition() * one_minus_t3; TYPE v0 = keyframes[i].getValue().getPosition() * one_minus_t3;
TYPE v1 = keyframes[i].getValue().getControlPointIn() * (3.0 * t * one_minus_t2); TYPE v1 = keyframes[i].getValue().getTangentPoint1() * (3.0 * t * one_minus_t2);
TYPE v2 = keyframes[i].getValue().getControlPointOut() * (3.0 * t2 * one_minus_t); TYPE v2 = keyframes[i].getValue().getTangentPoint2() * (3.0 * t2 * one_minus_t);
TYPE v3 = keyframes[i+1].getValue().getPosition() * (t2 * t); TYPE v3 = keyframes[i+1].getValue().getPosition() * (t2 * t);
result = v0 + v1 + v2 + v3; result = v0 + v1 + v2 + v3;
} }
}; };
typedef TemplateStepInterpolator<double, double> DoubleStepInterpolator;
typedef TemplateStepInterpolator<float, float> FloatStepInterpolator;
typedef TemplateStepInterpolator<osg::Vec2, osg::Vec2> Vec2StepInterpolator;
typedef TemplateStepInterpolator<osg::Vec3, osg::Vec3> Vec3StepInterpolator;
typedef TemplateStepInterpolator<osg::Vec3, Vec3Packed> Vec3PackedStepInterpolator;
typedef TemplateStepInterpolator<osg::Vec4, osg::Vec4> Vec4StepInterpolator;
typedef TemplateStepInterpolator<osg::Quat, osg::Quat> QuatStepInterpolator;
typedef TemplateLinearInterpolator<double, double> DoubleLinearInterpolator; typedef TemplateLinearInterpolator<double, double> DoubleLinearInterpolator;
typedef TemplateLinearInterpolator<float, float> FloatLinearInterpolator; typedef TemplateLinearInterpolator<float, float> FloatLinearInterpolator;
typedef TemplateLinearInterpolator<osg::Vec2, osg::Vec2> Vec2LinearInterpolator; typedef TemplateLinearInterpolator<osg::Vec2, osg::Vec2> Vec2LinearInterpolator;
@@ -228,7 +191,6 @@ namespace osgAnimation
typedef TemplateLinearInterpolator<osg::Vec3, Vec3Packed> Vec3PackedLinearInterpolator; typedef TemplateLinearInterpolator<osg::Vec3, Vec3Packed> Vec3PackedLinearInterpolator;
typedef TemplateLinearInterpolator<osg::Vec4, osg::Vec4> Vec4LinearInterpolator; typedef TemplateLinearInterpolator<osg::Vec4, osg::Vec4> Vec4LinearInterpolator;
typedef TemplateSphericalLinearInterpolator<osg::Quat, osg::Quat> QuatSphericalLinearInterpolator; typedef TemplateSphericalLinearInterpolator<osg::Quat, osg::Quat> QuatSphericalLinearInterpolator;
typedef TemplateLinearInterpolator<osg::Matrixf, osg::Matrixf> MatrixLinearInterpolator;
typedef TemplateCubicBezierInterpolator<float, FloatCubicBezier > FloatCubicBezierInterpolator; typedef TemplateCubicBezierInterpolator<float, FloatCubicBezier > FloatCubicBezierInterpolator;
typedef TemplateCubicBezierInterpolator<double, DoubleCubicBezier> DoubleCubicBezierInterpolator; typedef TemplateCubicBezierInterpolator<double, DoubleCubicBezier> DoubleCubicBezierInterpolator;

View File

@@ -23,7 +23,6 @@
#include <osg/Vec4> #include <osg/Vec4>
#include <osg/Vec3> #include <osg/Vec3>
#include <osg/Vec2> #include <osg/Vec2>
#include <osg/Matrixf>
namespace osgAnimation namespace osgAnimation
{ {
@@ -99,9 +98,6 @@ namespace osgAnimation
typedef TemplateKeyframe<float> FloatKeyframe; typedef TemplateKeyframe<float> FloatKeyframe;
typedef TemplateKeyframeContainer<float> FloatKeyframeContainer; typedef TemplateKeyframeContainer<float> FloatKeyframeContainer;
typedef TemplateKeyframe<double> DoubleKeyframe;
typedef TemplateKeyframeContainer<double> DoubleKeyframeContainer;
typedef TemplateKeyframe<osg::Vec2> Vec2Keyframe; typedef TemplateKeyframe<osg::Vec2> Vec2Keyframe;
typedef TemplateKeyframeContainer<osg::Vec2> Vec2KeyframeContainer; typedef TemplateKeyframeContainer<osg::Vec2> Vec2KeyframeContainer;
@@ -115,24 +111,17 @@ namespace osgAnimation
typedef TemplateKeyframe<osg::Quat> QuatKeyframe; typedef TemplateKeyframe<osg::Quat> QuatKeyframe;
typedef TemplateKeyframeContainer<osg::Quat> QuatKeyframeContainer; typedef TemplateKeyframeContainer<osg::Quat> QuatKeyframeContainer;
typedef TemplateKeyframe<osg::Matrixf> MatrixKeyframe;
typedef TemplateKeyframeContainer<osg::Matrixf> MatrixKeyframeContainer;
typedef TemplateKeyframe<Vec3Packed> Vec3PackedKeyframe; typedef TemplateKeyframe<Vec3Packed> Vec3PackedKeyframe;
typedef TemplateKeyframeContainer<Vec3Packed> Vec3PackedKeyframeContainer; typedef TemplateKeyframeContainer<Vec3Packed> Vec3PackedKeyframeContainer;
typedef TemplateKeyframe<FloatCubicBezier> FloatCubicBezierKeyframe; typedef TemplateKeyframe<FloatCubicBezier> FloatCubicBezierKeyframe;
typedef TemplateKeyframeContainer<FloatCubicBezier> FloatCubicBezierKeyframeContainer; typedef TemplateKeyframeContainer<FloatCubicBezier> FloatCubicBezierKeyframeContainer;
typedef TemplateKeyframe<DoubleCubicBezier> DoubleCubicBezierKeyframe; typedef TemplateKeyframe<DoubleCubicBezier> DoubleCubicBezierKeyframe;
typedef TemplateKeyframeContainer<DoubleCubicBezier> DoubleCubicBezierKeyframeContainer; typedef TemplateKeyframeContainer<DoubleCubicBezier> DoubleCubicBezierKeyframeContainer;
typedef TemplateKeyframe<Vec2CubicBezier> Vec2CubicBezierKeyframe; typedef TemplateKeyframe<Vec2CubicBezier> Vec2CubicBezierKeyframe;
typedef TemplateKeyframeContainer<Vec2CubicBezier> Vec2CubicBezierKeyframeContainer; typedef TemplateKeyframeContainer<Vec2CubicBezier> Vec2CubicBezierKeyframeContainer;
typedef TemplateKeyframe<Vec3CubicBezier> Vec3CubicBezierKeyframe; typedef TemplateKeyframe<Vec3CubicBezier> Vec3CubicBezierKeyframe;
typedef TemplateKeyframeContainer<Vec3CubicBezier> Vec3CubicBezierKeyframeContainer; typedef TemplateKeyframeContainer<Vec3CubicBezier> Vec3CubicBezierKeyframeContainer;
typedef TemplateKeyframe<Vec4CubicBezier> Vec4CubicBezierKeyframe; typedef TemplateKeyframe<Vec4CubicBezier> Vec4CubicBezierKeyframe;
typedef TemplateKeyframeContainer<Vec4CubicBezier> Vec4CubicBezierKeyframeContainer; typedef TemplateKeyframeContainer<Vec4CubicBezier> Vec4CubicBezierKeyframeContainer;

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -16,39 +16,37 @@
#define OSGANIMATION_NODE_VISITOR_H #define OSGANIMATION_NODE_VISITOR_H
#include <osg/NodeVisitor> #include <osg/NodeVisitor>
#include <osg/StateSet>
#include <osgAnimation/Animation> #include <osgAnimation/Animation>
#include <osgAnimation/UpdateCallback>
namespace osgAnimation namespace osgAnimation
{ {
class AnimationUpdateCallbackBase;
/** This class is instancied by the AnimationManagerBase, it will link animation target to updatecallback that have the same name struct LinkVisitor : public osg::NodeVisitor
*/
class OSGANIMATION_EXPORT LinkVisitor : public osg::NodeVisitor
{ {
public:
LinkVisitor();
META_NodeVisitor("osgAnimation","LinkVisitor");
void apply(osg::Node& node);
void apply(osg::Geode& node);
AnimationList& getAnimationList();
void reset();
unsigned int getNbLinkedTarget() const { return _nbLinkedTarget; }
protected:
void handle_stateset(osg::StateSet* stateset);
void link(osgAnimation::AnimationUpdateCallbackBase* cb);
// animation list to link
AnimationList _animations; AnimationList _animations;
// number of success link done
unsigned int _nbLinkedTarget; unsigned int _nbLinkedTarget;
LinkVisitor(Animation* animation) : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) { _animations.push_back(animation); _nbLinkedTarget = 0;}
LinkVisitor(const AnimationList& animations) : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) { _animations = animations; _nbLinkedTarget = 0;}
META_NodeVisitor("osgAnimation","LinkVisitor")
void apply(osg::Node& node)
{
osgAnimation::AnimationUpdateCallback* cb = dynamic_cast<osgAnimation::AnimationUpdateCallback*>(node.getUpdateCallback());
if (cb)
{
int result = 0;
for (int i = 0; i < (int)_animations.size(); i++)
{
result += cb->link(_animations[i].get());
_nbLinkedTarget += result;
}
std::cout << "LinkVisitor links " << result << " for \"" << cb->getName() << '"' << std::endl;
}
traverse(node);
}
}; };
} }

View File

@@ -1,154 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_MORPHGEOMETRY_H
#define OSGANIMATION_MORPHGEOMETRY_H
#include <osgAnimation/Export>
#include <osgAnimation/AnimationUpdateCallback>
#include <osg/Geometry>
namespace osgAnimation
{
class OSGANIMATION_EXPORT MorphGeometry : public osg::Geometry
{
public:
enum Method {
NORMALIZED,
RELATIVE
};
class MorphTarget
{
protected:
osg::ref_ptr<osg::Geometry> _geom;
float _weight;
public:
MorphTarget(osg::Geometry* geom, float w = 1.0) : _geom(geom), _weight(w) {}
void setWeight(float weight) { _weight = weight; }
const float getWeight() const { return _weight; }
osg::Geometry* getGeometry() { return _geom.get(); }
const osg::Geometry* getGeometry() const { return _geom.get(); }
void setGeometry(osg::Geometry* geom) { _geom = geom; }
};
typedef std::vector<MorphTarget> MorphTargetList;
struct UpdateVertex : public osg::Drawable::UpdateCallback
{
virtual void update(osg::NodeVisitor*, osg::Drawable* drw)
{
MorphGeometry* geom = dynamic_cast<MorphGeometry*>(drw);
if (!geom)
return;
geom->transformSoftwareMethod();
}
};
MorphGeometry();
MorphGeometry(const osg::Geometry& b);
MorphGeometry(const MorphGeometry& b, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
virtual osg::Object* cloneType() const { return new MorphGeometry(); }
virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new MorphGeometry(*this,copyop); }
virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const MorphGeometry*>(obj)!=NULL; }
virtual const char* libraryName() const { return "osgAnimation"; }
virtual const char* className() const { return "MorphGeometry"; }
virtual void transformSoftwareMethod();
/** Set the morphing method. */
void setMethod(Method method) { _method = method; }
/** Get the morphing method. */
inline Method getMethod() const { return _method; }
/** Set flag for morphing normals. */
void setMorphNormals(bool morphNormals) { _morphNormals = morphNormals; }
/** Get the flag for morphing normals. */
inline bool getMorphNormals() const { return _morphNormals; }
/** Add a \c MorphTarget to the \c MorphGeometry.
* If \c MorphTarget is not \c NULL and is not contained in the \c MorphGeometry
* then increment its reference count, add it to the MorphTargets list and
* dirty the bounding sphere to force it to be recomputed on the next
* call to \c getBound().
* @param morphTarget The \c MorphTarget to be added to the \c MorphGeometry.
* @param weight The weight to be added to the \c MorphGeometry.
* @return \c true for success; \c false otherwise.
*/
virtual void addMorphTarget( osg::Geometry *morphTarget, float weight = 1.0 ) { _morphTargets.push_back(MorphTarget(morphTarget, weight)); _dirty = true; }
void setWeight(unsigned int index, float morphWeight)
{
if (index < _morphTargets.size())
{
_morphTargets[index].setWeight(morphWeight);
dirty();
}
}
/** Set the MorphGeometry dirty.*/
void dirty() { _dirty = true; }
/** Get the list of MorphTargets.*/
const MorphTargetList& getMorphTargetList() const { return _morphTargets; }
/** Get the list of MorphTargets. Warning if you modify this array you will have to call dirty() */
MorphTargetList& getMorphTargetList() { return _morphTargets; }
/** Return the \c MorphTarget at position \c i.*/
inline const MorphTarget& getMorphTarget( unsigned int i ) const { return _morphTargets[i]; }
/** Return the \c MorphTarget at position \c i.*/
inline MorphTarget& getMorphTarget( unsigned int i ) { return _morphTargets[i]; }
protected:
/// Do we need to recalculate the morphed geometry?
bool _dirty;
Method _method;
MorphTargetList _morphTargets;
std::vector<osg::Vec3> _positionSource;
std::vector<osg::Vec3> _normalSource;
/// Do we also morph between normals?
bool _morphNormals;
};
class OSGANIMATION_EXPORT UpdateMorph : public AnimationUpdateCallback<osg::NodeCallback>
{
protected:
std::map<int, osg::ref_ptr<osgAnimation::FloatTarget> > _weightTargets;
public:
META_Object(osgAnimation, UpdateMorph);
UpdateMorph(const std::string& name = "");
UpdateMorph(const UpdateMorph& apc,const osg::CopyOp& copyop);
/** Callback method called by the NodeVisitor when visiting a node.*/
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
bool needLink() const;
bool link(osgAnimation::Channel* channel);
};
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -16,9 +16,8 @@
#define OSGANIMATION_RIGGEOMETRY_H #define OSGANIMATION_RIGGEOMETRY_H
#include <osgAnimation/Export> #include <osgAnimation/Export>
#include <osgAnimation/Skinning>
#include <osgAnimation/Skeleton> #include <osgAnimation/Skeleton>
#include <osgAnimation/RigTransform>
#include <osgAnimation/VertexInfluence>
#include <osg/Geometry> #include <osg/Geometry>
namespace osgAnimation namespace osgAnimation
@@ -29,63 +28,49 @@ namespace osgAnimation
public: public:
RigGeometry(); RigGeometry();
// RigGeometry(const osg::Geometry& b); RigGeometry(const osg::Geometry& b);
RigGeometry(const RigGeometry& b, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY); RigGeometry(const RigGeometry& b, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
META_Object(osgAnimation, RigGeometry); META_Object(osgAnimation, RigGeometry);
void setInfluenceMap(VertexInfluenceMap* vertexInfluenceMap) { _vertexInfluenceMap = vertexInfluenceMap; } void setInfluenceMap(osgAnimation::VertexInfluenceMap* vertexInfluenceMap) { _vertexInfluenceMap = vertexInfluenceMap; }
const VertexInfluenceMap* getInfluenceMap() const { return _vertexInfluenceMap.get();} const osgAnimation::VertexInfluenceMap* getInfluenceMap() const { return _vertexInfluenceMap.get();}
VertexInfluenceMap* getInfluenceMap() { return _vertexInfluenceMap.get();} osgAnimation::VertexInfluenceMap* getInfluenceMap() { return _vertexInfluenceMap.get();}
const Skeleton* getSkeleton() const; const Skeleton* getSkeleton() const;
Skeleton* getSkeleton(); Skeleton* getSkeleton();
// will be used by the update callback to init correctly the rig mesh
void setSkeleton(Skeleton*);
void setNeedToComputeMatrix(bool state) { _needToComputeMatrix = state;} void setNeedToComputeMatrix(bool state) { _needToComputeMatrix = state;}
bool getNeedToComputeMatrix() const { return _needToComputeMatrix;} bool getNeedToComputeMatrix() const { return _needToComputeMatrix;}
void buildVertexSet();
// this build the internal database about vertex influence and bones void buildTransformer(Skeleton* root);
void buildVertexInfluenceSet();
const VertexInfluenceSet& getVertexInfluenceSet() const;
void computeMatrixFromRootSkeleton(); void computeMatrixFromRootSkeleton();
virtual void transformSoftwareMethod();
const osgAnimation::VertexInfluenceSet& getVertexInfluenceSet() const { return _vertexInfluenceSet;}
// set implementation of rig method const std::vector<osg::Vec3>& getPositionSource() const { return _positionSource;}
void setRigTransformImplementation(RigTransform*); const std::vector<osg::Vec3>& getNormalSource() const { return _normalSource;}
RigTransform* getRigTransformImplementation();
virtual void drawImplementation(osg::RenderInfo& renderInfo) const;
void update();
const osg::Matrix& getMatrixFromSkeletonToGeometry() const;
const osg::Matrix& getInvMatrixFromSkeletonToGeometry() const;
osg::Geometry* getSourceGeometry();
const osg::Geometry* getSourceGeometry() const;
void setSourceGeometry(osg::Geometry* geometry);
void copyFrom(osg::Geometry& from);
protected: protected:
osg::ref_ptr<osg::Geometry> _geometry;
osg::ref_ptr<RigTransform> _rigTransformImplementation;
VertexInfluenceSet _vertexInfluenceSet; std::vector<osg::Vec3> _positionSource;
osg::ref_ptr<VertexInfluenceMap> _vertexInfluenceMap; std::vector<osg::Vec3> _normalSource;
osgAnimation::VertexInfluenceSet _vertexInfluenceSet;
osg::ref_ptr<osgAnimation::VertexInfluenceMap> _vertexInfluenceMap;
osgAnimation::TransformVertexFunctor _transformVertexes;
osg::Matrix _matrixFromSkeletonToGeometry; osg::Matrix _matrixFromSkeletonToGeometry;
osg::Matrix _invMatrixFromSkeletonToGeometry; osg::Matrix _invMatrixFromSkeletonToGeometry;
osg::observer_ptr<Skeleton> _root; osg::observer_ptr<Skeleton> _root;
bool _needToComputeMatrix; bool _needToComputeMatrix;
struct FindNearestParentSkeleton : public osg::NodeVisitor struct FindNearestParentSkeleton : public osg::NodeVisitor
{ {
osg::ref_ptr<Skeleton> _root; osg::ref_ptr<osgAnimation::Skeleton> _root;
FindNearestParentSkeleton() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS) {} FindNearestParentSkeleton() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS) {}
void apply(osg::Transform& node) void apply(osg::Transform& node)
{ {
@@ -104,7 +89,7 @@ namespace osgAnimation
RigGeometry* geom = dynamic_cast<RigGeometry*>(drw); RigGeometry* geom = dynamic_cast<RigGeometry*>(drw);
if (!geom) if (!geom)
return; return;
if (!geom->getSkeleton() && !geom->getParents().empty()) if (!geom->getSkeleton() && !geom->getParents().empty())
{ {
FindNearestParentSkeleton finder; FindNearestParentSkeleton finder;
if (geom->getParents().size() > 1) if (geom->getParents().size() > 1)
@@ -112,12 +97,9 @@ namespace osgAnimation
geom->getParents()[0]->accept(finder); geom->getParents()[0]->accept(finder);
if (!finder._root.valid()) if (!finder._root.valid())
{
osg::notify(osg::WARN) << "A RigGeometry did not find a parent skeleton for RigGeomtry ( " << geom->getName() << " )" << std::endl;
return; return;
} geom->buildVertexSet();
geom->buildVertexInfluenceSet(); geom->buildTransformer(finder._root.get());
geom->setSkeleton(finder._root.get());
} }
if (!geom->getSkeleton()) if (!geom->getSkeleton())
@@ -125,10 +107,34 @@ namespace osgAnimation
if (geom->getNeedToComputeMatrix()) if (geom->getNeedToComputeMatrix())
geom->computeMatrixFromRootSkeleton(); geom->computeMatrixFromRootSkeleton();
geom->transformSoftwareMethod();
geom->update();
} }
}; };
/** BuildVertexTransformerVisitor is used to setup RigGeometry drawable
* throw a subgraph.
*/
struct BuildVertexTransformerVisitor : public osg::NodeVisitor
{
osg::ref_ptr<Skeleton> _root;
BuildVertexTransformerVisitor(Skeleton* root): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) { _root = root;}
META_NodeVisitor("osgAnimation","BuildVertexTransformerVisitor")
void apply(osg::Geode& node)
{
int num = node.getNumDrawables();
for (int i = 0; i < num; i++) {
RigGeometry* geom = dynamic_cast<RigGeometry*>(node.getDrawable(i));
if (geom)
{
geom->buildVertexSet();
geom->buildTransformer(_root.get());
}
}
}
};
}; };
} }

View File

@@ -1,36 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_RIGTRANSFORM
#define OSGANIMATION_RIGTRANSFORM 1
#include <osg/Referenced>
namespace osgAnimation
{
class RigGeometry;
class RigTransform : public osg::Referenced
{
public:
RigTransform() {}
virtual ~RigTransform() {}
virtual void operator()(RigGeometry& geometry) {}
};
}
#endif

View File

@@ -1,85 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_RIG_TRANSFORM_HARDWARE
#define OSGANIMATION_RIG_TRANSFORM_HARDWARE 1
#include <osgAnimation/Export>
#include <osgAnimation/RigTransform>
#include <osgAnimation/VertexInfluence>
#include <osgAnimation/Bone>
#include <osg/Matrix>
#include <osg/Array>
namespace osgAnimation
{
class RigGeometry;
/// This class manage format for hardware skinning
class OSGANIMATION_EXPORT RigTransformHardware : public RigTransform
{
public:
typedef osg::Matrix MatrixType;
typedef osgAnimation::Bone BoneType;
typedef std::vector<osg::ref_ptr<osg::Vec4Array> > BoneWeightAttribList;
typedef std::vector<osg::ref_ptr<BoneType> > BonePalette;
typedef std::vector<osg::Matrix> MatrixPalette;
struct IndexWeightEntry
{
int _boneIndex;
float _boneWeight;
IndexWeightEntry() { _boneIndex = 0; _boneWeight = 0;}
IndexWeightEntry(int index, float weight) { _boneIndex = index; _boneWeight = weight;}
int getIndex() const { return _boneIndex; }
float getWeight() const { return _boneWeight; }
};
typedef std::vector<std::vector<IndexWeightEntry> > VertexIndexWeightList;
RigTransformHardware();
osg::Vec4Array* getVertexAttrib(int index);
int getNumVertexAttrib();
osg::Uniform* getMatrixPaletteUniform();
void computeMatrixPaletteUniform(const osg::Matrix& transformFromSkeletonToGeometry, const osg::Matrix& invTransformFromSkeletonToGeometry);
int getNumBonesPerVertex() const;
int getNumVertexes() const;
bool createPalette(int nbVertexes, BoneMap boneMap, const VertexInfluenceSet::VertexIndexToBoneWeightMap& vertexIndexToBoneWeightMap);
virtual void operator()(RigGeometry&);
void setShader(osg::Shader*);
protected:
bool init(RigGeometry&);
BoneWeightAttribList createVertexAttribList();
osg::Uniform* createVertexUniform();
int _bonesPerVertex;
int _nbVertexes;
VertexIndexWeightList _vertexIndexMatrixWeightList;
BonePalette _bonePalette;
BoneWeightAttribList _boneWeightAttribArrays;
osg::ref_ptr<osg::Uniform> _uniformMatrixPalette;
osg::ref_ptr<osg::Shader> _shader;
bool _needInit;
};
}
#endif

View File

@@ -1,172 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_RIGTRANSFORM_SOFTWARE
#define OSGANIMATION_RIGTRANSFORM_SOFTWARE 1
#include <osgAnimation/Export>
#include <osgAnimation/RigTransform>
#include <osgAnimation/Bone>
#include <osgAnimation/VertexInfluence>
#include <osg/observer_ptr>
namespace osgAnimation
{
class RigGeometry;
/// This class manage format for hardware skinning
class OSGANIMATION_EXPORT RigTransformSoftware : public RigTransform
{
public:
RigTransformSoftware();
virtual void operator()(RigGeometry&);
class BoneWeight
{
public:
BoneWeight(Bone* bone, float weight) : _bone(bone), _weight(weight) {}
const Bone* getBone() const { return _bone.get(); }
float getWeight() const { return _weight; }
void setWeight(float w) { _weight = w; }
protected:
osg::observer_ptr<Bone> _bone;
float _weight;
};
typedef std::vector<BoneWeight> BoneWeightList;
typedef std::vector<int> VertexList;
class UniqBoneSetVertexSet
{
public:
BoneWeightList& getBones() { return _bones; }
VertexList& getVertexes() { return _vertexes; }
void resetMatrix()
{
_result.set(0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 1);
}
void accummulateMatrix(const osg::Matrix& invBindMatrix, const osg::Matrix& matrix, osg::Matrix::value_type weight)
{
osg::Matrix m = invBindMatrix * matrix;
osg::Matrix::value_type* ptr = m.ptr();
osg::Matrix::value_type* ptrresult = _result.ptr();
ptrresult[0] += ptr[0] * weight;
ptrresult[1] += ptr[1] * weight;
ptrresult[2] += ptr[2] * weight;
ptrresult[4] += ptr[4] * weight;
ptrresult[5] += ptr[5] * weight;
ptrresult[6] += ptr[6] * weight;
ptrresult[8] += ptr[8] * weight;
ptrresult[9] += ptr[9] * weight;
ptrresult[10] += ptr[10] * weight;
ptrresult[12] += ptr[12] * weight;
ptrresult[13] += ptr[13] * weight;
ptrresult[14] += ptr[14] * weight;
}
void computeMatrixForVertexSet()
{
if (_bones.empty())
{
osg::notify(osg::WARN) << this << " RigTransformSoftware::UniqBoneSetVertexSet no bones found" << std::endl;
_result = osg::Matrix::identity();
return;
}
resetMatrix();
int size = _bones.size();
for (int i = 0; i < size; i++)
{
const Bone* bone = _bones[i].getBone();
if (!bone)
{
osg::notify(osg::WARN) << this << " RigTransformSoftware::computeMatrixForVertexSet Warning a bone is null, skip it" << std::endl;
continue;
}
const osg::Matrix& invBindMatrix = bone->getInvBindMatrixInSkeletonSpace();
const osg::Matrix& matrix = bone->getMatrixInSkeletonSpace();
osg::Matrix::value_type w = _bones[i].getWeight();
accummulateMatrix(invBindMatrix, matrix, w);
}
}
const osg::Matrix& getMatrix() const { return _result;}
protected:
BoneWeightList _bones;
VertexList _vertexes;
osg::Matrix _result;
};
template <class V> void compute(const osg::Matrix& transform, const osg::Matrix& invTransform, const V* src, V* dst)
{
// the result of matrix mult should be cached to be used for vertexes transform and normal transform and maybe other computation
int size = _boneSetVertexSet.size();
for (int i = 0; i < size; i++)
{
UniqBoneSetVertexSet& uniq = _boneSetVertexSet[i];
uniq.computeMatrixForVertexSet();
osg::Matrix matrix = transform * uniq.getMatrix() * invTransform;
const VertexList& vertexes = uniq.getVertexes();
int vertexSize = vertexes.size();
for (int j = 0; j < vertexSize; j++)
{
int idx = vertexes[j];
dst[idx] = src[idx] * matrix;
}
}
}
template <class V> void computeNormal(const osg::Matrix& transform, const osg::Matrix& invTransform, const V* src, V* dst)
{
int size = _boneSetVertexSet.size();
for (int i = 0; i < size; i++)
{
UniqBoneSetVertexSet& uniq = _boneSetVertexSet[i];
uniq.computeMatrixForVertexSet();
osg::Matrix matrix = transform * uniq.getMatrix() * invTransform;
const VertexList& vertexes = uniq.getVertexes();
int vertexSize = vertexes.size();
for (int j = 0; j < vertexSize; j++)
{
int idx = vertexes[j];
dst[idx] = osg::Matrix::transform3x3(src[idx],matrix);
}
}
}
protected:
bool init(RigGeometry&);
void initVertexSetFromBones(const BoneMap& map, const VertexInfluenceSet::UniqVertexSetToBoneSetList& influence);
std::vector<UniqBoneSetVertexSet> _boneSetVertexSet;
bool _needInit;
};
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -10,11 +10,7 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
* */
* Authors:
* Cedric Pinson <cedric.pinson@plopbyte.net>
* Michael Platings <mplatings@pixelpower.com>
*/
#ifndef OSGANIMATION_SAMPLER_H #ifndef OSGANIMATION_SAMPLER_H
#define OSGANIMATION_SAMPLER_H #define OSGANIMATION_SAMPLER_H
@@ -112,21 +108,12 @@ namespace osgAnimation
}; };
typedef TemplateSampler<DoubleStepInterpolator> DoubleStepSampler;
typedef TemplateSampler<FloatStepInterpolator> FloatStepSampler;
typedef TemplateSampler<Vec2StepInterpolator> Vec2StepSampler;
typedef TemplateSampler<Vec3StepInterpolator> Vec3StepSampler;
typedef TemplateSampler<Vec4StepInterpolator> Vec4StepSampler;
typedef TemplateSampler<QuatStepInterpolator> QuatStepSampler;
typedef TemplateSampler<DoubleLinearInterpolator> DoubleLinearSampler; typedef TemplateSampler<DoubleLinearInterpolator> DoubleLinearSampler;
typedef TemplateSampler<FloatLinearInterpolator> FloatLinearSampler; typedef TemplateSampler<FloatLinearInterpolator> FloatLinearSampler;
typedef TemplateSampler<Vec2LinearInterpolator> Vec2LinearSampler; typedef TemplateSampler<Vec2LinearInterpolator> Vec2LinearSampler;
typedef TemplateSampler<Vec3LinearInterpolator> Vec3LinearSampler; typedef TemplateSampler<Vec3LinearInterpolator> Vec3LinearSampler;
typedef TemplateSampler<Vec4LinearInterpolator> Vec4LinearSampler; typedef TemplateSampler<Vec4LinearInterpolator> Vec4LinearSampler;
typedef TemplateSampler<QuatSphericalLinearInterpolator> QuatSphericalLinearSampler; typedef TemplateSampler<QuatSphericalLinearInterpolator> QuatSphericalLinearSampler;
typedef TemplateSampler<MatrixLinearInterpolator> MatrixLinearSampler;
typedef TemplateSampler<FloatCubicBezierInterpolator> FloatCubicBezierSampler; typedef TemplateSampler<FloatCubicBezierInterpolator> FloatCubicBezierSampler;
typedef TemplateSampler<DoubleCubicBezierInterpolator> DoubleCubicBezierSampler; typedef TemplateSampler<DoubleCubicBezierInterpolator> DoubleCubicBezierSampler;
typedef TemplateSampler<Vec2CubicBezierInterpolator> Vec2CubicBezierSampler; typedef TemplateSampler<Vec2CubicBezierInterpolator> Vec2CubicBezierSampler;

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -12,36 +12,33 @@
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSGANIMATION_SKELETON #ifndef OSGANIMATION_SKELETON_H
#define OSGANIMATION_SKELETON 1 #define OSGANIMATION_SKELETON_H
#include <osgAnimation/Export>
#include <osg/MatrixTransform> #include <osg/MatrixTransform>
#include <osgAnimation/Bone>
#include <osgAnimation/Export>
namespace osgAnimation namespace osgAnimation
{ {
class OSGANIMATION_EXPORT Skeleton : public osg::MatrixTransform class OSGANIMATION_EXPORT Skeleton : public Bone
{ {
public: public:
META_Node(osgAnimation, Skeleton); META_Node(osgAnimation, Skeleton);
class OSGANIMATION_EXPORT UpdateSkeleton : public osg::NodeCallback struct OSGANIMATION_EXPORT UpdateSkeleton : public osg::NodeCallback
{ {
public:
META_Object(osgAnimation, UpdateSkeleton); META_Object(osgAnimation, UpdateSkeleton);
UpdateSkeleton(); UpdateSkeleton() {}
UpdateSkeleton(const UpdateSkeleton&, const osg::CopyOp&); UpdateSkeleton(const UpdateSkeleton& us, const osg::CopyOp& copyop= osg::CopyOp::SHALLOW_COPY) : osg::NodeCallback(us, copyop) {}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv); virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
bool needToValidate() const;
protected:
bool _needValidate;
}; };
Skeleton(const Skeleton& b, const osg::CopyOp& copyop= osg::CopyOp::SHALLOW_COPY) : Bone(b,copyop) {}
Skeleton(); Skeleton();
Skeleton(const Skeleton&, const osg::CopyOp&); void setDefaultUpdateCallback(void);
void setDefaultUpdateCallback(); void computeBindMatrix() { _invBindInSkeletonSpace = osg::Matrix::inverse(_bindInBoneSpace); }
}; };
} }

View File

@@ -1,54 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STACKED_MATRIX_ELEMENT
#define OSGANIMATION_STACKED_MATRIX_ELEMENT 1
#include <osg/Object>
#include <osgAnimation/Export>
#include <osgAnimation/StackedTransformElement>
#include <osgAnimation/Target>
namespace osgAnimation
{
class OSGANIMATION_EXPORT StackedMatrixElement : public StackedTransformElement
{
public:
META_Object(osgAnimation, StackedMatrixElement);
StackedMatrixElement();
StackedMatrixElement(const StackedMatrixElement&, const osg::CopyOp&);
StackedMatrixElement(const std::string& name, const osg::Matrix& matrix);
StackedMatrixElement(const osg::Matrix& matrix);
void applyToMatrix(osg::Matrix& matrix) const { matrix = _matrix * matrix; }
osg::Matrix getAsMatrix() const { return _matrix; }
const osg::Matrix& getMatrix() const { return _matrix;}
void setMatrix(const osg::Matrix& matrix) { _matrix = matrix;}
bool isIdentity() const { return _matrix.isIdentity(); }
void update();
virtual Target* getOrCreateTarget();
virtual Target* getTarget() {return _target.get();}
virtual const Target* getTarget() const {return _target.get();}
protected:
osg::Matrix _matrix;
osg::ref_ptr<MatrixTarget> _target;
};
}
#endif

View File

@@ -1,54 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STACKED_QUATERNION_ELEMENT
#define OSGANIMATION_STACKED_QUATERNION_ELEMENT 1
#include <osgAnimation/Export>
#include <osgAnimation/StackedTransformElement>
#include <osgAnimation/Target>
namespace osgAnimation
{
class OSGANIMATION_EXPORT StackedQuaternionElement : public StackedTransformElement
{
public:
META_Object(osgAnimation, StackedQuaternionElement);
StackedQuaternionElement();
StackedQuaternionElement(const StackedQuaternionElement&, const osg::CopyOp&);
StackedQuaternionElement(const std::string&, const osg::Quat& q = osg::Quat(0,0,0,1));
StackedQuaternionElement(const osg::Quat&);
void applyToMatrix(osg::Matrix& matrix) const;
osg::Matrix getAsMatrix() const;
bool isIdentity() const;
void update();
const osg::Quat& getQuaternion() const;
void setQuaternion(const osg::Quat&);
virtual Target* getOrCreateTarget();
virtual Target* getTarget();
virtual const Target* getTarget() const;
protected:
osg::Quat _quaternion;
osg::ref_ptr<QuatTarget> _target;
};
}
#endif

View File

@@ -1,59 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STACKED_ROTATE_AXIS_ELEMENT
#define OSGANIMATION_STACKED_ROTATE_AXIS_ELEMENT 1
#include <osgAnimation/Export>
#include <osgAnimation/StackedTransformElement>
#include <osgAnimation/Target>
#include <osg/Vec3>
namespace osgAnimation
{
class OSGANIMATION_EXPORT StackedRotateAxisElement : public StackedTransformElement
{
public:
META_Object(osgAnimation, StackedRotateAxisElement);
StackedRotateAxisElement();
StackedRotateAxisElement(const StackedRotateAxisElement&, const osg::CopyOp&);
StackedRotateAxisElement(const std::string& name, const osg::Vec3& axis, double angle);
StackedRotateAxisElement(const osg::Vec3& axis, double angle);
void applyToMatrix(osg::Matrix& matrix) const;
osg::Matrix getAsMatrix() const;
bool isIdentity() const { return (_angle == 0); }
void update();
const osg::Vec3& getAxis() const;
const double getAngle() const;
void setAxis(const osg::Vec3&);
void setAngle(const double&);
virtual Target* getOrCreateTarget();
virtual Target* getTarget() {return _target.get();}
virtual const Target* getTarget() const {return _target.get();}
protected:
osg::Vec3 _axis;
double _angle;
osg::ref_ptr<FloatTarget> _target;
};
}
#endif

View File

@@ -1,56 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STACKED_SCALE_ELEMENT
#define OSGANIMATION_STACKED_SCALE_ELEMENT 1
#include <osg/Object>
#include <osgAnimation/Export>
#include <osgAnimation/StackedTransformElement>
#include <osgAnimation/Target>
namespace osgAnimation
{
class OSGANIMATION_EXPORT StackedScaleElement : public StackedTransformElement
{
public:
META_Object(osgAnimation, StackedScaleElement)
StackedScaleElement();
StackedScaleElement(const StackedScaleElement&, const osg::CopyOp&);
StackedScaleElement(const std::string& name, const osg::Vec3& scale = osg::Vec3(1,1,1));
StackedScaleElement(const osg::Vec3& scale);
void applyToMatrix(osg::Matrix& matrix) const;
osg::Matrix getAsMatrix() const;
bool isIdentity() const;
void update();
const osg::Vec3& getScale() const;
void setScale(const osg::Vec3& scale);
virtual Target* getOrCreateTarget();
virtual Target* getTarget();
virtual const Target* getTarget() const;
protected:
osg::Vec3 _scale;
osg::ref_ptr<Vec3Target> _target;
};
}
#endif

View File

@@ -1,42 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STACKED_TRANSFORM
#define OSGANIMATION_STACKED_TRANSFORM 1
#include <osg/MixinVector>
#include <osgAnimation/Export>
#include <osgAnimation/StackedTransformElement>
namespace osgAnimation
{
class OSGANIMATION_EXPORT StackedTransform : public osg::MixinVector<osg::ref_ptr<StackedTransformElement> >
{
public:
StackedTransform();
StackedTransform(const StackedTransform&, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
void update();
const osg::Matrix& getMatrix() const;
protected:
osg::Matrix _matrix;
};
}
#endif

View File

@@ -1,42 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STACKED_TRANSFORM_ELEMENT
#define OSGANIMATION_STACKED_TRANSFORM_ELEMENT 1
#include <osgAnimation/Export>
#include <osg/Object>
#include <osg/Matrix>
namespace osgAnimation
{
class Target;
class OSGANIMATION_EXPORT StackedTransformElement : public osg::Object
{
public:
StackedTransformElement() {}
StackedTransformElement(const StackedTransformElement& rhs, const osg::CopyOp& c) : osg::Object(rhs, c) {}
virtual void applyToMatrix(osg::Matrix& matrix) const = 0;
virtual osg::Matrix getAsMatrix() const = 0;
virtual bool isIdentity() const = 0;
virtual void update() = 0;
virtual Target* getOrCreateTarget() {return 0;}
virtual Target* getTarget() {return 0;}
virtual const Target* getTarget() const {return 0;}
};
}
#endif

View File

@@ -1,54 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STACKED_TRANSLATE_ELEMENT
#define OSGANIMATION_STACKED_TRANSLATE_ELEMENT 1
#include <osgAnimation/Export>
#include <osgAnimation/StackedTransformElement>
#include <osgAnimation/Target>
namespace osgAnimation
{
class OSGANIMATION_EXPORT StackedTranslateElement : public StackedTransformElement
{
public:
META_Object(osgAnimation, StackedTranslateElement);
StackedTranslateElement();
StackedTranslateElement(const StackedTranslateElement&, const osg::CopyOp&);
StackedTranslateElement(const std::string&, const osg::Vec3& translate = osg::Vec3(0,0,0));
StackedTranslateElement(const osg::Vec3& translate);
void applyToMatrix(osg::Matrix& matrix) const;
osg::Matrix getAsMatrix() const;
bool isIdentity() const;
void update();
const osg::Vec3& getTranslate() const;
void setTranslate(const osg::Vec3& );
virtual Target* getOrCreateTarget();
virtual Target* getTarget();
virtual const Target* getTarget() const;
protected:
osg::Vec3 _translate;
osg::ref_ptr<Vec3Target> _target;
};
}
#endif

View File

@@ -1,113 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <mornifle@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STATSHANDLER_H
#define OSGANIMATION_STATSHANDLER_H
#include <osgAnimation/Timeline>
#include <osgGA/GUIEventHandler>
#include <osgViewer/ViewerBase>
#include <osgViewer/Viewer>
#include <osgText/Text>
namespace osgAnimation
{
#if 0
struct StatAction
{
std::string _name;
osg::ref_ptr<osg::Group> _group;
osg::ref_ptr<osg::Geode> _label;
osg::ref_ptr<osg::MatrixTransform> _graph;
osg::ref_ptr<osgText::Text> _textLabel;
void init(osg::Stats* stats, const std::string& name, const osg::Vec3& pos, float width, float heigh, const osg::Vec4& color);
void setPosition(const osg::Vec3& pos);
void setAlpha(float v);
};
#endif
/** Event handler for adding on screen stats reporting to Viewers.*/
class OSGANIMATION_EXPORT StatsHandler : public osgGA::GUIEventHandler
{
public:
StatsHandler();
enum StatsType
{
NO_STATS = 0,
FRAME_RATE = 1,
LAST = 2
};
void setKeyEventTogglesOnScreenStats(int key) { _keyEventTogglesOnScreenStats = key; }
int getKeyEventTogglesOnScreenStats() const { return _keyEventTogglesOnScreenStats; }
void setKeyEventPrintsOutStats(int key) { _keyEventPrintsOutStats = key; }
int getKeyEventPrintsOutStats() const { return _keyEventPrintsOutStats; }
double getBlockMultiplier() const { return _blockMultiplier; }
void reset();
osg::Camera* getCamera() { return _camera.get(); }
const osg::Camera* getCamera() const { return _camera.get(); }
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa);
/** Get the keyboard and mouse usage of this manipulator.*/
virtual void getUsage(osg::ApplicationUsage& usage) const;
protected:
void setUpHUDCamera(osgViewer::ViewerBase* viewer);
osg::Geometry* createBackgroundRectangle(const osg::Vec3& pos, const float width, const float height, osg::Vec4& color);
osg::Geometry* createGeometry(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numBlocks);
osg::Geometry* createFrameMarkers(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numBlocks);
osg::Geometry* createTick(const osg::Vec3& pos, float height, const osg::Vec4& colour, unsigned int numTicks);
osg::Node* createCameraTimeStats(const std::string& font, osg::Vec3& pos, float startBlocks, bool acquireGPUStats, float characterSize, osg::Stats* viewerStats, osg::Camera* camera);
void setUpScene(osgViewer::Viewer* viewer);
int _keyEventTogglesOnScreenStats;
int _keyEventPrintsOutStats;
int _statsType;
bool _initialized;
osg::ref_ptr<osg::Camera> _camera;
osg::ref_ptr<osg::Switch> _switch;
osg::ref_ptr<osg::Group> _group;
unsigned int _frameRateChildNum;
unsigned int _numBlocks;
double _blockMultiplier;
float _statsWidth;
float _statsHeight;
// std::map<std::string, StatAction > _actions;
};
}
#endif

View File

@@ -1,53 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_STATSVISITOR_H
#define OSGANIMATION_STATSVISITOR_H
#include <osgAnimation/Export>
#include <osgAnimation/ActionVisitor>
#include <osg/Stats>
#include <vector>
namespace osgAnimation
{
class OSGANIMATION_EXPORT StatsActionVisitor : public osgAnimation::UpdateActionVisitor
{
protected:
osg::ref_ptr<osg::Stats> _stats;
std::vector<std::string> _channels;
public:
META_ActionVisitor(osgAnimation, StatsActionVisitor);
StatsActionVisitor();
StatsActionVisitor(osg::Stats* stats, unsigned int frame);
void reset();
const std::vector<std::string>& getChannels() const { return _channels; }
osg::Stats* getStats() { return _stats.get(); }
void setStats(osg::Stats* stats) { _stats = stats; }
void setFrame(unsigned int frame) { _frame = frame; }
void apply(Timeline& action);
void apply(Action& action);
void apply(ActionBlendIn& action);
void apply(ActionBlendOut& action);
void apply(ActionAnimation& action);
void apply(ActionStripAnimation& action);
};
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -34,14 +34,15 @@ namespace osgAnimation
public: public:
Target(); Target();
virtual ~Target() {} virtual ~Target();
void reset() { _weight = 0; _priorityWeight = 0; } virtual void normalize() = 0;
int getCount() const { return referenceCount(); }
float getWeight() const { return _weight; } float getWeight() const { return _weight; }
void reset() { _weight = 0;}
int getCount() const { return referenceCount(); }
protected: protected:
void addWeight(float w) { _weight += w; }
float _weight; float _weight;
float _priorityWeight;
int _lastPriority;
}; };
@@ -50,78 +51,75 @@ namespace osgAnimation
{ {
public: public:
TemplateTarget() : _target() {} TemplateTarget() {}
TemplateTarget(const T& v) { setValue(v); } TemplateTarget(const T& v) { setValue(v); }
TemplateTarget(const TemplateTarget& v) { setValue(v.getValue()); }
inline void lerp(float t, const T& a, const T& b); void update(float weight, const T& val)
/**
* The priority is used to detect a change of priority
* It's important to update animation target in priority
* order. eg:
* all animation with priority 1
* all animation with priority 0
* all animation with priority -1
* ...
*/
void update(float weight, const T& val, int priority)
{ {
if (_weight || _priorityWeight) if (!_weight)
{ _target = val * weight;
if (_lastPriority != priority)
{
// change in priority
// add to weight with the same previous priority cumulated weight
_weight += _priorityWeight * (1.0 - _weight);
_priorityWeight = 0;
_lastPriority = priority;
}
_priorityWeight += weight;
float t = (1.0 - _weight) * weight / _priorityWeight;
lerp(t, _target, val);
}
else else
{ {
_priorityWeight = weight; weight = (1.0 - _weight) * weight;
_lastPriority = priority; _target += val * weight;
_target = val;
} }
addWeight(weight);
} }
const T& getValue() const { return _target; } const T& getValue() const { return _target;}
void setValue(const T& value) { _target = value; } void normalize()
{
float weightSummed = getWeight();
if (fabs(weightSummed) < 1e-4 || fabs(weightSummed-1) < 1e-4)
return;
(_target) /= weightSummed;
}
void setValue(const T& value) { _target = value;}
protected: protected:
T _target; T _target;
}; };
template <class T>
inline void TemplateTarget<T>::lerp(float t, const T& a, const T& b)
{
_target = a * (1.0f - t) + b * t;
}
// Target Specialisation for Quaternions
template <> template <>
inline void TemplateTarget<osg::Quat>::lerp(float t, const osg::Quat& a, const osg::Quat& b) class TemplateTarget< osg::Quat > : public Target
{ {
if (a.asVec4() * b.asVec4() < 0.0) public:
{
_target = a * (1.0f - t) + b * -t; TemplateTarget () {}
}
else const osg::Quat& getValue() const { return _target;}
{ void update(float weight, const osg::Quat& val)
_target = a * (1.0f - t) + b * t; {
if (!_weight)
_target = val * weight;
else
{
weight = (1.0 - _weight) * weight;
_target += val * weight;
}
addWeight(weight);
} }
osg::Quat::value_type len2 = _target.length2(); // maybe normalize could be non virtual and put on ITarget
if ( len2 != 1.0 && len2 != 0.0) void normalize()
_target *= 1.0/sqrt(len2); {
} float weightSummed = getWeight();
if (fabs(weightSummed) < 1e-4 || fabs(weightSummed-1.0) < 1e-4)
return;
(_target) /= weightSummed;
}
typedef TemplateTarget<osg::Matrixf> MatrixTarget; void setValue(const osg::Quat& value) { _target = value;}
protected:
osg::Quat _target;
};
typedef TemplateTarget<osg::Quat> QuatTarget; typedef TemplateTarget<osg::Quat> QuatTarget;
typedef TemplateTarget<osg::Vec3> Vec3Target; typedef TemplateTarget<osg::Vec3> Vec3Target;
typedef TemplateTarget<osg::Vec4> Vec4Target; typedef TemplateTarget<osg::Vec4> Vec4Target;

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -12,88 +12,180 @@
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSGANIMATION_TIMELINE #ifndef OSGANIMATION_TIMELINE_H
#define OSGANIMATION_TIMELINE 1 #define OSGANIMATION_TIMELINE_H
#include <osgAnimation/Export> #include <osgAnimation/Export>
#include <osg/Object>
#include <map> #include <map>
#include <vector> #include <vector>
#include <osg/observer_ptr>
#include <osg/Notify> #include <osg/Notify>
#include <osg/Stats> #include <osg/Group>
#include <osgAnimation/Action> #include <osgAnimation/Animation>
#include <osgAnimation/FrameAction>
#include <osgAnimation/AnimationManagerBase> #include <osgAnimation/AnimationManagerBase>
#include <osgAnimation/StatsVisitor>
namespace osgAnimation namespace osgAnimation
{ {
class OSGANIMATION_EXPORT Timeline : public Action
class Action : public osg::Object
{ {
public: public:
Timeline(); class Callback : public osg::Object
Timeline(const Timeline& nc,const osg::CopyOp& op = osg::CopyOp::SHALLOW_COPY); {
public:
Callback(){}
Callback(const Callback&,const osg::CopyOp&) {}
META_Action(osgAnimation, Timeline); META_Object(osgAnimation,Callback);
virtual void operator()(Action* /*action*/) {}
void addNestedCallback(Callback* callback)
{
if (_nested.valid())
_nested->addNestedCallback(callback);
else
_nested = callback;
}
enum TimelineStatus protected:
osg::ref_ptr<Callback> _nested;
};
typedef std::map<unsigned int, osg::ref_ptr<Callback> > FrameCallback;
META_Object(osgAnimation, Action);
Action()
{
_numberFrame = 25;
_fps = 25;
_speed = 1.0;
_loop = 1;
}
Action(const Action&,const osg::CopyOp&) {}
void setCallback(double when, Callback* callback)
{
setCallback(static_cast<unsigned int>(floor(when*_fps)), callback);
}
void setCallback(unsigned int frame, Callback* callback)
{
if (_framesCallback[frame].valid())
_framesCallback[frame]->addNestedCallback(callback);
else
_framesCallback[frame] = callback;
}
Callback* getCallback(unsigned int frame)
{
if (_framesCallback.find(frame) == _framesCallback.end())
return 0;
return _framesCallback[frame].get();
}
void setNumFrames(unsigned int numFrames) { _numberFrame = numFrames;}
void setDuration(double duration) { _numberFrame = static_cast<unsigned int>(floor(duration * _fps)); }
unsigned int getNumFrames() const { return _numberFrame;}
double getDuration() const { return _numberFrame * 1.0 / _fps; }
// 0 means infini else it's the number of loop
virtual void setLoop(int nb) { _loop = nb; }
virtual unsigned int getLoop() const { return _loop;}
// get the number of loop, the frame relative to loop.
// return true if in range, and false if out of range.
bool evaluateFrame(unsigned int frame, unsigned int& resultframe, unsigned int& nbloop )
{
nbloop = frame / getNumFrames();
resultframe = frame;
if (frame > getNumFrames()-1)
{
if (!getLoop())
resultframe = frame % getNumFrames();
else
{
if (nbloop >= getLoop())
return false;
else
resultframe = frame % getNumFrames();
}
}
return true;
}
virtual void evaluate(unsigned int frame)
{
unsigned int frameInAction;
unsigned int loopDone;
if (!evaluateFrame(frame, frameInAction, loopDone))
osg::notify(osg::DEBUG_INFO) << getName() << " Action frame " << frameInAction << " finished" << std::endl;
else
osg::notify(osg::DEBUG_INFO) << getName() << " Action frame " << frame << " relative to loop " << frameInAction << " no loop " << loopDone<< std::endl;
}
virtual void evaluateCallback(unsigned int frame)
{
unsigned int frameInAction;
unsigned int loopDone;
if (!evaluateFrame(frame, frameInAction, loopDone))
return;
frame = frameInAction;
if (_framesCallback.find(frame) != _framesCallback.end())
{
std::cout << getName() << " evaluate callback " << _framesCallback[frame]->getName() << " at " << frame << std::endl;
(*_framesCallback[frame])(this);
}
}
protected:
FrameCallback _framesCallback;
double _speed;
unsigned int _fps;
unsigned int _numberFrame;
unsigned int _loop;
enum State
{ {
Play, Play,
Stop Stop
}; };
State _state;
};
TimelineStatus getStatus() const { return _state; }
class Timeline : public osg::Object
{
protected:
typedef std::pair<unsigned int, osg::ref_ptr<Action> > FrameAction;
typedef std::vector<FrameAction> ActionList; typedef std::vector<FrameAction> ActionList;
typedef std::map<int, ActionList> ActionLayers; typedef std::map<int, ActionList> ActionLayers;
enum State
const ActionList& getActionLayer(int i) { return _actions[i];} {
unsigned int getCurrentFrame() const { return _currentFrame;} Play,
double getCurrentTime() const { return _currentFrame * 1.0 / _fps;} Stop
};
void play() { _state = Play; }
void gotoFrame(unsigned int frame) { _currentFrame = frame; }
void stop() { _state = Stop; }
bool getEvaluating() const { return _evaluating;}
bool isActive(Action* activeAction);
void removeAction(Action* action);
virtual void addActionAt(unsigned int frame, Action* action, int priority = 0);
virtual void addActionAt(double t, Action* action, int priority = 0);
void addActionNow(Action* action, int priority = 0);
void clearActions();
virtual void update(double simulationTime);
void setLastFrameEvaluated(unsigned int frame) { _previousFrameEvaluated = frame; }
void setEvaluating(bool state) { _evaluating = state;}
void traverse(ActionVisitor& visitor);
void setStats(osg::Stats* stats);
osg::Stats* getStats();
void collectStats(bool state);
osgAnimation::StatsActionVisitor* getStatsVisitor();
const ActionLayers& getActionLayers() const { return _actions; }
void processPendingOperation();
void setAnimationManager(AnimationManagerBase*);
protected:
osg::observer_ptr<AnimationManagerBase> _animationManager;
ActionLayers _actions; ActionLayers _actions;
double _lastUpdate; double _lastUpdate;
double _speed; double _speed;
unsigned int _currentFrame; unsigned int _currentFrame;
unsigned int _fps;
unsigned int _numberFrame;
unsigned int _previousFrameEvaluated; unsigned int _previousFrameEvaluated;
bool _loop;
bool _initFirstFrame; bool _initFirstFrame;
TimelineStatus _state;
State _state;
bool _collectStats;
osg::ref_ptr<osg::Stats> _stats;
osg::ref_ptr<osgAnimation::StatsActionVisitor> _statsVisitor;
// to manage pending operation // to manage pending operation
bool _evaluating; bool _evaluating;
@@ -110,9 +202,331 @@ namespace osgAnimation
CommandList _addActionOperations; CommandList _addActionOperations;
ActionList _removeActionOperations; ActionList _removeActionOperations;
void internalRemoveAction(Action* action); void setEvaluating(bool state) { _evaluating = state;}
void internalAddAction(int priority, const FrameAction& ftl); void processPendingOperation()
{
// process all pending add action operation
while( !_addActionOperations.empty())
{
internalAddAction(_addActionOperations.back()._priority, _addActionOperations.back()._action);
_addActionOperations.pop_back();
}
// process all pending remove action operation
while( !_removeActionOperations.empty())
{
internalRemoveAction(_removeActionOperations.back().second.get());
_removeActionOperations.pop_back();
}
}
void internalRemoveAction(Action* action)
{
for (ActionLayers::iterator it = _actions.begin(); it != _actions.end(); it++)
{
ActionList& fa = it->second;
for (unsigned int i = 0; i < fa.size(); i++)
if (fa[i].second.get() == action)
{
fa.erase(fa.begin() + i);
return;
}
}
}
void internalAddAction(int priority, const FrameAction& ftl)
{
_actions[priority].push_back(ftl);
}
public:
META_Object(osgAnimation, Timeline);
Timeline();
Timeline(const Timeline& nc,const osg::CopyOp& op = osg::CopyOp::SHALLOW_COPY);
State getStatus() const { return _state; }
const ActionList& getActionLayer(int i)
{
return _actions[i];
}
unsigned int getCurrentFrame() const { return _currentFrame;}
double getCurrentTime() const { return _currentFrame * 1.0 / _fps;}
void play() { _state = Play; }
void gotoFrame(unsigned int frame) { _currentFrame = frame; }
void stop() { _state = Stop; }
bool getEvaluating() const { return _evaluating;}
bool isActive(Action* activeAction)
{
// update from high priority to low priority
for( ActionLayers::iterator iterAnim = _actions.begin(); iterAnim != _actions.end(); ++iterAnim )
{
// update all animation
ActionList& list = iterAnim->second;
for (unsigned int i = 0; i < list.size(); i++)
{
Action* action = list[i].second.get();
if (action == activeAction)
{
unsigned int firstFrame = list[i].first;
// check if current frame of timeline hit an action interval
if (_currentFrame >= firstFrame &&
_currentFrame < (firstFrame + action->getNumFrames()) )
return true;
}
}
}
return false;
}
void removeAction(Action* action)
{
if (getEvaluating())
_removeActionOperations.push_back(FrameAction(0, action));
else
internalRemoveAction(action);
}
virtual void addActionAt(unsigned int frame, Action* action, int priority = 0)
{
if (getEvaluating())
_addActionOperations.push_back(Command(priority,FrameAction(frame, action)));
else
internalAddAction(priority, FrameAction(frame, action));
}
virtual void addActionAt(double t, Action* action, int priority = 0)
{
unsigned int frame = static_cast<unsigned int>(floor(t * _fps));
addActionAt(frame, action, priority);
}
virtual void evaluate(unsigned int frame)
{
setEvaluating(true);
osg::notify(osg::DEBUG_INFO) << getName() << " evaluate frame " << _currentFrame << std::endl;
// update from high priority to low priority
for( ActionLayers::reverse_iterator iterAnim = _actions.rbegin(); iterAnim != _actions.rend(); ++iterAnim )
{
// update all animation
ActionList& list = iterAnim->second;
for (unsigned int i = 0; i < list.size(); i++)
{
unsigned int firstFrame = list[i].first;
Action* action = list[i].second.get();
// check if current frame of timeline hit an action interval
if (frame >= firstFrame &&
frame < (firstFrame + action->getNumFrames()) )
action->evaluate(frame - firstFrame);
}
}
setEvaluating(false);
// evaluate callback after updating all animation
evaluateCallback(frame);
_previousFrameEvaluated = frame;
}
virtual void evaluateCallback(unsigned int frame)
{
// update from high priority to low priority
for( ActionLayers::reverse_iterator iterAnim = _actions.rbegin(); iterAnim != _actions.rend(); ++iterAnim )
{
// update all animation
ActionList& list = iterAnim->second;
for (unsigned int i = 0; i < list.size(); i++)
{
unsigned int firstFrame = list[i].first;
Action* action = list[i].second.get();
// check if current frame of timeline hit an action interval
if (frame >= firstFrame &&
frame < (firstFrame + action->getNumFrames()) )
action->evaluateCallback(frame - firstFrame);
}
}
processPendingOperation();
}
virtual void update(double simulationTime)
{
// first time we call update we generate one frame
if (!_initFirstFrame)
{
_lastUpdate = simulationTime;
_initFirstFrame = true;
evaluate(_currentFrame);
}
// find the number of frame pass since the last update
double delta = (simulationTime - _lastUpdate);
double nbframes = delta * _fps * _speed;
unsigned int nb = static_cast<unsigned int>(floor(nbframes));
for (unsigned int i = 0; i < nb; i++)
{
if (_state == Play)
_currentFrame++;
evaluate(_currentFrame);
}
if (nb)
{
_lastUpdate += ((double)nb) / _fps;
}
}
};
// blend in from 0 to weight in duration
class BlendIn : public Action
{
double _weight;
osg::ref_ptr<Animation> _animation;
public:
BlendIn(Animation* animation, double duration, double weight)
{
_animation = animation;
_weight = weight;
float d = duration * _fps;
setNumFrames(static_cast<unsigned int>(floor(d)) + 1);
setName("BlendIn");
}
double getWeight() const { return _weight;}
virtual void evaluate(unsigned int frame)
{
Action::evaluate(frame);
// frame + 1 because the start is 0 and we want to start the blend in at the first
// frame.
double ratio = ( (frame+1) * 1.0 / (getNumFrames()) );
double w = _weight;
if (frame < getNumFrames() -1 ) // the last frame we set the target weight the user asked
w = _weight * ratio;
_animation->setWeight(w);
}
};
// blend in from 0 to weight in duration
class BlendOut : public Action
{
double _weight;
osg::ref_ptr<Animation> _animation;
public:
BlendOut(Animation* animation, double duration)
{
_animation = animation;
float d = duration * _fps;
setNumFrames(static_cast<unsigned int>(floor(d) + 1));
_weight = 1.0;
setName("BlendOut");
}
double getWeight() const { return _weight;}
virtual void evaluate(unsigned int frame)
{
Action::evaluate(frame);
// frame + 1 because the start is 0 and we want to start the blend in at the first
// frame.
double ratio = ( (frame+1) * 1.0 / (getNumFrames()) );
double w = 0.0;
if (frame < getNumFrames() -1 ) // the last frame we set the target weight the user asked
w = _weight * (1.0-ratio);
_animation->setWeight(w);
}
};
class ActionAnimation : public Action
{
public:
ActionAnimation(Animation* animation) : _animation(animation)
{
setDuration(animation->getDuration());
setName(animation->getName());
}
virtual void evaluate(unsigned int frame)
{
Action::evaluate(frame);
_animation->update(frame * 1.0/_fps);
}
Animation* getAnimation() { return _animation.get(); }
protected:
osg::ref_ptr<Animation> _animation;
};
// encapsulate animation with blend in blend out for classic usage
class StripAnimation : public Action
{
protected:
typedef std::pair<unsigned int, osg::ref_ptr<Action> > FrameAction;
public:
StripAnimation(Animation* animation, double blendInDuration, double blendOutDuration, double blendInWeightTarget = 1.0 )
{
_blendIn = new BlendIn(animation, blendInDuration, blendInWeightTarget);
_animation = new ActionAnimation(animation);
unsigned int start = static_cast<unsigned int>(floor((_animation->getDuration() - blendOutDuration) * _fps));
_blendOut = FrameAction(start, new BlendOut(animation, blendOutDuration));
setName(animation->getName() + "_Strip");
_blendIn->setName(_animation->getName() + "_" + _blendIn->getName());
_blendOut.second->setName(_animation->getName() + "_" + _blendOut.second->getName());
setDuration(animation->getDuration());
}
ActionAnimation* getActionAnimation() { return _animation.get(); }
BlendIn* getBlendIn() { return _blendIn.get(); }
BlendOut* getBlendOut() { return dynamic_cast<BlendOut*>(_blendOut.second.get()); }
const ActionAnimation* getActionAnimation() const { return _animation.get(); }
const BlendIn* getBlendIn() const { return _blendIn.get(); }
const BlendOut* getBlendOut() const { return dynamic_cast<BlendOut*>(_blendOut.second.get()); }
unsigned int getLoop() const { return _animation->getLoop(); }
void setLoop(unsigned int loop)
{
_animation->setLoop(loop);
if (!loop)
setDuration(-1);
else
setDuration(loop * _animation->getDuration());
// duration changed re evaluate the blendout duration
unsigned int start = static_cast<unsigned int>(floor((getDuration() - _blendOut.second->getDuration()) * _fps));
_blendOut = FrameAction(start, _blendOut.second);
}
virtual void evaluate(unsigned int frame)
{
if (frame > getNumFrames() - 1)
return;
Action::evaluate(frame);
if (frame < _blendIn->getNumFrames())
_blendIn->evaluate(frame);
if (frame >= _blendOut.first)
_blendOut.second->evaluate(frame - _blendOut.first);
_animation->evaluate(frame);
}
protected:
osg::ref_ptr<BlendIn> _blendIn;
FrameAction _blendOut;
osg::ref_ptr<ActionAnimation> _animation;
};
class RunAction : public Action::Callback
{
protected:
osg::ref_ptr<Timeline> _tm;
osg::ref_ptr<Action> _action;
public:
RunAction(Timeline* tm, Action* a) : _tm(tm), _action(a) {}
virtual void operator()(Action* /*action*/)
{
_tm->addActionAt(_tm->getCurrentFrame(), _action.get()); // warning we are trsversing the vector
}
}; };

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -10,10 +10,10 @@
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSGANIMATION_TIMELINE_ANIMATION_MANAGER #ifndef OSGANIMATION_TIMELINE_ANIMATION_MANAGER_H
#define OSGANIMATION_TIMELINE_ANIMATION_MANAGER 1 #define OSGANIMATION_TIMELINE_ANIMATION_MANAGER_H
#include <osgAnimation/Export> #include <osgAnimation/Export>
#include <osgAnimation/AnimationManagerBase> #include <osgAnimation/AnimationManagerBase>
@@ -23,21 +23,21 @@
namespace osgAnimation namespace osgAnimation
{ {
class OSGANIMATION_EXPORT TimelineAnimationManager : public AnimationManagerBase class OSGANIMATION_EXPORT TimelineAnimationManager : public AnimationManagerBase
{ {
protected: protected:
osg::ref_ptr<Timeline> _timeline; osg::ref_ptr<Timeline> _timeline;
public: public:
META_Object(osgAnimation, TimelineAnimationManager); META_Object(osgAnimation, TimelineAnimationManager);
TimelineAnimationManager(); TimelineAnimationManager();
TimelineAnimationManager(const AnimationManagerBase& manager); TimelineAnimationManager(const AnimationManagerBase& manager);
TimelineAnimationManager(const TimelineAnimationManager& nc,const osg::CopyOp&); TimelineAnimationManager(const TimelineAnimationManager& nc,const osg::CopyOp&);
Timeline* getTimeline() { return _timeline.get(); } Timeline* getTimeline() { return _timeline.get(); }
const Timeline* getTimeline() const { return _timeline.get(); } const Timeline* getTimeline() const { return _timeline.get(); }
void update(double time); void update(double time);
}; };
} }

View File

@@ -1,36 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_UPDATE_BONE
#define OSGANIMATION_UPDATE_BONE 1
#include <osgAnimation/Export>
#include <osgAnimation/UpdateMatrixTransform>
namespace osgAnimation
{
class OSGANIMATION_EXPORT UpdateBone : public UpdateMatrixTransform
{
public:
META_Object(osgAnimation, UpdateBone);
UpdateBone(const std::string& name = "");
UpdateBone(const UpdateBone&,const osg::CopyOp&);
void operator()(osg::Node* node, osg::NodeVisitor* nv);
};
}
#endif

View File

@@ -1,46 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_UPDATE_MATERIAL
#define OSGANIMATION_UPDATE_MATERIAL 1
#include <osgAnimation/AnimationUpdateCallback>
#include <osgAnimation/Export>
#include <osg/StateAttribute>
#include <osg/Material>
namespace osgAnimation
{
class OSGANIMATION_EXPORT UpdateMaterial : public AnimationUpdateCallback<osg::StateAttributeCallback>
{
protected:
osg::ref_ptr<Vec4Target> _diffuse;
public:
META_Object(osgAnimation, UpdateMaterial);
UpdateMaterial(const std::string& name = "");
UpdateMaterial(const UpdateMaterial& apc,const osg::CopyOp& copyop);
/** Callback method called by the NodeVisitor when visiting a node.*/
virtual void operator () (osg::StateAttribute*, osg::NodeVisitor*);
void update(osg::Material& material);
bool link(Channel* channel);
Vec4Target* getDiffuse();
};
}
#endif

View File

@@ -1,48 +0,0 @@
/* -*-c++-*-
* Copyright (C) 2009 Cedric Pinson <cedric.pinson@plopbyte.net>
*
* This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
* (at your option) any later version. The full license is in LICENSE file
* included with this distribution, and on the openscenegraph.org website.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* OpenSceneGraph Public License for more details.
*/
#ifndef OSGANIMATION_UPDATE_MATRIX_TRANSFORM
#define OSGANIMATION_UPDATE_MATRIX_TRANSFORM 1
#include <osgAnimation/Export>
#include <osgAnimation/AnimationUpdateCallback>
#include <osgAnimation/StackedTransform>
#include <osg/NodeCallback>
namespace osgAnimation
{
class OSGANIMATION_EXPORT UpdateMatrixTransform : public AnimationUpdateCallback<osg::NodeCallback>
{
public:
META_Object(osgAnimation, UpdateMatrixTransform);
UpdateMatrixTransform(const std::string& name = "");
UpdateMatrixTransform(const UpdateMatrixTransform& apc,const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
// Callback method called by the NodeVisitor when visiting a node.
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
virtual bool link(osgAnimation::Channel* channel);
StackedTransform& getStackedTransforms() { return _transforms;}
const StackedTransform& getStackedTransforms() const { return _transforms;}
protected:
StackedTransform _transforms;
};
}
#endif

View File

@@ -1,5 +1,5 @@
/* -*-c++-*- /* -*-c++-*-
* Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> * Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net>
* *
* This library is open source and may be redistributed and/or modified under * This library is open source and may be redistributed and/or modified under
* the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
@@ -12,8 +12,8 @@
* OpenSceneGraph Public License for more details. * OpenSceneGraph Public License for more details.
*/ */
#ifndef OSGANIMATION_VERTEX_INFLUENCE #ifndef OSGANIMATION_VERTEX_INFLUENCES_H
#define OSGANIMATION_VERTEX_INFLUENCE 1 #define OSGANIMATION_VERTEX_INFLUENCES_H
#include <osg/Object> #include <osg/Object>
#include <osgAnimation/Export> #include <osgAnimation/Export>
@@ -38,6 +38,8 @@ namespace osgAnimation
std::string _name; std::string _name;
}; };
// typedef std::map<std::string, VertexInfluence> VertexInfluenceMap;
class VertexInfluenceMap : public std::map<std::string, VertexInfluence> , public osg::Object class VertexInfluenceMap : public std::map<std::string, VertexInfluence> , public osg::Object
{ {
public: public:
@@ -50,7 +52,7 @@ namespace osgAnimation
// this class manage VertexInfluence database by mesh // this class manage VertexInfluence database by mesh
// reference bones per vertex ... // reference bones per vertex ...
class OSGANIMATION_EXPORT VertexInfluenceSet class VertexInfluenceSet
{ {
public: public:
typedef std::vector<VertexInfluence> BoneToVertexList; typedef std::vector<VertexInfluence> BoneToVertexList;
@@ -71,7 +73,7 @@ namespace osgAnimation
typedef std::vector<BoneWeight> BoneWeightList; typedef std::vector<BoneWeight> BoneWeightList;
typedef std::map<int,BoneWeightList> VertexIndexToBoneWeightMap; typedef std::map<int,BoneWeightList> VertexIndexToBoneWeightMap;
class UniqVertexSetToBoneSet class UniqVertexSetToBoneSet
{ {
public: public:
void setBones(BoneWeightList& bones) { _bones = bones;} void setBones(BoneWeightList& bones) { _bones = bones;}
@@ -86,12 +88,14 @@ namespace osgAnimation
typedef std::vector<UniqVertexSetToBoneSet> UniqVertexSetToBoneSetList; typedef std::vector<UniqVertexSetToBoneSet> UniqVertexSetToBoneSetList;
const UniqVertexSetToBoneSetList& getUniqVertexSetToBoneSetList() const { return _uniqVertexSetToBoneSet;} const UniqVertexSetToBoneSetList& getUniqVertexSetToBoneSetList() const { return _uniqVertexSetToBoneSet;}
void addVertexInfluence(const VertexInfluence& v); void addVertexInfluence(const VertexInfluence& v) { _bone2Vertexes.push_back(v); }
void buildVertex2BoneList(); void buildVertex2BoneList();
void buildUniqVertexSetToBoneSetList(); void buildUniqVertexSetToBoneSetList();
void clear(); void clear()
{
const VertexIndexToBoneWeightMap& getVertexToBoneList() const; _bone2Vertexes.clear();
_uniqVertexSetToBoneSet.clear();
}
protected: protected:
BoneToVertexList _bone2Vertexes; BoneToVertexList _bone2Vertexes;
VertexIndexToBoneWeightMap _vertex2Bones; VertexIndexToBoneWeightMap _vertex2Bones;

View File

@@ -38,15 +38,6 @@ extern OSGDB_EXPORT std::string convertUTF16toUTF8(const wchar_t* s);
extern OSGDB_EXPORT std::wstring convertUTF8toUTF16(const std::string& s); extern OSGDB_EXPORT std::wstring convertUTF8toUTF16(const std::string& s);
extern OSGDB_EXPORT std::wstring convertUTF8toUTF16(const char* s); extern OSGDB_EXPORT std::wstring convertUTF8toUTF16(const char* s);
extern OSGDB_EXPORT std::string convertStringFromCurrentCodePageToUTF8(const char* source, unsigned sourceLength);
extern OSGDB_EXPORT std::string convertStringFromUTF8toCurrentCodePage(const char* source, unsigned sourceLength);
extern OSGDB_EXPORT std::string convertStringFromCurrentCodePageToUTF8(const std::string& s);
extern OSGDB_EXPORT std::string convertStringFromCurrentCodePageToUTF8(const char* s);
extern OSGDB_EXPORT std::string convertStringFromUTF8toCurrentCodePage(const std::string& s);
extern OSGDB_EXPORT std::string convertStringFromUTF8toCurrentCodePage(const char* s);
} }
#endif #endif

Some files were not shown because too many files have changed in this diff Show More