From 56a6ee60fa8d3e077dfcecf788ad9a1b0c9c0934 Mon Sep 17 00:00:00 2001 From: Bozo the Builder Date: Thu, 11 Apr 2024 06:51:54 -0700 Subject: [PATCH] Sync changes from upstream repository --- opennurbs_annotationbase.h | 2 +- opennurbs_defines.h | 154 +------- opennurbs_line.cpp | 4 +- opennurbs_linecurve.cpp | 2 +- opennurbs_material.cpp | 97 ----- opennurbs_math.h | 4 - opennurbs_mesh.cpp | 635 +----------------------------- opennurbs_mesh.h | 205 +--------- opennurbs_nurbssurface.cpp | 20 +- opennurbs_point.h | 176 +-------- opennurbs_polyline.cpp | 11 +- opennurbs_public_version.h | 18 +- opennurbs_rand.h | 5 +- opennurbs_statics.cpp | 87 ----- opennurbs_subd.cpp | 307 +-------------- opennurbs_subd.h | 741 +----------------------------------- opennurbs_subd_eval.cpp | 611 ----------------------------- opennurbs_sun.cpp | 40 +- opennurbs_sun.h | 3 - opennurbs_texture.h | 6 - opennurbs_texture_mapping.h | 5 +- opennurbs_xml.cpp | 5 +- 22 files changed, 66 insertions(+), 3072 deletions(-) diff --git a/opennurbs_annotationbase.h b/opennurbs_annotationbase.h index ac362bd7..191ebba5 100644 --- a/opennurbs_annotationbase.h +++ b/opennurbs_annotationbase.h @@ -204,7 +204,7 @@ public: /* Returns: - Text information with rich text formatting instructions removed. + Text information with rich text formatting insturctions removed. The result string from evaluating fields is included Field results may be cached from previous evaluation */ diff --git a/opennurbs_defines.h b/opennurbs_defines.h index 847c28c3..8b5db81c 100644 --- a/opennurbs_defines.h +++ b/opennurbs_defines.h @@ -132,7 +132,6 @@ #endif - // ON_DEPRECATED is used to mark deprecated functions. #if defined(ON_COMPILER_MSC) #define ON_DEPRECATED __declspec(deprecated) @@ -157,40 +156,8 @@ #else #define ON_DEPRECATED #define ON_DEPRECATED_MSG(s) - -// Dale Lear 2024-March-14 -// Why are ON_WIP_SDK and ON_INTERNAL_SDK defined here? -// This seems exactly the opposite of what should happen. -// I think these should be wrapped in a -// #if defined(OPENNURBS_IN_RHINO) ... #endif block -// and that change needs extensive testing. -// -// #if defined(OPENNURBS_IN_RHINO) #define ON_WIP_SDK #define ON_INTERNAL_SDK -// #endif - -#endif - -#if defined(ON_WIP_SDK) -// Functions with ON_WIP_DECL are works in progress. -// Classes with ON_WIP_CLASS are works in progress. -// Externals with ON_WIP_EXTERN_DECL are works in progress. -// These items can be seen and used in Rhino core code. -// These items are not part of the public SDK. -// These items can and will change or be removed at any time without notice. -// Any C++ code using ON_WIP_* features is likely to fail catastrophically -// at the most inconvenient time imaginable. -#define ON_WIP_CLASS ON_CLASS -#define ON_WIP_DECL ON_DECL -#define ON_WIP_EXTERN_DECL ON_EXTERN_DECL -#else -// This header is not being parsed while building core Rhino modules and plug-ins. -// Any 3rd party code linking with the public C++ Rhino SDK will be unable to link -// with the work-in-progess items. Code could -#define ON_WIP_CLASS -#define ON_WIP_DECL -#define ON_WIP_EXTERN_DECL #endif #if defined(PI) @@ -347,6 +314,7 @@ extern ON_EXTERN_DECL const float ON_FLT_QNAN; extern ON_EXTERN_DECL const float ON_FLT_PINF; extern ON_EXTERN_DECL const float ON_FLT_NINF; + /* The ON_PTR_SEMAPHORE* values are used in rare cases when a special signal must be passed as a pointer argument. @@ -419,126 +387,6 @@ ON__UINT64 ON_NextContentSerialNumber(); ON_END_EXTERNC #if defined(ON_CPLUSPLUS) - -class ON_WIP_CLASS ON_DBL -{ -public: - - /// - /// ON_DBL::Nan is an IEEE quiet nan (not a number). - /// - static const double Nan; - - /// - /// ON_DBL::PositiveInfinity is IEEE +infinity. - /// - static const double PositiveInfinity; - - /// - /// ON_DBL::NegativeInfinity is IEEE -infinity. - /// - static const double NegativeInfinity; - - /// - /// ON_DBL::PositiveMax = +1.7976931348623158e+308 - /// - static const double PositiveMax; - - /// - /// ON_DBL::NegativeMax = -1.7976931348623158e+308 - /// - static const double NegativeMax; - - /// - /// ON_DBL::PositiveMax = +2.22507385850720200e-308 - /// - static const double PositiveMin; - - /// - /// ON_DBL::NegativeMax = -2.22507385850720200e-308 - /// - static const double NegativeMin; - - /// - /// ON_DBL::Unset = -1.23432101234321e+308 - /// - static const double Unset; - - /// - /// ON_DBL::PositiveUnset = +1.23432101234321e+308 - /// - static const double PositiveUnset; - - /// - /// True if x is any type of nan (signaling or quiet). - static bool IsNan(double x); - - /// - /// True if x is any type of infinity (positive, negative, projective). - static bool IsInfinity(double x); - - static bool IsPositiveInfinity(double x); - static bool IsNegativeInfinity(double x); - - /// - /// - /// If x > 0, then +1 is returned. - /// If x < 0, then -1 is returned. - /// Otherwise 0 is returned. - /// - static int Sign(double x); - - /// - /// All nans, +infinity, -infinity, - /// x <= than ON_DBL::Unset and - /// x >= ON_DBL::PositiveUnset - /// are considered invalid because using them in typical calculations - /// almost always returns useless results. - /// - /// - /// value to test. - /// - /// - /// (ON_DBL::Unset < x && x < ON_DBL::PositiveUnset) - /// - static bool IsValid(double x); - - /// - /// True if x is not a nan.. - static bool IsNotNan(double x); - - static bool IsUnset(double x); - - - /// - /// Well ordered compare that handles nans and sorts them to the end. - /// ON_DBL::CompareValue(nan, nan) = 0; - /// ON_DBL::CompareValue(non_nan, nan) = -1; - /// ON_DBL::CompareValue(nan, non_nan) = +1; - /// - /// - /// - /// - /// -1 if lhs < rhs or IsNotNan(lhs) and IsNan(rhs). - /// 0 if lhs == rhs or IsNan(lhs) && IsNan(rhs). - /// +1 if lhs > rhs or IsNotNan(lhs) && IsNan(rhs). - /// - static int CompareValue(double lhs, double rhs); - - /// - /// Well ordered compare that handles nullpt and nans and sorts them - /// to the end. - /// ON_DBL::Compare(nullptr, nullptr) = 0; - /// ON_DBL::Compare(not nullptr, nullptr) = -1; - /// ON_DBL::Compare(nullptr, not nullptr) = +1; - /// ON_DBL::Compare(not nullptr, not nullptr) = ON_DBL::CompareValue(*lhs,*rhs); - /// - /// - /// - /// - static int Compare(const double* lhs, const double* rhs); -}; - ON_DECL bool ON_IsNullPtr(const void* ptr); diff --git a/opennurbs_line.cpp b/opennurbs_line.cpp index 474d540c..b2208cb7 100644 --- a/opennurbs_line.cpp +++ b/opennurbs_line.cpp @@ -82,9 +82,7 @@ bool ON_Line::Create( const ON_2dPoint from_pt, const ON_2dPoint to_pt ) bool ON_Line::IsValid() const { - bool from_rc = ON_CV_COORDINATE_IS_VALID(from.x) && ON_CV_COORDINATE_IS_VALID(from.y) && ON_CV_COORDINATE_IS_VALID(from.z); - bool to_rc = ON_CV_COORDINATE_IS_VALID(to.x) && ON_CV_COORDINATE_IS_VALID(to.y) && ON_CV_COORDINATE_IS_VALID(to.z); - return (from != to && true == from_rc && true == to_rc); + return (from != to && from.IsValid() && to.IsValid()); } double ON_Line::Length() const diff --git a/opennurbs_linecurve.cpp b/opennurbs_linecurve.cpp index 5969ead7..4819065a 100644 --- a/opennurbs_linecurve.cpp +++ b/opennurbs_linecurve.cpp @@ -186,7 +186,7 @@ ON_LineCurve::SwapCoordinates( int i, int j ) bool ON_LineCurve::IsValid( ON_TextLog* text_log ) const { - return (m_line.IsValid() && m_t[0] < m_t[1] && !m_line.from.IsCoincident(m_line.to) ) ? true : false; + return ( m_t[0] < m_t[1] && !m_line.from.IsCoincident(m_line.to) ) ? true : false; } void ON_LineCurve::Dump( ON_TextLog& dump ) const diff --git a/opennurbs_material.cpp b/opennurbs_material.cpp index 893420f8..fa9ee3d6 100644 --- a/opennurbs_material.cpp +++ b/opennurbs_material.cpp @@ -2314,87 +2314,6 @@ bool ON_Texture::IsWcsBoxProjected() const return (m_mapping_channel_id == (unsigned int)MAPPING_CHANNEL::wcs_box_channel); } -ON_3dPoint ON_Texture::WcsBoxMapping(const ON_3dPoint& pt, const ON_3dVector& n) -{ - // This code is moved here from CRhRdkTexture::WcsBoxMapping - - int side0 = 0; - - const ON_3dPoint& rst(pt); - - // set side0 = side closest to the point - int side1 = (std::abs(rst.x) >= std::abs(rst.y)) ? 0 : 1; - if (std::abs(rst.z) > std::abs(((double*)&rst.x)[side1])) - side1 = 2; - - double t1 = (&rst.x)[side1]; - if (t1 < 0.0) - side0 = 2 * side1 + 1; - else - side0 = 2 * side1 + 2; - - side1 = (std::abs(n.x) >= std::abs(n.y)) ? 0 : 1; - if (std::abs(n.z) > std::abs((&n.x)[side1])) - { - side1 = 2; - } - - t1 = n[side1]; - if (0.0 != t1) - { - if (t1 < 0.0) - side0 = 2 * side1 + 1; - else - if (t1 > 0.0) - side0 = 2 * side1 + 2; - } - - // side flag - // 1 = left side (x=-1) - // 2 = right side (x=+1) - // 3 = back side (y=-1) - // 4 = front side (y=+1) - // 5 = bottom side (z=-1) - // 6 = top side (z=+1) - ON_3dPoint v; - switch (side0) - { - case 1: - v.x = -pt.y; - v.y = pt.z; - v.z = pt.x; - break; - case 2: - v.x = pt.y; - v.y = pt.z; - v.z = pt.x; - break; - case 3: - v.x = pt.x; - v.y = pt.z; - v.z = pt.y; - break; - case 4: - v.x = -pt.x; - v.y = pt.z; - v.z = pt.y; - break; - case 5: - v.x = -pt.x; - v.y = pt.y; - v.z = pt.z; - break; - case 6: - default: - v.x = pt.x; - v.y = pt.y; - v.z = pt.z; - break; - } - - return v; -} - ON_Texture::TYPE ON_Texture::TypeFromUnsigned(unsigned int type_as_unsigned) { switch (type_as_unsigned) @@ -2703,8 +2622,6 @@ const ON_wString ON_TextureMapping::TypeToString(ON_TextureMapping::TYPE texture ON_ENUM_TO_WIDE_STRING_CASE(ON_TextureMapping::TYPE::brep_mapping_primitive); ON_ENUM_TO_WIDE_STRING_CASE(ON_TextureMapping::TYPE::ocs_mapping); ON_ENUM_TO_WIDE_STRING_CASE(ON_TextureMapping::TYPE::false_colors); - ON_ENUM_TO_WIDE_STRING_CASE(ON_TextureMapping::TYPE::wcs_projection); - ON_ENUM_TO_WIDE_STRING_CASE(ON_TextureMapping::TYPE::wcsbox_projection); } ON_ERROR("Invalid texture_mapping_type value."); @@ -3770,16 +3687,6 @@ int ON_TextureMapping::Evaluate( rc = 0; break; - case ON_TextureMapping::TYPE::wcs_projection: - *T = m_Pxyz * P; - rc = 1; - break; - - case ON_TextureMapping::TYPE::wcsbox_projection: - *T = ON_Texture::WcsBoxMapping(m_Pxyz * P, m_Nxyz * N); - rc = 1; - break; - default: rc = EvaluatePlaneMapping(P,N,T); break; @@ -4020,9 +3927,6 @@ bool ON_TextureMapping::RequiresVertexNormals() const if(m_type == ON_TextureMapping::TYPE::box_mapping) return true; if(m_type == ON_TextureMapping::TYPE::cylinder_mapping && m_bCapped) - return true; - - if (m_type == ON_TextureMapping::TYPE::wcsbox_projection) return true; return false; @@ -4506,7 +4410,6 @@ bool ON_TextureMapping::GetTextureCoordinates( || ON_TextureMapping::TYPE::box_mapping == m_type || ON_TextureMapping::TYPE::cylinder_mapping == m_type || ON_TextureMapping::TYPE::mesh_mapping_primitive == m_type - || ON_TextureMapping::TYPE::wcsbox_projection == m_type ) ) { diff --git a/opennurbs_math.h b/opennurbs_math.h index b89e12f9..863f7c52 100644 --- a/opennurbs_math.h +++ b/opennurbs_math.h @@ -469,10 +469,6 @@ private: #define ON_IS_INFINITE_FLOAT(x) ((x) > 3.402823466e+38F || (x) < -3.402823466e+38F) #define ON_IS_VALID(x) ((x) > ON_UNSET_VALUE && (x) < ON_UNSET_POSITIVE_VALUE) -// March 27, 2024 - Tim -// Fix for https://mcneel.myjetbrains.com/youtrack/issue/RH-81184 -// The vertexes were crap just not quite ON_UNSET_VALUE crap -#define ON_CV_COORDINATE_IS_VALID(x) (-1.0e307 < x && x < 1.0e307) #define ON_IS_VALID_FLOAT(x) ((x) > ON_UNSET_FLOAT && (x) < ON_UNSET_POSITIVE_FLOAT) #define ON_IS_UNSET_DOUBLE(x) (ON_UNSET_VALUE == (x) || ON_UNSET_POSITIVE_VALUE == (x)) #define ON_IS_UNSET_FLOAT(x) (ON_UNSET_FLOAT == (x) || ON_UNSET_POSITIVE_FLOAT == (x)) diff --git a/opennurbs_mesh.cpp b/opennurbs_mesh.cpp index a02c0c77..42107ee1 100644 --- a/opennurbs_mesh.cpp +++ b/opennurbs_mesh.cpp @@ -12,8 +12,6 @@ //////////////////////////////////////////////////////////////// #include "opennurbs.h" -#include -#include #if !defined(ON_COMPILING_OPENNURBS) // This check is included in all opennurbs source .c and .cpp files to insure @@ -4311,402 +4309,6 @@ bool ON_Mesh::HasCachedTextureCoordinates() const return false; } -// Note: We are exporting this function for use in CRhinoObject::SetCachedTextureCoordinatesFromPlugIn -ON_DECL bool ON_Mesh_Private_CacheMappingChannel(std::function get_mapping_func, const ON_MappingChannel* pMC, const ON_SimpleArray& mappings_to_cache, const int mapping_channel_id, std::unordered_map& mapInOut) -{ - const bool cache_all = (mappings_to_cache.Count() == 0); - - if (nullptr == pMC) - { - const ON_TextureMapping& srfp_mapping = ON_TextureMapping::SurfaceParameterTextureMapping; - if(cache_all || mappings_to_cache.Search(srfp_mapping.m_type) >= 0) - { - // If the mapping channel is null, then we can assume that the textures implicitly - // reference the surface parameter mapping. - // This is done according to the documentation for ON_Texture::m_mapping_channel_id. - mapInOut[mapping_channel_id] = srfp_mapping; - } - } - else - { - ON_TextureMapping mapping = get_mapping_func(pMC); - - if (mapping.m_type != ON_TextureMapping::TYPE::no_mapping) - { - // How to handle ON_TextureMapping::TYPE::ocs_mapping - // and ON_TextureMapping::TYPE::false_colors ? - if(cache_all || mappings_to_cache.Search(mapping.m_type) >= 0) - { - mapInOut[mapping_channel_id] = mapping; - } - } - } - - return true; -} - -// Note: We are exporting this function for use in CRhinoObject::SetCachedTextureCoordinatesFromPlugIn -ON_DECL bool ON_Mesh_Private_AddPerVertexMappingChannels(std::function get_texture_mapping_func, const ON_MappingRef* mapping_ref, const ON_SimpleArray& mappings_to_cache, const ON_Material& material, std::unordered_map& mappings) -{ - for (int i = 0; i < material.m_textures.Count(); i++) - { - if (material.m_textures[i].m_bOn) - { - // Get mapping channel id and check if mapping already is in the map - const unsigned int mapping_channel_id = material.m_textures[i].m_mapping_channel_id; - if (mappings.find(mapping_channel_id) == mappings.end()) - { - const ON_MappingChannel* mapping_channel = nullptr; - if (mapping_ref) - { - // Get texture mapping and add it to the map - mapping_channel = mapping_ref->MappingChannel(mapping_channel_id); - if (mapping_channel == nullptr) - { - // If a mapping channel is not found using 'mapping_channel_id', then try with a mapping channel id of 1. - // This is done according to the documentation for ON_Texture::m_mapping_channel_id. - mapping_channel = mapping_ref->MappingChannel(1); - } - } - - if (!ON_Mesh_Private_CacheMappingChannel(get_texture_mapping_func, mapping_channel, mappings_to_cache, mapping_channel_id, mappings)) - return false; - } - } - } - - // If we didn't cache any texture coordinates above, but we have a material with anisotropy, - // which requires tangents, which in turn requires texture coordinates, then we cache - // the texture coordinates from mapping channel 1. - if (mappings.size() == 0) - { - if (material.IsPhysicallyBased() && material.PhysicallyBased()->Anisotropic() > 0.0) - { - const ON_MappingChannel* mapping_channel = mapping_ref ? mapping_ref->MappingChannel(1) : nullptr; - - if (!ON_Mesh_Private_CacheMappingChannel(get_texture_mapping_func, mapping_channel, mappings_to_cache, 1, mappings)) - return false; - } - } - - return true; -} - -// Note: We are exporting this function for use in CRhinoObject::SetCachedTextureCoordinatesFromPlugIn -ON_DECL bool ON_Mesh_Private_SetCachedTextureCoordinatesFromMaterial(ON_SimpleArray& meshes, std::unordered_map& per_vertex_channels, const ON_MappingRef* mapping_ref, bool perform_cleanup, std::shared_ptr* vbo_data) -{ - ON_ClassArray> indices_to_preserve; - indices_to_preserve.SetCapacity(meshes.Count()); - indices_to_preserve.SetCount(meshes.Count()); - - // Set cached texture coordinates for each mapping on the map for every render mesh - for (auto pvcit = per_vertex_channels.begin(); pvcit != per_vertex_channels.end(); pvcit++) - { - const unsigned int mapping_channel_id = pvcit->first; - const ON_TextureMapping& mapping = pvcit->second; - - // Get object mapping transformation - const ON_MappingChannel* pMC = mapping_ref ? mapping_ref->MappingChannel(mapping_channel_id) : nullptr; - - const ON_Xform* pObjectXform = (pMC == nullptr || pMC->m_object_xform.IsIdentity() || pMC->m_object_xform.IsZero()) ? nullptr : &pMC->m_object_xform; - - // Set cached texture coordinates for each of the render meshes - for (int mi = 0; mi < meshes.Count(); mi++) - { - // Const cast render mesh and set texture coordinates - ON_Mesh* pMesh = const_cast(meshes[mi]); - if (nullptr != pMesh) - { - bool has_matching_cached_tcs = false; - for (int i = 0; i < pMesh->m_TC.Count(); i++) - { - if (pMesh->VertexCount() == pMesh->m_TC[i].m_T.Count() && mapping.HasMatchingTextureCoordinates(pMesh->m_TC[i].m_tag, pObjectXform)) - { - indices_to_preserve[mi].Append(i); - has_matching_cached_tcs = true; - break; - } - } - - if (!has_matching_cached_tcs) - { - indices_to_preserve[mi].Append(pMesh->m_TC.Count()); - - pMesh->SetCachedTextureCoordinatesEx(mapping, pObjectXform, true, false); - - if(vbo_data) - vbo_data->reset(); - } - } - } - } - - if(perform_cleanup) - { - for (int mi = 0; mi < meshes.Count(); mi++) - { - ON_Mesh* pMesh = const_cast(meshes[mi]); - if (nullptr != pMesh) - { - const int tc_count = pMesh->m_TC.Count(); - if (tc_count > per_vertex_channels.size()) - { - int wcs_mapping_count = 0; - int wcs_box_mapping_count = 0; - ON_SimpleArray indices_to_remove; - - for (int tci = tc_count - 1; tci >= 0; tci--) - { - if (indices_to_preserve[mi].Search(tci) == -1) - { - ON_TextureMapping::TYPE mapping_type = pMesh->m_TC[tci].m_tag.m_mapping_type; - bool remove_index = true; - - // Only clean up WCS and WCS Box mappings if there exist more recent versions - // in the array. They are considered more recent if they appear later in the array. - if(mapping_type == ON_TextureMapping::TYPE::wcs_projection && wcs_mapping_count++ == 0) - { - remove_index = false; // Don't remove first one we find - } - else if(mapping_type == ON_TextureMapping::TYPE::wcsbox_projection && wcs_box_mapping_count++ == 0) - { - remove_index = false; // Don't remove first one we find - } - - if(remove_index) - indices_to_remove.Append(tci); - } - } - - for (int tci = indices_to_remove.Count() - 1; tci >= 0; tci--) - pMesh->m_TC.Remove(indices_to_remove[tci]); - - if(vbo_data && indices_to_remove.Count() > 0) - vbo_data->reset(); - } - } - } - } - - return true; -} - -static ON_UUID WcsMappingId(const ON_Xform& ocsTransform, bool bBox) -{ - // {47D62129-341E-4E3D-BF11-9C051AF4ED98} - static const ON_UUID uuidBaseWcs = - { 0x47d62129, 0x341e, 0x4e3d, { 0xbf, 0x11, 0x9c, 0x5, 0x1a, 0xf4, 0xed, 0x98 } }; - - // {4DC9AA78-9617-46FB-923F-3E65E14182FC} - static const ON_UUID uuidBaseWcsBox = - { 0x4dc9aa78, 0x9617, 0x46fb, { 0x92, 0x3f, 0x3e, 0x65, 0xe1, 0x41, 0x82, 0xfc } }; - - ON_UUID uuid = bBox ? uuidBaseWcsBox : uuidBaseWcs; - uuid.Data1 = ocsTransform.CRC32(uuid.Data1); - return uuid; -} - -static ON_Xform GetOcsTransform(std::function get_mapping_func, const ON_MappingRef* mapping_ref) -{ - ON_Xform ocsTransform = ON_Xform::IdentityTransformation; - if (nullptr != mapping_ref) - { - const ON_MappingChannel* pMC = mapping_ref->MappingChannel(ON_ObjectRenderingAttributes::OCSMappingChannelId()); - if (nullptr != pMC) - { - const ON_TextureMapping tm = get_mapping_func(pMC); - ON_Xform inverseObjectTransform = pMC->m_object_xform; - if (inverseObjectTransform.Invert()) - { - ocsTransform = tm.m_Pxyz * inverseObjectTransform; - } - else - { - ocsTransform = tm.m_Pxyz; - } - } - } - return ocsTransform; -} - -static void CacheWcsProjections(const ON_Mesh& mesh, std::function get_mapping_func, const ON_Material& material, const ON_MappingRef* mapping_ref) -{ - bool bWcsProjectionNeeded = false; - bool bWcsBoxProjectionNeeded = false; - for (int ti = 0; ti < material.m_textures.Count(); ti++) - { - if (material.m_textures[ti].IsWcsProjected()) - bWcsProjectionNeeded = true; - if (material.m_textures[ti].IsWcsBoxProjected()) - bWcsBoxProjectionNeeded = true; - } - - if (bWcsProjectionNeeded) - { - const ON_Xform ocsTransform = GetOcsTransform(get_mapping_func, mapping_ref); - const ON_UUID uuidWcsMapping = WcsMappingId(ocsTransform, false); - ON_TextureMapping wcsMapping; - wcsMapping.m_type = ON_TextureMapping::TYPE::wcs_projection; - wcsMapping.SetId(uuidWcsMapping); - wcsMapping.m_Pxyz = ocsTransform; - if (!wcsMapping.HasMatchingCachedTextureCoordinates(mesh)) - { - ON_TextureCoordinates& tcs = const_cast(&mesh)->m_TC.AppendNew(); - wcsMapping.GetTextureCoordinates(mesh, tcs.m_T); - tcs.m_tag.Set(wcsMapping); - tcs.m_tag.m_mesh_xform = ON_Xform::ZeroTransformation; - tcs.m_dim = 2; - return; - } - } - if (bWcsBoxProjectionNeeded) - { - const ON_Xform ocsTransform = GetOcsTransform(get_mapping_func, mapping_ref); - const ON_UUID uuidWcsBoxMapping = WcsMappingId(ocsTransform, true); - ON_TextureMapping wcsBoxMapping; - wcsBoxMapping.m_type = ON_TextureMapping::TYPE::wcsbox_projection; - wcsBoxMapping.SetId(uuidWcsBoxMapping); - wcsBoxMapping.m_Pxyz = ocsTransform; - wcsBoxMapping.m_Pxyz.GetSurfaceNormalXform(wcsBoxMapping.m_Nxyz); - if (!wcsBoxMapping.HasMatchingCachedTextureCoordinates(mesh)) - { - ON_TextureCoordinates& tcs = const_cast(&mesh)->m_TC.AppendNew(); - wcsBoxMapping.GetTextureCoordinates(mesh, tcs.m_T); - tcs.m_tag.Set(wcsBoxMapping); - tcs.m_tag.m_mesh_xform = ON_Xform::ZeroTransformation; - tcs.m_dim = 2; - return; - } - } -} - -bool SetCachedTextureCoordinatesFromMaterial(const ON_Mesh& mesh, std::function get_mapping_func, const ON_Material& material, const ON_MappingRef* mapping_ref, const ON_SimpleArray& mappings_to_cache, bool perform_cleanup) -{ - // Create a map of all texture mappings that require per-vertex texture coordinates - std::unordered_map per_vertex_channels; - if (!ON_Mesh_Private_AddPerVertexMappingChannels(get_mapping_func, mapping_ref, mappings_to_cache, material, per_vertex_channels)) - return false; - - ON_SimpleArray meshes; - meshes.Append(&mesh); - - CacheWcsProjections(mesh, get_mapping_func, material, mapping_ref); - - return ON_Mesh_Private_SetCachedTextureCoordinatesFromMaterial(meshes, per_vertex_channels, mapping_ref, perform_cleanup, nullptr); -} - -bool ON_Mesh::SetCachedTextureCoordinatesFromMaterial(const ONX_Model& onx_model, const ON_Material& material, const ON_MappingRef* mapping_ref) const -{ - auto get_mapping_func = [&onx_model](const ON_MappingChannel* pMC) - { - ON_TextureMapping mapping = ON_TextureMapping::SurfaceParameterTextureMapping; - - ONX_ModelComponentIterator it(onx_model, ON_ModelComponent::Type::TextureMapping); - - for ( ON_ModelComponentReference cr = it.FirstComponentReference(); false == cr.IsEmpty(); cr = it.NextComponentReference()) - { - const ON_TextureMapping* texture_mapping = ON_TextureMapping::Cast(cr.ModelComponent()); - if (nullptr == texture_mapping) - continue; - - if(ON_UuidCompare(&texture_mapping->Id(), &pMC->m_mapping_id) == 0) - { - mapping = *texture_mapping; - break; - } - } - - return mapping; - }; - - ON_SimpleArray mappings_to_cache; - return ::SetCachedTextureCoordinatesFromMaterial(*this, get_mapping_func, material, mapping_ref, mappings_to_cache, false); -} - -static const ON_TextureCoordinates* Internal_GetCachedTextureCoordinates(const ON_Mesh& mesh, std::function get_mapping_func, const ON_Texture& texture, const ON_MappingRef* mapping_ref) -{ - if (texture.IsWcsProjected() || texture.IsWcsBoxProjected()) - { - const ON_Xform ocsTransform = GetOcsTransform(get_mapping_func, mapping_ref); - const ON_UUID mappingId = WcsMappingId(ocsTransform, texture.IsWcsBoxProjected()); - const ON_TextureCoordinates* pTCs = mesh.CachedTextureCoordinates(mappingId); - return pTCs; - } - else if (texture.m_mapping_channel_id >= 0) - { - if (nullptr != mapping_ref) - { - const ON_MappingChannel* pMC = mapping_ref->MappingChannel(texture.m_mapping_channel_id); - if (nullptr != pMC) - { - const ON_TextureCoordinates* pTCs = mesh.CachedTextureCoordinates(pMC->m_mapping_id); - // Probably best to not const cast and start setting the texture coordinates. - // All previously returned pointers to the m_TC should be kept valid. - //if (nullptr == pTCs) - //{ - // ON_TextureMapping mapping = get_mapping_func(pMC); - // pTCs = const_cast(this)->SetCachedTextureCoordinatesEx(mapping, &pMC->m_object_xform, true, false); - //} - return pTCs; - } - } - else - { - // Return surface parameter mapping if there is nothing else - const ON_TextureCoordinates* pTCs = mesh.CachedTextureCoordinates(ON_TextureMapping::SurfaceParameterTextureMappingId); - return pTCs; - } - } - return nullptr; -} - -const ON_TextureCoordinates* ON_Mesh::GetCachedTextureCoordinates(const ONX_Model& onx_model, const ON_Texture& texture, const ON_MappingRef* mapping_ref) const -{ - auto get_mapping_func = [&onx_model](const ON_MappingChannel* pMC) - { - ON_TextureMapping mapping = ON_TextureMapping::SurfaceParameterTextureMapping; - - ONX_ModelComponentIterator it(onx_model, ON_ModelComponent::Type::TextureMapping); - - for (ON_ModelComponentReference cr = it.FirstComponentReference(); false == cr.IsEmpty(); cr = it.NextComponentReference()) - { - const ON_TextureMapping* texture_mapping = ON_TextureMapping::Cast(cr.ModelComponent()); - if (nullptr == texture_mapping) - continue; - - if (ON_UuidCompare(&texture_mapping->Id(), &pMC->m_mapping_id) == 0) - { - mapping = *texture_mapping; - break; - } - } - - return mapping; - }; - - return ::Internal_GetCachedTextureCoordinates(*this, get_mapping_func, texture, mapping_ref); -} - -static GET_TEXMAP_FROM_DOCUMENT pFnGetTexMapFromDocument = nullptr; - -// Note: We are exporting this function for use in CRhinoObject::SetCachedTextureCoordinatesFromPlugIn -ON_DECL std::function ON_Mesh_Private_GetTextureMappingFromDocumentLambda(const CRhinoDoc& rhino_doc) -{ - return [&rhino_doc](const ON_MappingChannel* pMC) - { - if ( pFnGetTexMapFromDocument ) - { - // Call into Rhino - return pFnGetTexMapFromDocument(rhino_doc, pMC); - } - else - { - return ON_TextureMapping::SurfaceParameterTextureMapping; - } - }; -} - - const ON_TextureCoordinates* ON_Mesh::CachedTextureCoordinates( const ON_UUID& mapping_id ) const { @@ -4791,18 +4393,6 @@ bool ON_Mesh::SetCurvatureColorAnalysisColors( ON_SurfaceCurvatureColorMapping kappa_colors ) { - if (false == this->HasPrincipalCurvatures()) - { -#if 0 - // will be added April/May of 2024 - if (kappa_colors.IsSet()) - { - this->ComputeVertexPrincipalCurvatures(ON_Mesh::CurvatureSettingMethod::DiscreteDefault, false); - bLazy = false; // m_C[] is probably out of date even if the mapping tag is set. - } -#endif - return this->HasPrincipalCurvatures(); - } const bool bSetColors = kappa_colors.IsSet() && this->HasPrincipalCurvatures(); const ON_MappingTag Ctag = kappa_colors.ColorMappingTag(); if (bSetColors && bLazy && HasVertexColors() && this->m_Ctag == Ctag) @@ -6684,40 +6274,6 @@ void ON_Mesh::Append(int mesh_count, const ON_Mesh* const* meshes) } } - bool bAllowNewCachedTCs = (vcount0 == 0); - for (mi = 0; mi < mesh_count; mi++) - { - m = meshes[mi]; - if (0 == m) - continue; - - if (bAllowNewCachedTCs) - { - m_TC = m->m_TC; - bAllowNewCachedTCs = false; - } - else - { - for (int tci = 0; tci < m_TC.Count(); tci++) - { - bool bKeep = false; - for (int tcimi = 0; tcimi < m->m_TC.Count(); tcimi++) - { - if (m_TC[tci].m_tag == m->m_TC[tcimi].m_tag) - { - m_TC[tci].m_T.Append(m->m_TC[tcimi].m_T.Count(), m->m_TC[tcimi].m_T.Array()); - bKeep = true; - } - } - if (!bKeep) - { - m_TC.Remove(tci); - tci--; - } - } - } - } - SetClosed(-99); SetSolidOrientation(-99); InvalidateBoundingBoxes(); @@ -8607,10 +8163,6 @@ bool ON_Mesh::ConvertQuadsToTriangles() double ON_TriangleArea3d(ON_3dPoint A, ON_3dPoint B, ON_3dPoint C) { - // MF, March 18 24: - // a faster and numerically more robust version would be William Kahan's version of Heron's formula, - // see "Accuracy and Stability of Numerical Algorithms", N. Higham. - // speed this up if needed return 0.5*ON_CrossProduct(B-A,C-A).Length(); } @@ -9161,19 +8713,6 @@ bool ON_Mesh::ComputeVertexNormals() return rc; } - -#if 0 -// Will be added April/may of 2024 -bool ON_Mesh::ComputeVertexPrincipalCurvatures( - ON_Mesh::CurvatureSettingMethod method, - bool bLazy -) -{ - // NOT INCLUDED IN PUBLIC OPENNURBS - return false; -} -#endif - bool ON_Mesh::NormalizeTextureCoordinates() { ON_2fPoint t0;//, t1; @@ -9813,123 +9352,6 @@ const ON_SurfaceCurvature ON_SurfaceCurvature::CreateFromPrincipalCurvatures( return k; } -const ON_SurfaceCurvature ON_SurfaceCurvature::CreateFromGaussianAndMeanCurvatures( - double gaussian_curvature, - double mean_curvature -) -{ - if (ON_IS_VALID(gaussian_curvature) && ON_IS_VALID(mean_curvature)) - { - const double r = mean_curvature * mean_curvature - gaussian_curvature; - if (r >= 0.0) - { - const double k1 = mean_curvature + sqrt(r); - const double k2 = mean_curvature - sqrt(r); - return ON_SurfaceCurvature::CreateFromPrincipalCurvatures(k1, k2); - } - else if (r < 0.0) - { - // Dale Lear - March 2024 - RH-81078 - // We end up here when r < 0 and gaussian_curvature > 0. - // We are in one of 3 cases: - // 1) We are dealing with a very small and noisy negative r. - // 2) We are dealing with esimates of mean and gaussian. - // 3) Something else that is uncommon. - - // In case 1, mean*mean and gaussian are both larger relative to fabs(r). - // We don't know which input value is more precise, but people typically - // care more about gaussian so we use k1=k2=sign(mean)*sqrt(gaussian) instead of - // k1 = k2 = mean. - // - // In case 2, the value of gaussian is typically more important than the value - // of mean, because people are often testing to see how a mesh can be flattened. - // - // So, we assume we are at or near an umbilic (k1=k2) and set them so that - // k1*k2 = gaussian_curvature and sign(k1+k2) = sign(mean). - // These choices preserve gaussian minimize fabs( 0.5*(k1+k2) - mean_curvature). - const double k1 = ((mean_curvature < 0.0) ? -1.0 : 1.0) * sqrt(gaussian_curvature); - const double k2 = k1; - return ON_SurfaceCurvature::CreateFromPrincipalCurvatures(k1, k2); - // put a breakpoint on the line above to dectect when we are in - // this unusual situation. - } - } - if (ON_IS_VALID(gaussian_curvature)) - { - // It can happen that only Gaussian was estimated, whether on purpose or not. - const double k1 = sqrt(fabs(gaussian_curvature)); - const double k2 = ((gaussian_curvature < 0.0) ? -1.0 : 1.0) * k1; - return ON_SurfaceCurvature::CreateFromPrincipalCurvatures(k1, k2); - } - if (ON_IS_VALID(mean_curvature)) - { - // It can also happen that only mean was estimated, whether on purpose or not. - return ON_SurfaceCurvature::CreateFromPrincipalCurvatures(mean_curvature, mean_curvature); - } - return ON_SurfaceCurvature::Nan; -} - -const ON_SurfaceCurvature ON_SurfaceCurvature::FlipSurfaceOrientation() const -{ - // negate and reverse the order of (this->k1, this->k2) - return ON_SurfaceCurvature::CreateFromPrincipalCurvatures(-k2, -k1); -} - -int ON_SurfaceCurvature::Compare(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - if (lhs.IsNan()) - return rhs.IsNan() ? 0 : 1; // nans sort last - if (rhs.IsNan()) - return -1; // nans sort last - if (lhs.k1 < rhs.k1) - return -1; - if (lhs.k1 > rhs.k1) - return 1; - if (lhs.k2 < rhs.k2) - return -1; - if (lhs.k2 > rhs.k2) - return 1; - return 0; -} - -int ON_SurfaceCurvature::CompareMaximumAndMinimumPrincipalCurvatures(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - const int rc = ON_SurfaceCurvature::CompareMaximumPrincipalCurvature(lhs, rhs); - return 0 != rc ? rc : ON_SurfaceCurvature::CompareMinimumPrincipalCurvature(lhs, rhs); -} - -int ON_SurfaceCurvature::CompareMaximumPrincipalCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - return ON_DBL::CompareValue(lhs.MaximumPrincipalCurvature(), rhs.MaximumPrincipalCurvature()); -} - -int ON_SurfaceCurvature::CompareMinimumPrincipalCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - return ON_DBL::CompareValue(lhs.MinimumPrincipalCurvature(), rhs.MinimumPrincipalCurvature()); -} - -int ON_SurfaceCurvature::CompareGaussianCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - return ON_DBL::CompareValue(lhs.GaussianCurvature(), rhs.GaussianCurvature()); -} - -int ON_SurfaceCurvature::CompareMeanCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - return ON_DBL::CompareValue(lhs.MeanCurvature(), rhs.MeanCurvature()); -} - -int ON_SurfaceCurvature::CompareMaximumRadius(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - return ON_DBL::CompareValue(lhs.MaximumRadius(), rhs.MaximumRadius()); -} - -int ON_SurfaceCurvature::CompareMinimumRadius(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs) -{ - return ON_DBL::CompareValue(lhs.MinimumRadius(), rhs.MinimumRadius()); -} - - - double ON_SurfaceCurvature::KappaValue(ON::curvature_style kappa_style) const { double k; @@ -10075,28 +9497,10 @@ bool operator!=(const ON_SurfaceCurvatureColorMapping& lhs, const ON_SurfaceCurv return false; } -bool operator==( - const ON_SurfaceCurvature& lhs, - const ON_SurfaceCurvature& rhs - ) -{ - return (lhs.k1 == rhs.k1 && lhs.k2 == rhs.k2); -} - -bool operator!=( - const ON_SurfaceCurvature& lhs, - const ON_SurfaceCurvature& rhs - ) -{ - // Note well: - // ON_SurfaceCurvature::IsNan() is true if either of k1 or k2 is a nan. - // and the code below is correct. - return (lhs.k1 != rhs.k1 || lhs.k2 != rhs.k2) || (lhs.IsNan() && rhs.IsNan()); -} bool ON_SurfaceCurvature::IsSet() const { - return (ON_UNSET_VALUE < k1 && k1 < ON_UNSET_POSITIVE_VALUE && ON_UNSET_VALUE < k2 && k2 < ON_UNSET_POSITIVE_VALUE); + return (ON_UNSET_VALUE < k1&& k1 < ON_UNSET_POSITIVE_VALUE&& ON_UNSET_VALUE < k2&& k2 < ON_UNSET_POSITIVE_VALUE); } bool ON_SurfaceCurvature::IsZero() const @@ -10109,30 +9513,25 @@ bool ON_SurfaceCurvature::IsUnset() const return IsSet() ? false : true; } -bool ON_SurfaceCurvature::IsNan() const -{ - return (ON_IS_NAN(k1) || ON_IS_NAN(k2)); -} - - -double ON_SurfaceCurvature::MaximumPrincipalCurvature() const -{ - return IsSet() ? ((k1 >= k2) ? k1 : k2) : ON_DBL_QNAN; -} - -double ON_SurfaceCurvature::MinimumPrincipalCurvature() const -{ - return IsSet() ? ((k1 <= k2) ? k1 : k2) : ON_DBL_QNAN; -} double ON_SurfaceCurvature::GaussianCurvature() const { - return (ON_IS_VALID(k1) && ON_IS_VALID(k2)) ? (k1 * k2) : ON_DBL_QNAN; + if (ON_IS_VALID(k1) && ON_IS_VALID(k2)) + { + return k1 * k2; + } + + return ON_DBL_QNAN; } double ON_SurfaceCurvature::MeanCurvature() const { - return (ON_IS_VALID(k1) && ON_IS_VALID(k2)) ? ((k1 == k2) ? k1 : 0.5 * (k1 + k2)) : ON_DBL_QNAN; + if (ON_IS_VALID(k1) && ON_IS_VALID(k2)) + { + return 0.5 * (k1 + k2); + } + + return ON_DBL_QNAN; } double ON_SurfaceCurvature::MinimumRadius() const @@ -10158,7 +9557,7 @@ double ON_SurfaceCurvature::MaximumRadius() const { // k = minimum directional curvature double k; - if (ON_DBL::Sign(k1)*ON_DBL::Sign(k2) <= 0 || fabs(k1) <= 1e-300 || fabs(k2) <= 1e-300) + if (k1 * k2 <= 0.0 || fabs(k1) <= 1e-300 || fabs(k2) <= 1e-300) { // If principal curvatures have opposite signs, // there is a direction with zero directional curvature. @@ -13332,12 +12731,6 @@ void ON_MappingTag::Dump( ON_TextLog& text_log ) const case ON_TextureMapping::TYPE::false_colors: text_log.Print("false colors"); break; - case ON_TextureMapping::TYPE::wcs_projection: - text_log.Print("wcs projection"); - break; - case ON_TextureMapping::TYPE::wcsbox_projection: - text_log.Print("wcs box projection"); - break; } text_log.Print("\n"); diff --git a/opennurbs_mesh.h b/opennurbs_mesh.h index 3e463856..1bc82310 100644 --- a/opennurbs_mesh.h +++ b/opennurbs_mesh.h @@ -4253,78 +4253,7 @@ Returns: ); bool ComputeVertexNormals(); // uses face normals to cook up a vertex normal - -#if 0 - // Will be added April/may of 2024 - -#pragma region NOT_YET_RH_C_SHARED_ENUM [ON_Mesh::CurvatureSettingMethod] [Rhino.Geometry.MeshCurvatureSettingMethod] [byte] - /// - /// Enumberates the methods available to set the vertex principal curvature - /// values saved in the ON_Mesh m_K[] array. - /// - enum class CurvatureSettingMethod : unsigned char - { - /// - /// The most appropriate method for current context will be used. - /// - Unset = 0, - - /// - /// The mesh is being created from a surface and the mesh's principal curvatures - /// will be set from the surface's first and second partial deriatives. - /// - SurfaceEvaluation = 1, - - /// - /// The mesh's principal curvatures will be set using - /// ON_SurfaceCurvature::CreateFromGaussianAndMeanCurvatures() - /// with input values from - /// ON_Mesh::ComputeDiscreteGaussianMeshCurvature() and - /// ON_Mesh::ComputeDiscreteLaplacianMeanMeshCurvatures(). - /// - DiscreteDefault = 2, - - /// - /// The mesh's principal curvatures will be set using - /// ON_SurfaceCurvature::CreateFromGaussianAndMeanCurvatures() - /// with input values from - /// ON_Mesh::ComputeDiscreteGaussianMeshCurvature() and - /// ON_Mesh::ComputeDiscreteLaplacianMeanMeshCurvatures(). - /// - DiscreteLaplacianMean = 3, - - /// - /// The mesh's principal curvatures will be set using - /// ON_SurfaceCurvature::CreateFromGaussianAndMeanCurvatures() - /// with input values from - /// ON_Mesh::ComputeDiscreteGaussianMeshCurvature() and - /// ON_Mesh::ComputeDiscreteDihedralMeanMeshCurvature(). - /// - DiscreteDihedralMean = 4 - }; -#pragma endregion - - /// - /// Use discrete curvature estimates to set the principal curvature values - /// in the mesh's m_K[] array. - /// - /// - /// Specifies the method to use. - /// One of the discrete methods must be specified. - /// When in doubt, pass ON_Mesh::CurvatureSettingMethod::DiscreteDefault. - /// - /// - /// If bLazy=true, only unset m_K[] values will be set. - /// If bLazy=false, only unset m_K[] values will be set. - /// - /// - bool ComputeVertexPrincipalCurvatures( - ON_Mesh::CurvatureSettingMethod method, - bool bLazy - ); - -#endif - + ////////// // Scales textures so the texture domains are [0,1] and // eliminates any texture rotations. @@ -4403,150 +4332,18 @@ Returns: bool bSeamCheck = true ); - /* - Description: - Returns true if the mesh has at least one set of valid - cached texture coordinates in the m_TC array. - Returns: - True if the mesh contains cached texture coordinates. - See Also: - ON_Mesh::SetCachedTextureCoordinatesFromMaterial - ON_Mesh::CachedTextureCoordinates - ON_Mesh::SetCachedTextureCoordinatesEx - */ bool HasCachedTextureCoordinates() const; - - /* - Description: - Prepares the cached texture coordinates by filling the - m_TC array with the relevant texture coordinates needed - to render the provided material using the provided - mapping ref and ONX model. - Call this function first if you are planning on storing - the results from repeated calls to any of the following - methods: - * CachedTextureCoordinates - * SetCachedTextureCoordinates - * SetCachedTextureCoordinatesEx - * GetCachedTextureCoordinates - Parameters: - onx_model - [in] - The ONX model that contains the texture mappings. - material - [in] - The material which contains the textures we want to - calculate the texture coordinates for. - mapping_ref - [in] - The texture mapping ref to use to get at the texture mapping. - Returns: - True if successful. - See Also: - ON_Mesh::CachedTextureCoordinates - ON_Mesh::SetCachedTextureCoordinatesEx - */ - bool SetCachedTextureCoordinatesFromMaterial(const class ONX_Model& onx_model, const ON_Material& material, const ON_MappingRef* mapping_ref) const; - - /* - Description: - Returns the cached texture coordinates corresponding to - the provided texture if they exist. If they don't - exist, they can be created using the following methods: - * SetCachedTextureCoordinatesFromMaterial - * SetCachedTextureCoordinates - * SetCachedTextureCoordinatesEx - NOTE: If you store the pointers of the results from this - function, you need to first call - SetCachedTextureCoordinatesFromMaterial to make sure the - pointers don't get invalidated by subsequent calls to - functions like SetCachedTextureCoordinates and - SetCachedTextureCoordinatesEx. - Parameters: - onx_model - [in] - The ONX model that contains the texture mappings. - texture - [in] - The texture to calculate the texture coordinates for. - mapping_ref - [in] - The texture mapping ref to use to get at the texture mapping. - Returns: - A pointer to the matching cached texture coordinates, - nullptr if none exist. - See Also: - ON_Mesh::SetCachedTextureCoordinatesFromMaterial - ON_Mesh::SetCachedTextureCoordinatesEx - */ - const ON_TextureCoordinates* GetCachedTextureCoordinates(const class ONX_Model& onx_model, const ON_Texture& texture, const ON_MappingRef* mapping_ref) const; - - - /* - Description: - Returns the cached texture coordinates corresponding to - the provided mapping id if they exist. If they don't - exist, they can be created using the following methods: - * SetCachedTextureCoordinatesFromMaterial - * SetCachedTextureCoordinates - * SetCachedTextureCoordinatesEx - - NOTE: If you store the pointers of the results from this - function, you need to first call - SetCachedTextureCoordinatesFromMaterial to make sure the - pointers don't get invalidated by subsequent calls to - functions like SetCachedTextureCoordinates and - SetCachedTextureCoordinatesEx. - Parameters: - mapping_id - [in] - The texture mapping to use for the calculation. - Returns: - A pointer to the matching cached texture coordinates, - nullptr if none exist. - See Also: - ON_Mesh::SetCachedTextureCoordinatesFromMaterial - ON_Mesh::SetCachedTextureCoordinatesEx - */ const ON_TextureCoordinates* CachedTextureCoordinates( const ON_UUID& mapping_id ) const; - // Use SetCachedTextureCoordinatesEx instead const ON_TextureCoordinates* SetCachedTextureCoordinates( const class ON_TextureMapping& mapping, const class ON_Xform* mesh_xform = 0, bool bLazy = true ); - /* - Description: - Returns the cached texture coordinates corresponding to - the provided mapping and other parameters. If they don't - exist, this function will attempt to create them first. - If they do exist and bLazy is true, then no calculation - is performed. - - NOTE: Subsequent calls to this function with different - parameters can invalidate previously returned - ON_TextureCoordinates pointers. If you want store the - pointers of previous results, you need to first call - SetCachedTextureCoordinatesFromMaterial. - Parameters: - mapping - [in] - The texture mapping to use for the calculation. - mesh_xform - [in] - If not nullptr, the mapping calculation is performed as - if the mesh were transformed by mesh_xform - bLazy - [in] - If true and the m_TC[] values were set using the same - mapping parameters, then no calculation is performed. - bSeamCheck - [in] - If true then some mesh edges might be unwelded to better - represent UV discontinuities in the texture mapping. - This only happens for the following mappings: - Box, Sphere, Cylinder. - Returns: - A pointer to the cached texture coordinates, nullptr if - the function failed to calculate the texture coordinates. - See Also: - ON_Mesh::SetCachedTextureCoordinatesFromMaterial - ON_Mesh::CachedTextureCoordinates - */ const ON_TextureCoordinates* SetCachedTextureCoordinatesEx( const class ON_TextureMapping& mapping, const class ON_Xform* mesh_xform = 0, diff --git a/opennurbs_nurbssurface.cpp b/opennurbs_nurbssurface.cpp index c9cf67ed..2d22b4c4 100644 --- a/opennurbs_nurbssurface.cpp +++ b/opennurbs_nurbssurface.cpp @@ -580,7 +580,8 @@ bool ON_NurbsSurface::IsValid( ON_TextLog* text_log ) const else { rc = true; - for ( int i = 0; i < 2 && rc; i++ ) + int i; + for ( i = 0; i < 2 && rc; i++ ) { rc = false; if (m_order[i] < 2 ) @@ -639,23 +640,6 @@ bool ON_NurbsSurface::IsValid( ON_TextLog* text_log ) const } } } - - if (rc) - { - const int cvdim = CVSize(); - for (int i = 0; m_cv_count[0] > i; ++i) - { - for (int j = 0; m_cv_count[1] > j; ++j) - { - const double* cv = CV(i, j); - for (int k = 0; cvdim > k; ++k) - { - if (false == ON_CV_COORDINATE_IS_VALID(cv[k])) - return false; - } - } - } - } } return rc; diff --git a/opennurbs_point.h b/opennurbs_point.h index c16996ec..b253022b 100644 --- a/opennurbs_point.h +++ b/opennurbs_point.h @@ -2253,136 +2253,12 @@ double ON_MaximumCoordinate(const double* data, int dim, bool is_rat, int count, class ON_CLASS ON_SurfaceCurvature { public: - - /// - /// Create an ON_SurfaceCurvature from the principal curvature values. - /// The principal curvature values are the most fundamental curvature properties - /// of a surface. Other curvatures are calculated from them. For example - /// gaussian curvature = k1 * k2 and mean curvature = (k1 + k2)/2. - /// - /// - /// - /// - /// An ON_SurfaceCurvature with the specified principal curvatures. - /// static const ON_SurfaceCurvature CreateFromPrincipalCurvatures( double k1, double k2 ); - - /// - /// Create an ON_SurfaceCurvature from a gaussian and mean curvature values using the relationsip - /// between the principal curvatures, gaussian and mean. - /// k1 = mean + sqrt(mean*mean - gaussian) - /// k2 = mean - sqrt(mean*mean - gaussian) - /// If the radicand is negative, we assume we're dealing with a bit of numerical noise or - /// estimates and set the principal curvatures - /// k1 = k2 = sign(mean)*sqrt(gaussian) - /// - /// - /// Gaussian curvature = k1*k2 (product of principal curvatures). - /// - /// Mean curvature = (k1+k2)/2 (average of principal curvatures). - /// - /// - /// A surface curvature with GaussianCurvature() = gaussian_curvature - /// and MeanCurvature() = gaussian_curvature. - /// - static const ON_SurfaceCurvature CreateFromGaussianAndMeanCurvatures( - double gaussian_curvature, - double mean_curvature - ); - - /// - /// The sign of the principal curvatures are with respect to a choice - /// of surface orientation. This function returns the principal curvatures - /// of the surface with opposite choice of orientation. - /// - /// - /// ON_SurfaceCurvature::CreateFromPrincipalCurvatures(-this->k2, -this->k1); - /// - const ON_SurfaceCurvature FlipSurfaceOrientation() const; - - /// - /// Dictionary compare k1 and k2. Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int Compare(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// Dictionary compare lhs.MaximumPrincipalCurvature() and rhs.MaximumPrincipalCurvature(). - /// Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int CompareMaximumAndMinimumPrincipalCurvatures(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// Compare lhs.MaximumPrincipalCurvature() and rhs.MaximumPrincipalCurvature(). - /// Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int CompareMaximumPrincipalCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// Compare lhs.MinimumPrincipalCurvature() and rhs.MinimumPrincipalCurvature(). - /// Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int CompareMinimumPrincipalCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// Compare lhs.MaximumRadius() and rhs.MaximumRadius(). - /// Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int CompareMaximumRadius(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// Compare lhs.MinimumRadius() and rhs.MinimumRadius(). - /// Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int CompareMinimumRadius(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// Compare lhs.GaussianCurvature() and rhs.GaussianCurvature(). - /// Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int CompareGaussianCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// Compare lhs.MeanCurvature() and rhs.MeanCurvature(). - /// Values with nans sort last. - /// - /// - /// - /// -1, 0 or +1. - static int CompareMeanCurvature(const ON_SurfaceCurvature& lhs, const ON_SurfaceCurvature& rhs); - - /// - /// k1 = k2 = ON_DBL_QNAN - /// static const ON_SurfaceCurvature Nan; - - /// - /// k1 = k2 = 0 - /// static const ON_SurfaceCurvature Zero; /// @@ -2394,36 +2270,21 @@ public: double k1, k2; // principal curvatures public: - - /// True if k1 and k2 are both valid finite values. bool IsSet() const; - - /// True if k1 and k2 are both zero. bool IsZero() const; - - /// True if either of k1 or k2 is not a valid finite value. bool IsUnset() const; - /// True if either of k1 or k2 is a nan. - bool IsNan() const; - public: /// /// The Gaussian curvature is k1*k2. /// - /// - /// If this is set, the Gausian curvature is returned. - /// Otherwise ON_DBL_QNAN is returned. - /// + /// The Gausian curvature. double GaussianCurvature() const; /// /// The mean curvature is (k1+k2)/2. /// - /// - /// If this is set, the signed mean curvature is returned. - /// Otherwise ON_DBL_QNAN is returned. - /// + /// The signed mean curvature. double MeanCurvature() const; /// @@ -2467,42 +2328,9 @@ public: /// double KappaValue(ON::curvature_style kappa_style) const; - /// - /// If this is set, the maximum of k1 and k2 is returned. - /// Otherwise ON_DBL_QNAN is returned. - /// - double MaximumPrincipalCurvature() const; - /// - /// If this is set, the minimum of k1 and k2. - /// Otherwise ON_DBL_QNAN is returned. - /// - double MinimumPrincipalCurvature() const; }; -ON_DECL -/// -/// -/// -/// Returns (lhs.k1==rhs.k1 && lhs.k2==rhs.k2) -/// Note that if any princial curvature is a nan, then false is returned. -/// -bool operator==( - const ON_SurfaceCurvature& lhs, - const ON_SurfaceCurvature& rhs - ); - -ON_DECL -/// -/// -/// -/// Returns (lhs.k1 != rhs.k1 || lhs.k2!=rhs.k2) || (lhs.IsNan() && rhs.IsNan()). -/// -bool operator!=( - const ON_SurfaceCurvature& lhs, - const ON_SurfaceCurvature& rhs - ); - #if defined(ON_DLL_TEMPLATE) diff --git a/opennurbs_polyline.cpp b/opennurbs_polyline.cpp index 6f9c3f2e..65f6c698 100644 --- a/opennurbs_polyline.cpp +++ b/opennurbs_polyline.cpp @@ -38,21 +38,16 @@ bool ON_Polyline::IsValid( double tolerance ) const { for ( i = 1; rc && i < m_count; i++ ) { - if (false == m_a[i].IsValid() || false == m_a[i-1].IsValid()) - rc = false; - else if ( m_a[i].DistanceTo(m_a[i-1]) <= tolerance ) + if ( m_a[i].DistanceTo(m_a[i-1]) <= tolerance ) rc = false; } if ( rc && m_count < 4 && m_a[0].DistanceTo(m_a[m_count-1]) <= tolerance ) rc = false; } - else - { + else { for ( i = 1; rc && i < m_count && rc; i++ ) { - if (false == m_a[i].IsValid() || false == m_a[i - 1].IsValid()) - rc = false; - else if ( m_a[i] == m_a[i-1] ) + if ( m_a[i] == m_a[i-1] ) rc = false; } if ( rc && m_count < 4 && m_a[0] == m_a[m_count-1] ) diff --git a/opennurbs_public_version.h b/opennurbs_public_version.h index 5822a3f4..a707df95 100644 --- a/opennurbs_public_version.h +++ b/opennurbs_public_version.h @@ -6,7 +6,7 @@ // To update version numbers, edit ..\build\build_dates.msbuild #define RMA_VERSION_MAJOR 8 -#define RMA_VERSION_MINOR 7 +#define RMA_VERSION_MINOR 6 //////////////////////////////////////////////////////////////// // @@ -15,9 +15,9 @@ // #define RMA_VERSION_YEAR 2024 #define RMA_VERSION_MONTH 4 -#define RMA_VERSION_DATE 3 +#define RMA_VERSION_DATE 10 #define RMA_VERSION_HOUR 5 -#define RMA_VERSION_MINUTE 55 +#define RMA_VERSION_MINUTE 0 //////////////////////////////////////////////////////////////// // @@ -35,8 +35,8 @@ // 3 = build system release build #define RMA_VERSION_BRANCH 0 -#define VERSION_WITH_COMMAS 8,7,24094,5550 -#define VERSION_WITH_PERIODS 8.7.24094.05550 +#define VERSION_WITH_COMMAS 8,6,24101,5000 +#define VERSION_WITH_PERIODS 8.6.24101.05000 #define COPYRIGHT "Copyright (C) 1993-2024, Robert McNeel & Associates. All Rights Reserved." #define SPECIAL_BUILD_DESCRIPTION "Public OpenNURBS C++ 3dm file IO library." @@ -44,11 +44,11 @@ #define RMA_VERSION_NUMBER_MAJOR_WSTRING L"8" #define RMA_PREVIOUS_VERSION_NUMBER_MAJOR_WSTRING L"7" -#define RMA_VERSION_NUMBER_SR_STRING "SR7" -#define RMA_VERSION_NUMBER_SR_WSTRING L"SR7" +#define RMA_VERSION_NUMBER_SR_STRING "SR6" +#define RMA_VERSION_NUMBER_SR_WSTRING L"SR6" -#define RMA_VERSION_WITH_PERIODS_STRING "8.7.24094.05550" -#define RMA_VERSION_WITH_PERIODS_WSTRING L"8.7.24094.05550" +#define RMA_VERSION_WITH_PERIODS_STRING "8.6.24101.05000" +#define RMA_VERSION_WITH_PERIODS_WSTRING L"8.6.24101.05000" diff --git a/opennurbs_rand.h b/opennurbs_rand.h index f76ad8ab..90a02089 100644 --- a/opennurbs_rand.h +++ b/opennurbs_rand.h @@ -186,8 +186,9 @@ public: /* Description: - Places two Gaussians with mean zero and standard devation one, - generated by a Box-Muller transform, into the doubles pointed to by its arguments. + Places two Gaussians with mean zero and standard devation one, + generated by a Box-Muller transform, into the doubles pointed to by its arguments. + /* Parameters: u - [out] v - [out] diff --git a/opennurbs_statics.cpp b/opennurbs_statics.cpp index ba2a81a2..2d6ab95c 100644 --- a/opennurbs_statics.cpp +++ b/opennurbs_statics.cpp @@ -287,85 +287,6 @@ const double ON_DBL_QNAN = Internal_ON__dblinithelper(1); const double ON_DBL_PINF = Internal_ON__dblinithelper(2); const double ON_DBL_NINF = -Internal_ON__dblinithelper(2); -const double ON_DBL::Nan = ON_DBL_QNAN; -const double ON_DBL::PositiveInfinity = ON_DBL_PINF; -const double ON_DBL::NegativeInfinity = ON_DBL_NINF; - -const double ON_DBL::PositiveMax = ON_DBL_MAX; -const double ON_DBL::NegativeMax = -ON_DBL_MAX; - -const double ON_DBL::PositiveMin = ON_DBL_MIN; -const double ON_DBL::NegativeMin = -ON_DBL_MIN; - -const double ON_DBL::Unset = ON_UNSET_VALUE; -const double ON_DBL::PositiveUnset = ON_UNSET_POSITIVE_VALUE; - -bool ON_DBL::IsValid(double x) -{ - return x > ON_UNSET_VALUE && x < ON_UNSET_POSITIVE_VALUE; -} - -bool ON_DBL::IsNan(double x) -{ - return (x == x) ? false : true; -} - -int ON_DBL::Sign(double x) -{ - return (x > 0.0 ? 1 : ((x < 0.0) ? -1 : 0)); -} - -bool ON_DBL::IsInfinity(double x) -{ - return (x >= ON_DBL_PINF || x <= ON_DBL_NINF); -} - -bool ON_DBL::IsPositiveInfinity(double x) -{ - return (x >= ON_DBL_PINF); -} - -bool ON_DBL::IsNegativeInfinity(double x) -{ - return (x <= ON_DBL_NINF); -} - -bool ON_DBL::IsNotNan(double x) -{ - return (x == x); -} - -bool ON_DBL::IsUnset(double x) -{ - return (ON_UNSET_VALUE == fabs(x)); -} - -int ON_DBL::CompareValue(double lhs, double rhs) -{ - if (lhs < rhs) - return -1; - if (lhs > rhs) - return 1; - if (lhs == rhs) - return 0; - - // At least one of lhs or rhs is a nan. Sort nans to end - return (ON_IS_NAN(lhs) ? 1 : 0) - (ON_IS_NAN(rhs) ? 1 : 0); -} - - -int ON_DBL::Compare(const double* lhs, const double* rhs) -{ - // sort nullpt to the end - if (lhs == rhs) - return 0; - if (nullptr == lhs) - return 1; - if (nullptr == rhs) - return -1; - return ON_DBL::CompareValue(*lhs, *rhs); -} - const float ON_FLT_QNAN = Internal_ON__fltinithelper(1); const float ON_FLT_PINF = Internal_ON__fltinithelper(2); const float ON_FLT_NINF = -Internal_ON__fltinithelper(2); @@ -413,10 +334,6 @@ const ON_SubDEdgeSharpness ON_SubDEdgeSharpness::Nan = ON_SubDEdgeSharpness::Fro const ON_SubDEdgeSharpness ON_SubDEdgeSharpness::Crease = ON_SubDEdgeSharpness::FromConstant(ON_SubDEdgeSharpness::CreaseValue); -const ON_SubDFaceCornerDex ON_SubDFaceCornerDex::Unset(0, 0); - -const ON_SubDFaceParameter ON_SubDFaceParameter::Nan = { ON_SubDFaceCornerDex::Unset, ON_DBL_QNAN, ON_DBL_QNAN }; - const double ON_SubDSectorType::MinimumCornerAngleRadians = (2.0*ON_PI)/((double)(ON_SubDSectorType::MaximumCornerAngleIndex)); const double ON_SubDSectorType::MaximumCornerAngleRadians = 2.0*ON_PI - ON_SubDSectorType::MinimumCornerAngleRadians; @@ -2840,10 +2757,6 @@ const ON_SubDComponentPtr ON_SubDComponentPtr::NullVertex = { 2 }; const ON_SubDComponentPtr ON_SubDComponentPtr::NullEdge = { 4 }; const ON_SubDComponentPtr ON_SubDComponentPtr::NullFace = { 6 }; -const ON_SubDComponentId ON_SubDComponentId::Unset(ON_SubDComponentPtr::Null); - -const ON_SubDComponentParameter ON_SubDComponentParameter::Unset = {}; - const ON_SubDComponentPtrPair ON_SubDComponentPtrPair::Null = ON_SubDComponentPtrPair::Create(ON_SubDComponentPtr::Null,ON_SubDComponentPtr::Null); const ON_SubDComponentAndNumber ON_SubDComponentAndNumber::NullAndNan = ON_SubDComponentAndNumber::Create(ON_SubDComponentPtr::Null, ON_DBL_QNAN); diff --git a/opennurbs_subd.cpp b/opennurbs_subd.cpp index fd8c1c88..750ec677 100644 --- a/opennurbs_subd.cpp +++ b/opennurbs_subd.cpp @@ -1543,12 +1543,7 @@ bool ON_SubDComponentTest::Passes(const ON_SubDFace* f) const ON_SubDComponentId::ON_SubDComponentId(ON_SubDComponentPtr::Type component_type, unsigned int component_id) : m_id(component_id) - , m_type_and_dir((unsigned char)component_type) -{} - -ON_SubDComponentId::ON_SubDComponentId(ON_SubDComponentPtr::Type component_type, unsigned int component_id, ON__UINT_PTR dir) - : m_id(component_id) - , m_type_and_dir(((unsigned char)component_type) | ((unsigned char)(dir%2))) + , m_type(component_type) {} ON_SubDComponentId::ON_SubDComponentId(ON_SubDComponentPtr cptr) @@ -1557,8 +1552,7 @@ ON_SubDComponentId::ON_SubDComponentId(ON_SubDComponentPtr cptr) if (nullptr != b) { m_id = b->m_id; - Internal_SetType(cptr.ComponentType()); - Internal_SetDir(0 == cptr.ComponentDirection() ? 0u : 1u); + m_type = cptr.ComponentType(); } } @@ -1567,18 +1561,7 @@ ON_SubDComponentId::ON_SubDComponentId(const class ON_SubDVertex* v) if (nullptr != v) { m_id = v->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Vertex); - } -} - -ON_SubDComponentId::ON_SubDComponentId(const class ON_SubDVertexPtr vptr) -{ - const ON_SubDVertex* v = vptr.Vertex(); - if (nullptr != v) - { - m_id = v->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Vertex); - Internal_SetDir(0 == vptr.VertexDirection() ? 0u : 1u); + m_type = ON_SubDComponentPtr::Type::Vertex; } } @@ -1587,18 +1570,7 @@ ON_SubDComponentId::ON_SubDComponentId(const class ON_SubDEdge* e) if (nullptr != e) { m_id = e->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Edge); - } -} - -ON_SubDComponentId::ON_SubDComponentId(ON_SubDEdgePtr eptr) -{ - const ON_SubDEdge* e = eptr.Edge(); - if (nullptr != e) - { - m_id = e->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Edge); - Internal_SetDir(0 == eptr.EdgeDirection() ? 0u : 1u); + m_type = ON_SubDComponentPtr::Type::Edge; } } @@ -1607,60 +1579,16 @@ ON_SubDComponentId::ON_SubDComponentId(const class ON_SubDFace* f) if (nullptr != f) { m_id = f->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Face); + m_type = ON_SubDComponentPtr::Type::Face; } } -ON_SubDComponentId::ON_SubDComponentId(ON_SubDFacePtr fptr) -{ - const ON_SubDFace* f = fptr.Face(); - if (nullptr != f) - { - m_id = f->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Face); - Internal_SetDir(0 == fptr.FaceDirection() ? 0u : 1u); - } -} - -ON_SubDComponentId::ON_SubDComponentId(const class ON_SubDFace* f, unsigned face_corner_index) -{ - if (nullptr != f) - { - m_id = f->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Face); - if (face_corner_index < (unsigned)f->m_edge_count && (unsigned)f->m_edge_count < 4096u) - { - Internal_SetValueA(face_corner_index); - Internal_SetValueB(f->m_edge_count); - } - } -} - -ON_SubDComponentId::ON_SubDComponentId(ON_SubDFacePtr fptr, unsigned face_corner_index) -{ - const ON_SubDFace* f = fptr.Face(); - if (nullptr != f) - { - m_id = f->m_id; - Internal_SetType(ON_SubDComponentPtr::Type::Face); - Internal_SetDir(0 == fptr.FaceDirection() ? 0u : 1u); - if (face_corner_index < (unsigned)f->m_edge_count && (unsigned)f->m_edge_count < 4096u) - { - Internal_SetValueA(face_corner_index); - Internal_SetValueB(f->m_edge_count); - } - } -} - - int ON_SubDComponentId::CompareTypeAndId(const ON_SubDComponentId& lhs, const ON_SubDComponentId& rhs) { - const unsigned char lhs_type = (lhs.m_type_and_dir & ON_SubDComponentId::bits_type_mask); - const unsigned char rhs_type = (rhs.m_type_and_dir & ON_SubDComponentId::bits_type_mask); - if (lhs_type < rhs_type) + if (static_cast(lhs.m_type) < static_cast(rhs.m_type)) return -1; - if (lhs_type > rhs_type) + if (static_cast(lhs.m_type) > static_cast(rhs.m_type)) return 1; if (lhs.m_id < rhs.m_id) return -1; @@ -1669,22 +1597,6 @@ int ON_SubDComponentId::CompareTypeAndId(const ON_SubDComponentId& lhs, const ON return 0; } -int ON_SubDComponentId::CompareTypeAndIdAndDirection(const ON_SubDComponentId& lhs, const ON_SubDComponentId& rhs) -{ - const int rc = CompareTypeAndId(lhs, rhs); - if (0 != rc) - return rc; - - // compare dir - const unsigned char lhs_dir = (lhs.m_type_and_dir & ON_SubDComponentId::bits_dir_mask); - const unsigned char rhs_dir = (rhs.m_type_and_dir & ON_SubDComponentId::bits_dir_mask); - if (lhs_dir < rhs_dir) - return -1; - if (lhs_dir > rhs_dir) - return 1; - return 0; -} - int ON_SubDComponentId::CompareTypeAndIdFromPointer(const ON_SubDComponentId* lhs, const ON_SubDComponentId* rhs) { if (lhs == rhs) @@ -1696,20 +1608,14 @@ int ON_SubDComponentId::CompareTypeAndIdFromPointer(const ON_SubDComponentId* lh if (nullptr == rhs) return -1; - // compare type - const unsigned char lhs_type = (lhs->m_type_and_dir & ON_SubDComponentId::bits_type_mask); - const unsigned char rhs_type = (rhs->m_type_and_dir & ON_SubDComponentId::bits_type_mask); - if (lhs_type < rhs_type) + if (static_cast(lhs->m_type) < static_cast(rhs->m_type)) return -1; - if (lhs_type > rhs_type) + if (static_cast(lhs->m_type) > static_cast(rhs->m_type)) return 1; - - // compare id if (lhs->m_id < rhs->m_id) return -1; if (lhs->m_id > rhs->m_id) return 1; - return 0; } @@ -1718,198 +1624,14 @@ unsigned int ON_SubDComponentId::ComponentId() const return m_id; } -void ON_SubDComponentId::Internal_SetType(ON_SubDComponentPtr::Type type) -{ - m_type_and_dir &= ~((unsigned char)ON_SubDComponentId::bits_type_mask); - m_type_and_dir |= (((unsigned char)type) & ON_SubDComponentId::bits_type_mask); -} - -void ON_SubDComponentId::Internal_SetDir(unsigned dir) -{ - // invalid dir is treaded as 0 - if (1 == dir) - m_type_and_dir |= ((unsigned char)ON_SubDComponentId::bits_dir_mask); - else - m_type_and_dir &= ~((unsigned char)ON_SubDComponentId::bits_dir_mask); -} - -void ON_SubDComponentId::Internal_SetValueA(unsigned a) -{ - if (a < 0x0FFFu) - { - m_valueAB[0] = (unsigned char)(a & 0x00FFu); - const unsigned char ahigh = (unsigned char)((a & 0x0F00u) >> 8); - m_valueAB[2] = (m_valueAB[2] & 0xF0u) | ahigh; - } -} - -void ON_SubDComponentId::Internal_SetValueB(unsigned b) -{ - if (b < 0x0FFFu) - { - m_valueAB[1] = (unsigned char)(b & 0x00FFu); - const unsigned char bhigh = (unsigned char)((b & 0x0F00u) >> 4); - m_valueAB[2] = (m_valueAB[2] & 0x0Fu) | bhigh; - } -} - -unsigned ON_SubDComponentId::Internal_ValueA() const -{ - const unsigned alow = m_valueAB[0]; - const unsigned ahigh = ((unsigned)(m_valueAB[2] & 0x0Fu)) << 8; - return alow | ahigh; -} - -unsigned ON_SubDComponentId::Internal_ValueB() const -{ - const unsigned blow = m_valueAB[0]; - const unsigned bhigh = ((unsigned)(m_valueAB[2] & 0xF0u)) << 4; - return blow | bhigh; -} - -unsigned ON_SubDComponentId::ComponentDirection() const -{ - return (m_type_and_dir & ON_SubDComponentId::bits_dir_mask); -} - ON_SubDComponentPtr::Type ON_SubDComponentId::ComponentType() const { - return ON_SubDComponentPtr::ComponentPtrTypeFromUnsigned(m_type_and_dir & ON_SubDComponentId::bits_type_mask); + return m_type; } bool ON_SubDComponentId::IsSet() const { - return 0 != m_id && ON_SubDComponentPtr::Type::Unset != ComponentType(); -} - -bool ON_SubDComponentId::IsNotSet() const -{ - return 0 == m_id || ON_SubDComponentPtr::Type::Unset == ComponentType(); -} - -bool ON_SubDComponentId::IsVertexId() const -{ - return m_id > 0 && ON_SubDComponentPtr::Type::Vertex == this->ComponentType(); -} - -bool ON_SubDComponentId::IsEdgeId() const -{ - return m_id > 0 && ON_SubDComponentPtr::Type::Edge == this->ComponentType(); -} - -bool ON_SubDComponentId::IsFaceId() const -{ - return m_id > 0 && ON_SubDComponentPtr::Type::Face == this->ComponentType(); -} - -const ON_SubDComponentId ON_SubDComponentId::Reversed() const -{ - ON_SubDComponentId c = *this; - c.Internal_SetDir(1u - this->ComponentDirection()); - return c; -} - -const ON_SubDComponentPtr ON_SubDComponentId::ComponentPtr(const class ON_SubD* subd) const -{ - return nullptr != subd ? this->ComponentPtr(*subd) : ON_SubDComponentPtr::Null; -} - -const ON_SubDComponentPtr ON_SubDComponentId::ComponentPtr(const class ON_SubD& subd) const -{ - if (0 != m_id) - { - ON_SubDComponentPtr cptr; - switch (this->ComponentType()) - { - case ON_SubDComponentPtr::Type::Vertex: - cptr = ON_SubDComponentPtr::Create(subd.VertexFromId(m_id)); - break; - case ON_SubDComponentPtr::Type::Edge: - cptr = ON_SubDComponentPtr::Create(subd.EdgeFromId(m_id)); - break; - case ON_SubDComponentPtr::Type::Face: - cptr = ON_SubDComponentPtr::Create(subd.FaceFromId(m_id)); - break; - default: - cptr = ON_SubDComponentPtr::Null; - break; - } - if (cptr.IsNotNull() && 0 != (m_type_and_dir & ON_SubDComponentId::bits_dir_mask)) - cptr.SetComponentDirection(1); - return cptr; - } - return ON_SubDComponentPtr::Null; -} - -const ON_SubDVertex* ON_SubDComponentId::Vertex(const class ON_SubD& subd) const -{ - return this->ComponentPtr(subd).Vertex(); -} - -const ON_SubDVertexPtr ON_SubDComponentId::VertexPtr(const class ON_SubD& subd) const -{ - return this->ComponentPtr(subd).VertexPtr(); -} - -const ON_SubDVertex* ON_SubDComponentId::Vertex(const class ON_SubD* subd) const -{ - return (nullptr != subd) ? this->ComponentPtr(*subd).Vertex() : nullptr; -} - -const ON_SubDVertexPtr ON_SubDComponentId::VertexPtr(const class ON_SubD* subd) const -{ - return (nullptr != subd) ? this->ComponentPtr(*subd).VertexPtr() : ON_SubDVertexPtr::Null; -} - -const ON_SubDEdge* ON_SubDComponentId::Edge(const class ON_SubD& subd) const -{ - return this->ComponentPtr(subd).Edge(); -} - -const ON_SubDEdgePtr ON_SubDComponentId::EdgePtr(const class ON_SubD& subd) const -{ - return this->ComponentPtr(subd).EdgePtr(); -} - -const ON_SubDEdge* ON_SubDComponentId::Edge(const class ON_SubD* subd) const -{ - return (nullptr != subd) ? this->ComponentPtr(*subd).Edge() : nullptr; -} - -const ON_SubDEdgePtr ON_SubDComponentId::EdgePtr(const class ON_SubD* subd) const -{ - return (nullptr != subd) ? this->ComponentPtr(*subd).EdgePtr() : ON_SubDEdgePtr::Null; -} - -const ON_SubDFace* ON_SubDComponentId::Face(const class ON_SubD& subd) const -{ - return this->ComponentPtr(subd).Face(); -} - -const ON_SubDFacePtr ON_SubDComponentId::FacePtr(const class ON_SubD& subd) const -{ - return this->ComponentPtr(subd).FacePtr(); -} - -const ON_SubDFace* ON_SubDComponentId::Face(const class ON_SubD* subd) const -{ - return (nullptr != subd) ? this->ComponentPtr(*subd).Face() : nullptr; -} - -const ON_SubDFacePtr ON_SubDComponentId::FacePtr(const class ON_SubD* subd) const -{ - return (nullptr != subd) ? this->ComponentPtr(*subd).FacePtr() : ON_SubDFacePtr::Null; -} - -const ON_SubDFaceCornerDex ON_SubDComponentId::FaceCornerDex() const -{ - if (IsFaceId()) - { - const ON_SubDFaceCornerDex cid(this->Internal_ValueA(), this->Internal_ValueB()); - if (cid.IsSet()) - return cid; - } - return ON_SubDFaceCornerDex::Unset; + return 0 != m_id && ON_SubDComponentPtr::Type::Unset != m_type; } bool ON_SubDComponentIdList::Passes(const ON_SubDComponentPtr cptr) const @@ -9394,12 +9116,6 @@ unsigned int ON_SubD::DumpTopology( case ON_TextureMapping::TYPE::false_colors: text_log.Print("false colors"); break; - case ON_TextureMapping::TYPE::wcs_projection : - text_log.Print("wcs projection"); - break; - case ON_TextureMapping::TYPE::wcsbox_projection : - text_log.Print("wcs box projection"); - break; } text_log.PrintNewLine(); text_log.Print("m_mapping_id = "); @@ -28337,3 +28053,4 @@ double ON_SubDExpandEdgesParameters::CleanupOffset(double x) } + diff --git a/opennurbs_subd.h b/opennurbs_subd.h index d3a6d09f..f4fbe919 100644 --- a/opennurbs_subd.h +++ b/opennurbs_subd.h @@ -895,344 +895,6 @@ bool operator==(const ON_SubDEdgeSharpness& lhs, const ON_SubDEdgeSharpness& rhs ON_DECL bool operator!=(const ON_SubDEdgeSharpness& lhs, const ON_SubDEdgeSharpness& rhs); -/// -/// A ON_SubDFaceCornerDex is a value that identifies a subd face corner. -/// -class ON_WIP_CLASS ON_SubDFaceCornerDex -{ -private: - unsigned short m_corner_index = 0; - unsigned short m_edge_count = 0; - -public: - ON_SubDFaceCornerDex() = default; - ~ON_SubDFaceCornerDex() = default; - ON_SubDFaceCornerDex(const ON_SubDFaceCornerDex&) = default; - ON_SubDFaceCornerDex& operator=(const ON_SubDFaceCornerDex&) = default; - - ON_SubDFaceCornerDex(unsigned face_corner_index, unsigned face_edge_count); - - /// - /// ON_SubDFaceCorner::Unset has CornerIndex()=0 and EdgeCount()=0. - /// - static const ON_SubDFaceCornerDex Unset; - - /// - /// Dictionary compares EdgeCount() then CornerIndex(). - /// Any set value < any unset value. - /// - /// - /// - /// - /// -1 if lsh < rhs. - /// 0 if lhs = rhs. - /// +1 if lhs > rhs. - /// - static int CompareAll(const ON_SubDFaceCornerDex& lhs, const ON_SubDFaceCornerDex& rhs); - - /// - /// Uses ON_SubDFaceCornerDex::CompareAll to dictionary sort nonnull inputs and safely sorts - /// nullptr to the end. - /// - /// - /// - /// - static int Compare(const ON_SubDFaceCornerDex* lhs, const ON_SubDFaceCornerDex* rhs); - - /// - /// True if EdgeCount() >= 3 and 0< =CornerIndex() < EdgeCount(). - /// False otherwise. - /// - bool IsSet() const; - - /// - /// True if EdgeCount() < 3 or CornerIndex() >= EdgeCount(). - /// False otherwise. - /// - bool IsNotSet() const; - - /// - /// - /// True if IsSet() is true, nullptr != face, and EdgeCount() = face->EdgeCount(). - /// - bool IsValid(const class ON_SubDFace* face) const; - - /// - /// Zero based index identifying the corner of a subd face. - /// - unsigned CornerIndex() const; - - /// - /// The number of edges in the subd face. - /// - unsigned EdgeCount() const; - - /// True if this is a corner of a quad face (IsSet() && 4 == EdgeCount()). - bool IsQuadFace() const; - - /// - /// NextCornerDex() = (this->CornerDex() + 1) % this->EdgeCount(). - /// If this is not set, then ON_SubDFaceCornerDex::Unset is returned. - /// - /// - /// The next face coner in the counter-clocwise sense. - /// - const ON_SubDFaceCornerDex NextCornerDex() const; - - /// - /// NextCornerDex() = (this->CornerDex() + this->EdgeCount() - 1) % this->EdgeCount(). - /// If this is not set, then ON_SubDFaceCornerDex::Unset is returned. - /// - /// - /// The previous face coner in the counter-clocwise sense. - /// - const ON_SubDFaceCornerDex PreviousCornerDex() const; - - /// - /// Get the vertex at the corner of the face identified by this. - /// If this is not set, face is nullptr, or face->EdgeCount() != this->EdgeCount(), - /// then nullptr is returned. - /// - /// - /// The vertex at the face corner - const ON_SubDVertex* CornerVertex(const class ON_SubDFace* face) const; - - /// - /// Get the vertex at the corner of the face identified by this->PreviousCornerDex(). - /// If this is not set, face is nullptr, or face->EdgeCount() != this->EdgeCount(), - /// then nullptr is returned. - /// - /// - /// The vertex at the previous corner of the face - const ON_SubDVertex* PreviousCornerVertex(const class ON_SubDFace* face) const; - - /// - /// Get the vertex at the corner of the face identified by this->NextCornerDex(). - /// If this is not set, face is nullptr, or face->EdgeCount() != this->EdgeCount(), - /// then nullptr is returned. - /// - /// - /// The vertex at the next corner of the face - const ON_SubDVertex* NextCornerVertex(const class ON_SubDFace* face) const; - - /// - /// Get the edge face->EdgePtr(this->CornerIndex()). - /// If this is not set, face is nullptr, or face->EdgeCount() != this->EdgeCount(), - /// then ON_SubDEdgePtr::Null is returned. - /// - /// - /// - /// 0=edge entering the corner = this->LeftEdgePtr(face); - /// 1=edge leaving the corner - /// - /// - const ON_SubDEdgePtr EdgePtr(const class ON_SubDFace* face, unsigned corner_edge_dex) const; - - /// - /// Get the edge of face that goes from the the previous - /// face corner to this face corner. The edge pointer - /// is oriented from PreviousCornerVertex() to CornerVertex(). - /// If this is not set, face is nullptr, or face->EdgeCount() != this->EdgeCount(), - /// then ON_SubDEdgePtr::Null is returned. - /// - /// - /// face->EdgePtr(this->PreviousCornerDex().CornerIndex()) - const ON_SubDEdgePtr LeftEdgePtr(const class ON_SubDFace* face) const; - - /// - /// Get the edge of face that goes from the this face corner - /// to the next face corner. The edge pointer - /// is oriented from CornerVertex() to NextCornerVertex(). - /// If this is not set, face is nullptr, or face->EdgeCount() != this->EdgeCount(), - /// then ON_SubDEdgePtr::Null is returned. - /// - /// - /// face->EdgePtr(this->CornerIndex()) - const ON_SubDEdgePtr RightEdgePtr(const class ON_SubDFace* face) const; -}; - -class ON_WIP_CLASS ON_SubDFaceParameter -{ -public: - ON_SubDFaceParameter() = default; - ~ON_SubDFaceParameter() = default; - ON_SubDFaceParameter(const ON_SubDFaceParameter&) = default; - ON_SubDFaceParameter& operator=(const ON_SubDFaceParameter&) = default; - - - /// - /// Create a SubD face parameter that identifies a point on the face. - /// The parameters (0,0) correspond the the corner vertex cdex.Vertex(face). - /// The corner_s parameter runs from the corner vertex to the midpoint of cdex.RightEdge(face). - /// The corner_t parameter runs from the corner vertex to the midpoint of cdex.LeftEdge(face). - /// The parameters (1/2, 1/2) correspond the the center of the face. - /// - /// - /// Identifies the face's corner subdivison quad. - /// - /// - /// 0 <= corner_s <= 1/2 - /// - /// - /// 0 <= corner_t <= 1/2 - /// - ON_SubDFaceParameter( - ON_SubDFaceCornerDex cdex, - double corner_s, - double corner_t - ); - - /// - /// Create at ON_SubDFaceParameter the corresponds to the the specified quad face parameters. - /// The quad face parameters for face.Vertex(0) are (0,0). - /// The quad face parameters for face.Vertex(1) are (1,0). - /// The quad face parameters for face.Vertex(2) are (1,1). - /// The quad face parameters for face.Vertex(3) are (0,1). - /// - /// - /// 0 <= quad_face_s <= 1. - /// - /// - /// 0 <= quad_face_t <= 1. - /// - /// - /// The ON_SubDFaceParameter the references the quad face point. - /// - static const ON_SubDFaceParameter CreateFromQuadFaceParameteters( - double quad_face_s, - double quad_face_t - ); - - - /// - /// ON_SubDFaceParameter::Nan has face_edge_count=0, corner_index=0, s=ON_DBL_QNAN, t=ON_DBL_QNAN. - /// - static const ON_SubDFaceParameter Nan; - - /// True if all values are valid. - bool IsSet(); - - /// True if all values are not valid. - bool IsNotSet(); - - /// - /// Well ordered dictionary compare of m_cdex, m_s, and m_t using - /// ON_SubDFaceCornerDex::CompareAll() and ON_DBL::CompareValue(). - /// Any set value < any unset value. - /// - /// - /// - /// - /// -1: lhs < rhs - /// 0: lhs = rhs - /// +1: lhs > rhs - /// - static int CompareAll(const ON_SubDFaceParameter& lhs, const ON_SubDFaceParameter& rhs); - - /// - /// Well ordered dictionary compare that uses ON_SubDFaceParameter::CompareAll() to - /// compare nonnull values and safely sorts nullptr to the end. - /// - /// - /// - /// - static int Compare(const ON_SubDFaceParameter* lhs, const ON_SubDFaceParameter* rhs); - - bool IsSet() const; - - bool IsNotSet() const; - - /// - /// m_cdex identifies face's subdivision quad the s and t parameters apply to. - /// The corner vertex is V = m_cdex.Vertex(face). - /// The edge entering the corner is LE = m_cdex.LeftEdge(face). - /// The edge leaving the corner is RE = m_cdex.RightEdge(face). - /// V = LE.RelativeVertex(1) = RE.RelativeVertex(0). - /// - const ON_SubDFaceCornerDex FaceCornerDex() const; - - /// - /// cdex = FaceCornerDex() identifies face's subdivision quad the s and t parameters apply to. - /// The corner vertex is V = cdex.Vertex(face). - /// The edge entering the corner is LE = cdex.LeftEdge(face). - /// The edge leaving the corner is RE = cdex.RightEdge(face). - /// V = LE.RelativeVertex(1) = RE.RelativeVertex(0). - /// - /// p = FaceCornerParameters(); - /// The p.x parameter runs along half of RE from V to the midpoint of RE. - /// 0 <= p.x < 1/2. - /// The p.y parameter runs along half of LE from V to the midpoint of LE. - /// 0 <= p.y < 1/2. - /// At V, p=(0,0). - /// At the midpoint of RE, p=(1/2,0) - /// At the midpoint of LE, p=(0,1/2) - /// At the center of the face, p=(1/2,1/2). - /// - const ON_2dPoint FaceCornerParameters() const; - - /// - /// For quad faces, QuadFaceParameters() returns 2 normalized parameters that span the entire quad face. - /// The 2d points (0,0), (1,0), (1,1), (0,1) corresponed to the quad face's vertices - /// face.Vertex(0), face.Vertex(1), face.Vertex(2), face.Vertex(3). - /// - /// - /// If m_cdex.IsQUadFace() is true, then the 2 normalized quad face parameters - /// corresponding to this ON_SubDFaceParameter are returned. - /// Otherwise ON_2dPoint::NanPoint is returned. - /// - const ON_2dPoint QuadFaceParameters() const; - - -private: - /// - /// m_cdex identifies face's subdivision quad the s and t parameters apply to. - /// The corner vertex is V = m_cdex.Vertex(face). - /// The edge entering the corner is LE = m_cdex.LeftEdge(face). - /// The edge leaving the corner is RE = m_cdex.RightEdge(face). - /// V = LE.RelativeVertex(1) = RE.RelativeVertex(0). - /// - ON_SubDFaceCornerDex m_cdex; - - /// - /// m_cdex identifies face's subdivision quad the s and t parameters apply to. - /// The corner vertex is V = m_cdex.Vertex(face). - /// The edge entering the corner is LE = m_cdex.LeftEdge(face). - /// The edge leaving the corner is RE = m_cdex.RightEdge(face). - /// V = LE.RelativeVertex(1) = RE.RelativeVertex(0). - /// - /// The m_s parameter runs along half of RE from V to the midpoint of RE. - /// 0 <= m_s < 1/2. - /// m_s = 0 at V = RE.RelativeVertex(0) = LE.RelativeVertex(1). - /// m_s = 1/2 at the midpoint of RE. - /// At V, (m_s,m_t)=(0,0). - /// At the center of the face, (m_s,m_t)=(1/2,1/2). - /// - double m_s = ON_DBL_QNAN; - - /// - /// m_cdex identifies face's subdivision quad the s and t parameters apply to. - /// The corner vertex is V = m_cdex.Vertex(face). - /// The edge entering the corner is LE = m_cdex.LeftEdge(face). - /// The edge leaving the corner is RE = m_cdex.RightEdge(face). - /// V = LE.RelativeVertex(1) = RE.RelativeVertex(0). - /// - /// The m_t parameter runs along half of LE from V to the midpoint of LE. - /// 0 <= m_t < 1/2. - /// m_t = 0 at V = RE.RelativeVertex(0) = LE.RelativeVertex(1). - /// m_t = 1/2 at the midpoint of LE. - /// At V, (m_s,m_t)=(0,0). - /// At the center of the face, (m_s,m_t)=(1/2,1/2). - /// - double m_t = ON_DBL_QNAN; -}; - -ON_WIP_DECL -bool operator==(const ON_SubDFaceParameter& lhs, const ON_SubDFaceParameter& rhs); - -ON_WIP_DECL -bool operator!=(const ON_SubDFaceParameter& lhs, const ON_SubDFaceParameter& rhs); - - /// /// ON_SubDHash provides a simple way to save a SubD's vertex, edge, and face SHA1 hashes. /// Typically it is used when a calculation needs to know if the current SubD has is geometrically @@ -1402,6 +1064,7 @@ bool operator==(const ON_SubDHash& lhs, const ON_SubDHash& rhs); bool operator!=(const ON_SubDHash& lhs, const ON_SubDHash& rhs); + class ON_CLASS ON_SubDToBrepParameters { public: @@ -3146,133 +2809,28 @@ public: ON_SubDComponentId& operator=(const ON_SubDComponentId&) = default; ON_SubDComponentId(ON_SubDComponentPtr::Type component_type, unsigned int component_id); - ON_SubDComponentId(ON_SubDComponentPtr::Type component_type, unsigned int component_id, ON__UINT_PTR dir); ON_SubDComponentId(ON_SubDComponentPtr cptr); ON_SubDComponentId(const class ON_SubDVertex* v); - ON_SubDComponentId(ON_SubDVertexPtr vptr); ON_SubDComponentId(const class ON_SubDEdge* e); - ON_SubDComponentId(ON_SubDEdgePtr eptr); ON_SubDComponentId(const class ON_SubDFace* f); - ON_SubDComponentId(ON_SubDFacePtr fptr); - ON_SubDComponentId(const class ON_SubDFace* f, unsigned face_corner_index); - ON_SubDComponentId(ON_SubDFacePtr fptr, unsigned face_corner_index); static int CompareTypeAndId(const ON_SubDComponentId& lhs, const ON_SubDComponentId& rhs); - static int CompareTypeAndIdAndDirection(const ON_SubDComponentId& lhs, const ON_SubDComponentId& rhs); static int CompareTypeAndIdFromPointer(const ON_SubDComponentId* lhs, const ON_SubDComponentId* rhs); - - /// - /// The type of the referenced component. - /// - ON_SubDComponentPtr::Type ComponentType() const; - - /// - /// The id of the reference component. 0 means the id is not set. - /// unsigned int ComponentId() const; - - /// - /// 0 or 1. - /// 1 indicates the orientation or direction of the referenced components - /// is opposite its intrinsic orientation or direction. - /// - unsigned int ComponentDirection() const; + ON_SubDComponentPtr::Type ComponentType() const; /* Returns: - true if id > 0 and type is set to vertex, edge or face. + true if type is not unset and id > 0 */ bool IsSet() const; - /* - Returns: - true if type is unset or id is 0. - */ - bool IsNotSet() const; - - /// - /// True if id > 0 and type = vertex. - /// - bool IsVertexId() const; - - /// - /// True if id > 0 and type = edge. - /// - bool IsEdgeId() const; - - /// - /// True if id > 0 and type = face. - /// - bool IsFaceId() const; - - /// - /// Create an ON_SubDComponentId that references the same SubD component - /// but with the opposite value of this->ComponentDirection(). - /// - /// A ON_SubDComponentId with the same type, same id, and opposite direction. - const ON_SubDComponentId Reversed() const; - - /// - /// Get the referenced SubD component from a component id. - /// - /// - /// The subd containing the referenced component. - /// - /// - /// The referenced SubD component from subd. - /// - const ON_SubDComponentPtr ComponentPtr(const class ON_SubD& subd) const; - - /// - /// Get the referenced SubD component from a component id. - /// - /// - /// The subd containing the referenced component. - /// - /// - /// The referenced SubD component from subd. - /// - const ON_SubDComponentPtr ComponentPtr(const class ON_SubD* subd) const; - - const ON_SubDVertex* Vertex(const class ON_SubD& subd) const; - const ON_SubDVertexPtr VertexPtr(const class ON_SubD& subd) const; - const ON_SubDVertex* Vertex(const class ON_SubD* subd) const; - const ON_SubDVertexPtr VertexPtr(const class ON_SubD* subd) const; - - const ON_SubDEdge* Edge(const class ON_SubD& subd) const; - const ON_SubDEdgePtr EdgePtr(const class ON_SubD& subd) const; - const ON_SubDEdge* Edge(const class ON_SubD* subd) const; - const ON_SubDEdgePtr EdgePtr(const class ON_SubD* subd) const; - - const ON_SubDFace* Face(const class ON_SubD& subd) const; - const ON_SubDFacePtr FacePtr(const class ON_SubD& subd) const; - const ON_SubDFace* Face(const class ON_SubD* subd) const; - const ON_SubDFacePtr FacePtr(const class ON_SubD* subd) const; - const ON_SubDFaceCornerDex FaceCornerDex() const; - private: unsigned int m_id = 0; - - unsigned char m_type_and_dir = 0; - enum : unsigned char - { - bits_dir_mask = 0x01, - bits_type_mask = 0x06, - // the remaining bits may be used in the future - }; - void Internal_SetType(ON_SubDComponentPtr::Type type); - void Internal_SetDir(unsigned dir); - - // The "A" and "B" values are two 12 bit unsigned integer values - // (0 to 4095 decimal) that are encoded in the 3 bytes m_valueAB[]. - // When the referenced component is a SubD face, A = number of face edges - // and B = face corner index. - void Internal_SetValueA(unsigned a); - void Internal_SetValueB(unsigned b); - unsigned Internal_ValueA() const; - unsigned Internal_ValueB() const; - unsigned char m_valueAB[3] = {}; + ON_SubDComponentPtr::Type m_type = ON_SubDComponentPtr::Type::Unset; + unsigned char m_reserved1 = 0; + unsigned short m_reserved2 = 0; }; #if defined(ON_DLL_TEMPLATE) @@ -4828,292 +4386,6 @@ private: bool operator==(const ON_SubDExpandEdgesParameters& lhs, const ON_SubDExpandEdgesParameters& rhs); bool operator!=(const ON_SubDExpandEdgesParameters& lhs, const ON_SubDExpandEdgesParameters& rhs); -class ON_WIP_CLASS ON_SubDComponentParameter -{ -public: - ON_SubDComponentParameter() = default; - ~ON_SubDComponentParameter() = default; - ON_SubDComponentParameter(const ON_SubDComponentParameter&) = default; - ON_SubDComponentParameter& operator=(const ON_SubDComponentParameter&) = default; - - - ON_SubDComponentParameter(ON_SubDComponentId cid); - ON_SubDComponentParameter(ON_SubDComponentPtr cptr); - - ON_SubDComponentParameter( - const class ON_SubDVertex* v, - const class ON_SubDEdge* active_edge, - const class ON_SubDFace* active_face - ); - - ON_SubDComponentParameter( - const ON_SubDVertexPtr vptr, - const class ON_SubDEdge* active_edge, - const class ON_SubDFace* active_face - ); - - /// - /// - /// - /// - /// - /// 0 <= p <= 1. - /// - /// - /// nullptr or a face attached to the edge. - /// - ON_SubDComponentParameter( - const class ON_SubDEdge* e, - double p, - const class ON_SubDFace* active_face - ); - - /// - /// - /// - /// - /// - /// 0 <= p <= 1. - /// NOTE WELL: p is relative to the direction of eptr. - /// - /// - /// nullptr or a face attached to the edge. - /// - ON_SubDComponentParameter( - const ON_SubDEdgePtr eptr, - double p, - const class ON_SubDFace* active_face - ); - - ON_SubDComponentParameter( - const ON_SubDFace* face, - ON_SubDFaceParameter fp - ); - - ON_SubDComponentParameter( - const ON_SubDFacePtr fptr, - ON_SubDFaceParameter fp - ); - - ON_SubDComponentParameter( - const class ON_SubDFace* quad_face, - double quad_s, - double quad_t - ); - ON_SubDComponentParameter( - const class ON_SubDFacePtr quad_fptr, - double quad_s, - double quad_t - ); - - - static const ON_SubDComponentParameter Unset; - - /// - /// Dictionary compares component type and component id. - /// - /// - /// - /// - static int CompareComponentTypeAndId(const ON_SubDComponentParameter& lhs, const ON_SubDComponentParameter& rhs); - - /// - /// Dictionary compares component type, component id, and component dir. - /// - /// - /// - /// - static int CompareComponentTypeAndIdAndDirection(const ON_SubDComponentParameter& lhs, const ON_SubDComponentParameter& rhs); - - - /// - /// Dictionary compares component type, component id, component direction, first parameter, second parameter. - /// - /// - /// - /// - /// -1: lhs < rhs - /// 0: lhs = rhs - /// +1: lhs > rhs - /// - static int CompareAll(const ON_SubDComponentParameter& lhs, const ON_SubDComponentParameter& rhs); - - /// - /// Dictionary compares component type, component id, component direction, first parameter, second parameter - /// and safely sorts nullptr to end. - /// - /// - /// - /// - static int Compare(const ON_SubDComponentParameter* lhs, const ON_SubDComponentParameter* rhs); - - const ON_SubDComponentId ComponentIdAndType() const; - unsigned ComponentId() const; - ON_SubDComponentPtr::Type ComponentType() const; - unsigned ComponentDirection() const; - - /// - /// True if the referenced component is a vertex. - /// - bool IsVertexParameter() const; - - /// - /// If this parameter references a vertex and the subd has a vertex - /// with this->ComponentId(), then that vertex is returned. - /// - /// - /// - /// The referenced vertex in subd. - /// - const ON_SubDVertex* Vertex(const ON_SubD* subd) const; - - /// - /// If this parameter references a vertex and the subd has a vertex - /// with this->ComponentId(), then that vertex is returned. - /// - /// - /// - /// The referenced vertex in subd along with the direction value. - /// - const ON_SubDVertexPtr VertexPtr(const ON_SubD* subd) const; - - /// - /// In some cases, an edge attached to this parameter's vertex is required. - /// In that case, this edge is used. - /// - /// - /// The prefered edge attached to this vertex. - /// - const ON_SubDComponentId VertexEdge() const; - - /// - /// In some cases, a face attached to this parameter's vertex is required. - /// In these cases this face is used. - /// - /// - /// The prefered face attached to this vertex. - /// - const ON_SubDComponentId VertexFace() const; - - /// - /// True if the referenced component is an edge. - /// - bool IsEdgeParameter() const; - - /// - /// If this parameter references an edge and the subd has an edge - /// with this->ComponentId(), then that edge is returned. - /// - /// - /// - /// The referenced edge in subd. - /// - const ON_SubDEdge* Edge(const ON_SubD* subd) const; - - /// - /// If this parameter references an edge and the subd has an edge - /// with this->ComponentId(), then that edge is returned. - /// - /// - /// - /// The referenced edge in subd along with the direction value. - /// - const ON_SubDEdgePtr EdgePtr(const ON_SubD* subd) const; - - /// - /// Returns a parameter between 0 and 1 that identifies a point on the edge. - /// This is always an intrisic parameter; - /// ComponentDirection() is not taken into account. - /// If the reference component is not an edge, then ON_DBL_QNAN is returned. - /// - /// - /// Returns a parameter between 0 and 1 identifying the point - /// on the edge. Note that ComponentDirection() is not taken - /// into account. If this does not reference an edge or the - /// parameter is not set, then ON_DBL_QNAN is returned. - /// - double EdgeParameter() const; - - /// - /// In some cases, a face attached to this parameter's edge is required. - /// In that case, this face is used. - /// - /// - /// The prefered edge attached to this vertex. - /// - const ON_SubDComponentId EdgeFace() const; - - /// - /// True if the referenced component is a face. - /// - bool IsFaceParameter() const; - - /// - /// If this parameter references a face and the subd has a face - /// with this->ComponentId(), then that face is returned. - /// - /// - /// - /// The referenced face in subd. - /// - const ON_SubDFace* Face(const ON_SubD* subd) const; - - /// - /// If this parameter references a face and the subd has a face - /// with this->ComponentId(), then that face is returned. - /// - /// - /// - /// The referenced face in subd along with the direction value. - /// - const ON_SubDFacePtr FacePtr(const ON_SubD* subd) const; - - /// - /// If a valid face and face parameter were passed to the constructor, - /// then that face parameter is returned. - /// Otherwise ON_SubDFaceParameter::Nan is returned. - /// - const ON_SubDFaceParameter FaceParameter() const; - - /// - /// If the subd has a component with the same type and id, - /// then that component is returned. - /// - /// - /// - /// The referenced component in subd along with the direction value. - /// - const ON_SubDComponentPtr ComponentPtr(const class ON_SubD* subd) const; - - /// - /// If the subd has a component with the same type and id, - /// then that component is returned. - /// - /// - /// - /// The referenced component in subd along with the direction value. - /// - const ON_SubDComponentPtr ComponentPtr(const class ON_SubD& subd) const; - -private: - ON_SubDComponentId m_cid = ON_SubDComponentId::Unset; - - union - { - ON_SubDComponentId v_active_e; // vertex's active edge - double eptr_s; // Relative with respect to m_cid.Direction(). - double f_corner_s; // 0 <= f_corner_s <= 1/2 - } m_p0 = {}; - - union - { - ON_SubDComponentId v_active_f; // vertex's active face - ON_SubDComponentId e_active_f; // edge's active face - double f_corner_t; // 0 <= f_corner_t <= 1/2 - } m_p1 = {}; - - bool Internal_Init(ON_SubDComponentId cid); -}; ////////////////////////////////////////////////////////////////////////// // @@ -6030,7 +5302,6 @@ public: ON_SubD* subd ); - public: #pragma region RH_C_SHARED_ENUM [ON_SubD::AutomaticMeshToSubDContext] [Rhino.Geometry.SubDAutomaticMeshToSubDContext] [byte] /// diff --git a/opennurbs_subd_eval.cpp b/opennurbs_subd_eval.cpp index 022b4809..90a64716 100644 --- a/opennurbs_subd_eval.cpp +++ b/opennurbs_subd_eval.cpp @@ -1414,614 +1414,3 @@ const ON_Plane ON_SubDFace::ControlNetCenterFrame() const } return ON_Plane::NanPlane; } - - -int ON_SubDFaceCornerDex::CompareAll(const ON_SubDFaceCornerDex& lhs, const ON_SubDFaceCornerDex& rhs) -{ - // invalids go to the end - int i = lhs.IsSet() ? 0 : 1; - int j = lhs.IsSet() ? 0 : 1; - if (i < j) - return -1; - if (i > j) - return -1; - - if (lhs.m_edge_count < rhs.m_edge_count) - return -1; - if (lhs.m_edge_count > rhs.m_edge_count) - return 1; - - if (lhs.m_corner_index < rhs.m_corner_index) - return -1; - if (lhs.m_corner_index > rhs.m_corner_index) - return 1; - - return 0; -} - -int ON_SubDFaceCornerDex::Compare(const ON_SubDFaceCornerDex* lhs, const ON_SubDFaceCornerDex* rhs) -{ - // sort nullptr to end - if (lhs == rhs) - return 0; - if (nullptr == lhs) - return 1; - if (nullptr == rhs) - return -1; - - return ON_SubDFaceCornerDex::CompareAll(*lhs, *rhs); -} - -bool ON_SubDFaceCornerDex::IsSet() const -{ - return m_corner_index < m_edge_count && m_edge_count >= 3; -} - -bool ON_SubDFaceCornerDex::IsNotSet() const -{ - return m_corner_index >= m_edge_count || m_edge_count < 3; -} - -bool ON_SubDFaceCornerDex::IsValid(const ON_SubDFace* face) const -{ - return nullptr != face && face->m_edge_count == m_edge_count && IsSet(); -} - -unsigned ON_SubDFaceCornerDex::CornerIndex() const -{ - return m_corner_index; -} - -unsigned ON_SubDFaceCornerDex::EdgeCount() const -{ - return m_edge_count; -} - -bool ON_SubDFaceCornerDex::IsQuadFace() const -{ - return 4 == m_edge_count && IsSet(); -} - -const ON_SubDFaceCornerDex ON_SubDFaceCornerDex::NextCornerDex() const -{ - if (IsSet()) - { - ON_SubDFaceCornerDex c; - c.m_corner_index = (m_corner_index + 1u) % m_edge_count; - c.m_edge_count = m_edge_count; - return c; - } - return ON_SubDFaceCornerDex::Unset; -} - -const ON_SubDFaceCornerDex ON_SubDFaceCornerDex::PreviousCornerDex() const -{ - if (IsSet()) - { - ON_SubDFaceCornerDex c; - c.m_corner_index = (m_corner_index + m_edge_count - 1u) % m_edge_count; - c.m_edge_count = m_edge_count; - return c; - } - return ON_SubDFaceCornerDex::Unset; -} - -const ON_SubDVertex* ON_SubDFaceCornerDex::CornerVertex(const ON_SubDFace* face) const -{ - return IsValid(face) ? face->Vertex(m_corner_index) : nullptr; -} - -const ON_SubDVertex* ON_SubDFaceCornerDex::PreviousCornerVertex(const ON_SubDFace* face) const -{ - return this->PreviousCornerDex().CornerVertex(face); -} - -const ON_SubDVertex* ON_SubDFaceCornerDex::NextCornerVertex(const ON_SubDFace* face) const -{ - return this->NextCornerDex().CornerVertex(face); -} - -const ON_SubDEdgePtr ON_SubDFaceCornerDex::EdgePtr(const ON_SubDFace* face, unsigned corner_edge_dex) const -{ - if (0 == corner_edge_dex) - return this->LeftEdgePtr(face); - - if (0 == corner_edge_dex) - return this->RightEdgePtr(face); - - return ON_SubDEdgePtr::Null; -} - -const ON_SubDEdgePtr ON_SubDFaceCornerDex::LeftEdgePtr(const ON_SubDFace* face) const -{ - return this->PreviousCornerDex().RightEdgePtr(face); -} - -const ON_SubDEdgePtr ON_SubDFaceCornerDex::RightEdgePtr(const ON_SubDFace* face) const -{ - return IsValid(face) ? face->EdgePtr(m_corner_index) : ON_SubDEdgePtr::Null; -} - -ON_SubDFaceCornerDex::ON_SubDFaceCornerDex(unsigned corner_index, unsigned edge_count) -{ - if (corner_index < edge_count && edge_count >= 3 && edge_count <= ON_SubDFace::MaximumEdgeCount) - { - m_corner_index = (unsigned short)corner_index; - m_edge_count = (unsigned short)edge_count; - - } - else - { - m_corner_index = 0; - m_edge_count = 0; - } -} - -bool ON_SubDComponentParameter::Internal_Init(ON_SubDComponentId cid) -{ - if (cid.IsSet()) - { - switch (cid.ComponentType()) - { - case ON_SubDComponentPtr::Type::Vertex: - m_cid = cid; - m_p0.v_active_e = ON_SubDEdgePtr::Null; - m_p1.v_active_f = ON_SubDFacePtr::Null; - break; - case ON_SubDComponentPtr::Type::Edge: - m_cid = cid; - m_p0.eptr_s = ON_DBL_QNAN; - m_p1.e_active_f = ON_SubDFacePtr::Null; - break; - case ON_SubDComponentPtr::Type::Face: - m_cid = cid; - m_p0.f_corner_s = ON_DBL_QNAN; - m_p1.f_corner_t = ON_DBL_QNAN; - break; - default: - m_cid = ON_SubDComponentParameter::Unset.m_cid; - m_p0.f_corner_s = 0.0; - m_p1.f_corner_t = 0.0; - break; - } - return true; - } - return false; -} - -ON_SubDFaceParameter::ON_SubDFaceParameter(ON_SubDFaceCornerDex cdex, double s, double t) - : m_cdex(cdex) - , m_s((0.0 <= s && s <= 1.0) ? s : ON_DBL_QNAN) - , m_t((0.0 <= t && t <= 1.0) ? t : ON_DBL_QNAN) -{} - -bool ON_SubDFaceParameter::IsSet() -{ - return m_cdex.IsSet() && 0.0 <= m_s && m_s <= 0.5 && 0.0 <= m_t && m_t <= 0.5; -} - -/// True if all values are not valid. -bool ON_SubDFaceParameter::IsNotSet() -{ - return ON_SubDFaceParameter::IsSet() ? false : true; -} - - -const ON_SubDFaceParameter ON_SubDFaceParameter::CreateFromQuadFaceParameteters(double quad_face_s, double quad_face_t) -{ - if (0.0 <= quad_face_s && 0.0 <= quad_face_t) - { - if (quad_face_t <= 0.5) - { - if (quad_face_s <= 0.5) - return ON_SubDFaceParameter(ON_SubDFaceCornerDex(0, 4), quad_face_s, quad_face_t); - if (quad_face_s <= 1.0) - return ON_SubDFaceParameter(ON_SubDFaceCornerDex(1, 4), 1.0 - quad_face_t, quad_face_s); - } - else if (quad_face_s <= 1.0 && quad_face_t <= 1.0) - { - if (quad_face_s >= 0.5) - return ON_SubDFaceParameter(ON_SubDFaceCornerDex(2, 4), 1.0 - quad_face_s, 1.0 - quad_face_t); - return ON_SubDFaceParameter(ON_SubDFaceCornerDex(3, 4), 1.0 - quad_face_t, quad_face_s); - } - } - return ON_SubDFaceParameter::Nan; -} - -int ON_SubDFaceParameter::CompareAll(const ON_SubDFaceParameter& lhs, const ON_SubDFaceParameter& rhs) -{ - // invalids go to the end - int i = lhs.IsSet() ? 0 : 1; - int j = rhs.IsSet() ? 0 : 1; - if (i < j) - return -1; - if (i > j) - return 1; - - int rc = ON_SubDFaceCornerDex::CompareAll(lhs.m_cdex, rhs.m_cdex); - if (0 == rc) - { - rc = ON_DBL::CompareValue(lhs.m_s, rhs.m_s); - if (0 == rc) - rc = ON_DBL::CompareValue(lhs.m_t, rhs.m_t); - } - return rc; -} - -int ON_SubDFaceParameter::Compare(const ON_SubDFaceParameter* lhs, const ON_SubDFaceParameter* rhs) -{ - if (lhs == rhs) - return 0; - if (nullptr == lhs) - return 1; - if (nullptr == rhs) - return -1; - return ON_SubDFaceParameter::CompareAll(*lhs, *rhs); -} - -bool ON_SubDFaceParameter::IsSet() const -{ - return m_cdex.IsSet() && 0.0 <= m_s && m_s <= 1.0 && 0.0 <= m_t && m_t <= 1.0; -} - -bool ON_SubDFaceParameter::IsNotSet() const -{ - return IsSet() ? false : true; -} - -const ON_SubDFaceCornerDex ON_SubDFaceParameter::FaceCornerDex() const -{ - return m_cdex; -} - -const ON_2dPoint ON_SubDFaceParameter::FaceCornerParameters() const -{ - return IsSet() ? ON_2dPoint(m_s, m_t) : ON_2dPoint::NanPoint; -} - -const ON_2dPoint ON_SubDFaceParameter::QuadFaceParameters() const -{ - if (IsSet() && m_cdex.IsQuadFace()) - { - switch (m_cdex.CornerIndex()) - { - case 0: - return ON_2dPoint(m_s, m_t); - break; - case 1: - return ON_2dPoint(1.0 - m_t, m_s); - break; - case 2: - return ON_2dPoint(1.0 - m_s, 1.0 - m_t); - break; - case 3: - return ON_2dPoint(m_t, 1.0 - m_s); - break; - } - } - return ON_2dPoint::NanPoint; -} - -ON_SubDComponentParameter::ON_SubDComponentParameter(ON_SubDComponentId cid) -{ - Internal_Init(cid); -} - -ON_SubDComponentParameter::ON_SubDComponentParameter(ON_SubDComponentPtr cptr) -{ - Internal_Init(ON_SubDComponentId(cptr)); -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const ON_SubDVertex* v, - const class ON_SubDEdge* active_edge, - const class ON_SubDFace* active_face -) -{ - if (Internal_Init(ON_SubDComponentId(v))) - { - if (nullptr != active_edge) - { - const int vei = v->EdgeArrayIndex(active_edge); - m_p0.v_active_e = ON_SubDComponentId(v->EdgePtr(vei)); - } - if (nullptr != active_face) - { - const int vfi = v->FaceArrayIndex(active_face); - m_p1.v_active_f = ON_SubDComponentId(v->Face(vfi)); - } - } -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const ON_SubDVertexPtr vptr, - const class ON_SubDEdge* active_edge, - const class ON_SubDFace* active_face -) -{ - if (Internal_Init(ON_SubDComponentId(vptr))) - { - const ON_SubDVertex* v = vptr.Vertex(); - if (nullptr != v) - { - if (nullptr != active_edge) - { - const int vei = v->EdgeArrayIndex(active_edge); - m_p0.v_active_e = ON_SubDComponentId(v->EdgePtr(vei)); - } - if (nullptr != active_face) - { - const int vfi = v->FaceArrayIndex(active_face); - m_p1.v_active_f = ON_SubDComponentId(v->Face(vfi)); - } - } - } -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const ON_SubDEdge* e, - double edge_s, - const class ON_SubDFace* active_face -) -{ - if (Internal_Init(ON_SubDComponentId(e))) - { - m_p0.eptr_s = (edge_s >= 0.0 && edge_s <= 1.0) ? edge_s : ON_DBL_QNAN; - if (nullptr != active_face) - { - const unsigned efi = e->FaceArrayIndex(active_face); - m_p1.e_active_f = e->FacePtr(efi); - } - } -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const ON_SubDEdgePtr eptr, - double edge_s, - const class ON_SubDFace* active_face -) -{ - if (Internal_Init(ON_SubDComponentId(eptr))) - { - const ON_SubDEdge* e = eptr.Edge(); - if (nullptr != e) - { - m_p0.eptr_s = (edge_s >= 0.0 && edge_s <= 1.0) ? edge_s : ON_DBL_QNAN; - if (nullptr != active_face) - { - const unsigned efi = e->FaceArrayIndex(active_face); - m_p1.e_active_f = e->FacePtr(efi); - } - } - } -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const ON_SubDFace* f, - ON_SubDFaceParameter fp -) -{ - if (Internal_Init(ON_SubDComponentId(f)) && fp.IsSet()) - { - const ON_SubDFaceCornerDex cdex = fp.FaceCornerDex(); - if (cdex.IsSet() && cdex.EdgeCount() == f->EdgeCount()) - { - const ON_2dPoint p = fp.FaceCornerParameters(); - if (p.IsValid()) - { - this->m_cid = ON_SubDComponentId(f, cdex.CornerIndex()); - this->m_p0.f_corner_s = p.x; - this->m_p1.f_corner_t = p.y; - } - } - } -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const ON_SubDFacePtr fptr, - ON_SubDFaceParameter fp -) -{ - if (Internal_Init(ON_SubDComponentId(fptr)) && fp.IsSet()) - { - const ON_SubDFaceCornerDex cdex = fp.FaceCornerDex(); - if (cdex.IsSet() && cdex.EdgeCount() == fptr.FaceEdgeCount()) - { - const ON_2dPoint p = fp.FaceCornerParameters(); - if (p.IsValid()) - { - this->m_cid = ON_SubDComponentId(fptr, cdex.CornerIndex()); - this->m_p0.f_corner_s = p.x; - this->m_p1.f_corner_t = p.y; - } - } - } -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const class ON_SubDFace* quad_face, - double quad_s, - double quad_t -) -{ - if ( - nullptr != quad_face - && 4 == quad_face->m_edge_count - && Internal_Init(quad_face) - ) - { - const ON_SubDFaceParameter fp = ON_SubDFaceParameter::CreateFromQuadFaceParameteters(quad_s, quad_t); - const ON_2dPoint p = fp.FaceCornerParameters(); - this->m_p0.f_corner_s = p.x; - this->m_p1.f_corner_t = p.y; - } -} - -ON_SubDComponentParameter::ON_SubDComponentParameter( - const ON_SubDFacePtr quad_fptr, - double quad_s, - double quad_t -) -{ - if ( - quad_fptr.IsNotNull() - && 4 == quad_fptr.FaceEdgeCount() - && Internal_Init(quad_fptr) - ) - { - const ON_SubDFaceParameter fp = ON_SubDFaceParameter::CreateFromQuadFaceParameteters(quad_s, quad_t); - const ON_2dPoint p = fp.FaceCornerParameters(); - this->m_p0.f_corner_s = p.x; - this->m_p1.f_corner_t = p.y; - } -} - -ON_SubDComponentPtr::Type ON_SubDComponentParameter::ComponentType() const -{ - return m_cid.ComponentType(); -} - -int ON_SubDComponentParameter::CompareComponentTypeAndId(const ON_SubDComponentParameter& lhs, const ON_SubDComponentParameter& rhs) -{ - return ON_SubDComponentId::CompareTypeAndId(lhs.m_cid, rhs.m_cid); -} - -int ON_SubDComponentParameter::CompareComponentTypeAndIdAndDirection(const ON_SubDComponentParameter& lhs, const ON_SubDComponentParameter& rhs) -{ - return ON_SubDComponentId::CompareTypeAndIdAndDirection(lhs.m_cid, rhs.m_cid); -} - -int ON_SubDComponentParameter::CompareAll(const ON_SubDComponentParameter& lhs, const ON_SubDComponentParameter& rhs) -{ - int rc = ON_SubDComponentParameter::CompareComponentTypeAndIdAndDirection(lhs, rhs); - if (0 == rc) - { - switch (lhs.m_cid.ComponentType()) - { - case ON_SubDComponentPtr::Type::Vertex: - rc = ON_SubDComponentId::CompareTypeAndIdAndDirection(lhs.m_p0.v_active_e, rhs.m_p0.v_active_e); - if (0 == rc) - rc = ON_SubDComponentId::CompareTypeAndIdAndDirection(lhs.m_p1.v_active_f, rhs.m_p1.v_active_f); - break; - case ON_SubDComponentPtr::Type::Edge: - rc = ON_DBL::CompareValue(lhs.m_p0.eptr_s, rhs.m_p0.eptr_s); - if (0 == rc) - rc = ON_SubDComponentId::CompareTypeAndIdAndDirection(lhs.m_p1.e_active_f, rhs.m_p1.e_active_f); - break; - case ON_SubDComponentPtr::Type::Face: - rc = ON_SubDFaceParameter::CompareAll(lhs.FaceParameter(), rhs.FaceParameter()); - break; - default: - break; - } - } - return rc; -} - -const ON_SubDComponentId ON_SubDComponentParameter::ComponentIdAndType() const -{ - return m_cid; -} - -unsigned ON_SubDComponentParameter::ComponentId() const -{ - return m_cid.ComponentId(); -} - -unsigned ON_SubDComponentParameter::ComponentDirection() const -{ - return m_cid.ComponentDirection(); -} - -bool ON_SubDComponentParameter::IsVertexParameter() const -{ - return ON_SubDComponentPtr::Type::Vertex == this->ComponentType(); -} - -bool ON_SubDComponentParameter::IsEdgeParameter() const -{ - return ON_SubDComponentPtr::Type::Edge == this->ComponentType(); -} - -bool ON_SubDComponentParameter::IsFaceParameter() const -{ - return ON_SubDComponentPtr::Type::Face == this->ComponentType(); -} - -const ON_SubDVertex* ON_SubDComponentParameter::Vertex(const ON_SubD* subd) const -{ - return this->ComponentPtr(subd).Vertex(); -} - -const ON_SubDEdge* ON_SubDComponentParameter::Edge(const ON_SubD* subd) const -{ - return this->ComponentPtr(subd).Edge(); -} - -const ON_SubDFace* ON_SubDComponentParameter::Face(const ON_SubD* subd) const -{ - return this->ComponentPtr(subd).Face(); -} - -const ON_SubDComponentPtr ON_SubDComponentParameter::ComponentPtr(const ON_SubD* subd) const -{ - return m_cid.ComponentPtr(subd); -} - -const ON_SubDComponentPtr ON_SubDComponentParameter::ComponentPtr(const ON_SubD& subd) const -{ - return m_cid.ComponentPtr(subd); -} - -const ON_SubDVertexPtr ON_SubDComponentParameter::VertexPtr(const ON_SubD* subd) const -{ - return this->ComponentPtr(subd).VertexPtr(); -} - -const ON_SubDEdgePtr ON_SubDComponentParameter::EdgePtr(const ON_SubD* subd) const -{ - return this->ComponentPtr(subd).EdgePtr(); -} - -const ON_SubDFacePtr ON_SubDComponentParameter::FacePtr(const ON_SubD* subd) const -{ - return this->ComponentPtr(subd).FacePtr(); -} - -const ON_SubDFaceParameter ON_SubDComponentParameter::FaceParameter() const -{ - if ( - this->IsFaceParameter() - && 0.0 <= m_p0.f_corner_s && m_p0.f_corner_s <= 0.5 - && 0.0 <= m_p1.f_corner_t && m_p1.f_corner_t <= 0.5 - ) - { - const ON_SubDFaceCornerDex cdex = m_cid.FaceCornerDex(); - if (cdex.IsSet()) - { - return ON_SubDFaceParameter(cdex, m_p0.f_corner_s, m_p1.f_corner_t); - } - } - return ON_SubDFaceParameter::Nan; -} - -const ON_SubDComponentId ON_SubDComponentParameter::VertexEdge() const -{ - return this->IsVertexParameter() ? m_p0.v_active_e : ON_SubDComponentId::Unset; -} - -const ON_SubDComponentId ON_SubDComponentParameter::VertexFace() const -{ - return this->IsVertexParameter() ? m_p1.v_active_f : ON_SubDComponentId::Unset; -} - -const ON_SubDComponentId ON_SubDComponentParameter::EdgeFace() const -{ - return this->IsEdgeParameter() ? m_p1.e_active_f : ON_SubDComponentId::Unset; -} - -double ON_SubDComponentParameter::EdgeParameter() const -{ - return this->IsEdgeParameter() ? m_p0.eptr_s : ON_DBL_QNAN; -} - diff --git a/opennurbs_sun.cpp b/opennurbs_sun.cpp index 8143a776..7bf46a49 100644 --- a/opennurbs_sun.cpp +++ b/opennurbs_sun.cpp @@ -553,24 +553,6 @@ void ON_SunEngine::ConvertSolarVectorToHorizonCoords(const double* dVector, doub dAzimuth += 360.0; } -void ON_SunEngine::GetCurrentLocalDateTime(int& y, int& m, int& d, double& h) -{ - const time_t time = ON_SecondsSinceJanOne1970UTC(); - - tm ttm = { 0 }; - -#ifdef ON_RUNTIME_WIN - _localtime64_s(&ttm, &time); -#else - ttm = *localtime(&time); -#endif - - y = ttm.tm_year + 1900; - m = ttm.tm_mon + 1; - d = ttm.tm_mday; - h = ttm.tm_hour + (ttm.tm_min / 60.0) + (ttm.tm_sec / 3600.0); -} - class ON_Sun::CImpl : public ON_InternalXMLImpl { public: @@ -811,14 +793,11 @@ void ON_Sun::CImpl::SetDaylightSavingMinutes(int minutes) void ON_Sun::CImpl::LocalDateTime(int& year, int& month, int& day, double& hours) const { - int cy = 0, cm = 0, cd = 0; double ch = 0.0; - ON_SunEngine::GetCurrentLocalDateTime(cy, cm, cd, ch); - const wchar_t* s = XMLPath_Sun(); - year = GetParameter(s, ON_RDK_SUN_DATE_YEAR, cy); - month = GetParameter(s, ON_RDK_SUN_DATE_MONTH, cm); - day = GetParameter(s, ON_RDK_SUN_DATE_DAY, cd); - hours = GetParameter(s, ON_RDK_SUN_TIME_HOURS, ch); + year = GetParameter(s, ON_RDK_SUN_DATE_YEAR, 2000); + month = GetParameter(s, ON_RDK_SUN_DATE_MONTH, 1); + day = GetParameter(s, ON_RDK_SUN_DATE_DAY, 1); + hours = GetParameter(s, ON_RDK_SUN_TIME_HOURS, 0.0); } bool ON_Sun::CImpl::SetLocalDateTime(int year, int month, int day, double hours) @@ -1343,13 +1322,10 @@ void ON_Sun::LoadFromXMLNode(const ON_XMLNode& node) { ON_XMLParameters p(node); - int cy = 0, cm = 0, cd = 0; double ch = 0.0; - ON_SunEngine::GetCurrentLocalDateTime(cy, cm, cd, ch); - - const auto y = p.GetParam(ON_RDK_SUN_DATE_YEAR, cy).AsInteger(); - const auto m = p.GetParam(ON_RDK_SUN_DATE_MONTH, cm).AsInteger(); - const auto d = p.GetParam(ON_RDK_SUN_DATE_DAY, cd).AsInteger(); - const auto h = p.GetParam(ON_RDK_SUN_TIME_HOURS, ch).AsDouble(); + const auto y = p.GetParam(ON_RDK_SUN_DATE_YEAR, 2000).AsInteger(); + const auto m = p.GetParam(ON_RDK_SUN_DATE_MONTH, 1).AsInteger(); + const auto d = p.GetParam(ON_RDK_SUN_DATE_DAY, 1).AsInteger(); + const auto h = p.GetParam(ON_RDK_SUN_TIME_HOURS, 12.0).AsDouble(); SetLocalDateTime(y, m, d, h); SetEnableAllowed (p.GetParam(ON_RDK_SUN_ENABLE_ALLOWED, false)); diff --git a/opennurbs_sun.h b/opennurbs_sun.h index 5fd1997b..dbb97ba5 100644 --- a/opennurbs_sun.h +++ b/opennurbs_sun.h @@ -101,9 +101,6 @@ public: // Helper function; converts unit vector to azimuth and altitude. static void ConvertSolarVectorToHorizonCoords(const double* dVector, double& dAzimuth, double& dAltitude); - // Helper function; gets the current local date and time. - static void GetCurrentLocalDateTime(int& y, int& m, int& d, double& h); - private: class CImpl; CImpl* _impl; diff --git a/opennurbs_texture.h b/opennurbs_texture.h index c12cef23..1defc8b9 100644 --- a/opennurbs_texture.h +++ b/opennurbs_texture.h @@ -292,12 +292,6 @@ public: */ bool IsWcsBoxProjected() const; - /* - Description: - Evaluates WCS box projection at point pt with normal n. - */ - static ON_3dPoint WcsBoxMapping(const ON_3dPoint& pt, const ON_3dVector& n); - // If the m_mapping_channel_id value is one of the built-in // mappings listed in the MAPPING_CHANNEL enum, then that // mapping is used. Otherwise, if an object has rendering diff --git a/opennurbs_texture_mapping.h b/opennurbs_texture_mapping.h index df1287c1..7d727c67 100644 --- a/opennurbs_texture_mapping.h +++ b/opennurbs_texture_mapping.h @@ -30,7 +30,6 @@ class ON_3dPoint; typedef int ( *TEXMAP_INTERSECT_LINE_SURFACE )( const ON_Line*, const ON_BrepFace*, ON_SimpleArray& ); typedef bool ( *TEXMAP_BREP_FACE_CLOSEST_POINT )( const ON_BrepFace*, const ON_3dPoint*, ON_3dPoint& ); -typedef ON_TextureMapping ( *GET_TEXMAP_FROM_DOCUMENT )( const class CRhinoDoc&, const ON_MappingChannel* ); class ON_CLASS ON_TextureMapping : public ON_ModelComponent { @@ -92,9 +91,7 @@ public: srf_mapping_primitive = 7, // m_mapping_primitive is an ON_Surface brep_mapping_primitive = 8, // m_mapping_primitive is an ON_Brep ocs_mapping = 9, // same as plane_mapping - used to differentiate between OCS and plane mapping in the UI - false_colors = 10, // some kind of false color mapping used to set per vertex colors. - wcs_projection = 11, // used for ON_MappingTag when creating texture coordinates for WCS projections - wcsbox_projection = 12 // used for ON_MappingTag when creating texture coordinates for WCS box projections + false_colors = 10 // some kind of false color mapping used to set per vertex colors. }; static ON_TextureMapping::TYPE TypeFromUnsigned( diff --git a/opennurbs_xml.cpp b/opennurbs_xml.cpp index 9f4737a6..5a8dcfed 100644 --- a/opennurbs_xml.cpp +++ b/opennurbs_xml.cpp @@ -5339,11 +5339,8 @@ void ON_RdkDocumentDefaults::CreateXML(void) p.SetParam(ON_RDK_SUN_DAYLIGHT_SAVING_ON, false); p.SetParam(ON_RDK_SUN_DAYLIGHT_SAVING_MINUTES, 60); - int cy = 0, cm = 0, cd = 0; double ch = 0.0; - ON_SunEngine::GetCurrentLocalDateTime(cy, cm, cd, ch); - ON_SunEngine engine(ON_SunEngine::Accuracy::Minimum); - engine.SetLocalDateTime(cy, cm, cd, ch); + engine.SetLocalDateTime(2000, 1, 1, 12.0); int y = 0, m = 0, d = 0; double h = 0.0; engine.LocalDateTime(y, m, d, h); p.SetParam(ON_RDK_SUN_DATE_YEAR, y);