home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / include / k3d / k3dsdk / attribute_array_copier.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-10-01  |  4.8 KB  |  104 lines

  1. #ifndef K3DSDK_ATTRIBUTE_ARRAY_COPIER_H
  2. #define K3DSDK_ATTRIBUTE_ARRAY_COPIER_H
  3.  
  4. // K-3D
  5. // Copyright (c) 1995-2008, Timothy M. Shead
  6. //
  7. // Contact: tshead@k-3d.com
  8. //
  9. // This program is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. //
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17. // General Public License for more details.
  18. //
  19. // You should have received a copy of the GNU General Public
  20. // License along with this program; if not, read to the Free Software
  21. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  
  23. /** \file
  24.     \author Timothy M. Shead
  25. */
  26.  
  27. #include "attribute_arrays.h"
  28.  
  29. namespace k3d
  30. {
  31.  
  32. /// Handles random-access copying among attribute arrays
  33. class attribute_array_copier
  34. {
  35. public:
  36.     /// Abstract interface for policy objects that determine which source arrays get copied to which target arrays.
  37.     class copy_policy
  38.     {
  39.     protected:
  40.         copy_policy() {}
  41.         ~copy_policy() {}
  42.  
  43.     public:
  44.         /// Return true to indicate that the given source array should be copied to the given target array.  Note that this method
  45.         /// will be called once for every permutation of source and unused-target arrays, so a derivative could implement special behavior
  46.         /// including mapping source and target arrays with different names, mapping a single source array to multiple target arrays, etc.
  47.         virtual const bool_t copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const = 0;
  48.         /// Called once for each source array that isn't used.  Implementations may optionally choose to generate errors.
  49.         virtual void unused_source(const string_t& SourceName, const array& Source) const = 0;
  50.         /// Called once for each target array that isn't used.  Implementations may optionally choose to generate errors.
  51.         virtual void unused_target(const string_t& TargetName, const array& Target) const = 0; 
  52.     };
  53.  
  54.     /// Strict copy policy that matches arrays by name, generating errors for all unused arrays and arrays that match names but not types.
  55.     /// This policy is useful in the majority of cases where a node is copying data from one mesh input to one mesh output and the set of
  56.     /// arrays is identical for both.
  57.     class strict_copy :
  58.         public copy_policy
  59.     {
  60.     public:
  61.         const bool_t copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const; 
  62.         void unused_source(const string_t& SourceName, const array& Source) const; 
  63.         void unused_target(const string_t& TargetName, const array& Target) const; 
  64.     };
  65.  
  66.     /// Copy policy that matches arrays by name, quietly ignoring unused source arrays and arrays with mismatched types. This policy is useful
  67.     /// for nodes that are merging data from multiple input meshes to a single output mesh, where the output will contain a subset (usually
  68.     /// the intersection) of all available input arrays.
  69.     class copy_subset :
  70.         public copy_policy
  71.     {
  72.     public:
  73.         const bool_t copy(const string_t& SourceName, const array& Source, const string_t& TargetName, const array& Target) const; 
  74.         void unused_source(const string_t& SourceName, const array& Source) const; 
  75.         void unused_target(const string_t& TargetName, const array& Target) const; 
  76.     };
  77.  
  78.     /// Initializes attribute_array_copier to copy data from a collection of source arrays to a collection of target arrays, using a copy_policy
  79.     /// object to determine how each source array maps to each target array.
  80.     attribute_array_copier(const attribute_arrays& Source, attribute_arrays& Target, const copy_policy& CopyPolicy = strict_copy());
  81.     ~attribute_array_copier();
  82.  
  83.     /// Appends the given index value from each source array to each corresponding target array.
  84.     void push_back(const uint_t Index);
  85.     /// Computes a weighted sum of N values from each source array and appends the result to the corresponding target array.
  86.     void push_back(const uint_t Count, const uint_t* Indices, const double_t* Weights);
  87.     /// Copies the given source index value from each source array to the TargetIndex in each corresponding target array.
  88.     void copy(const uint_t SourceIndex, const uint_t TargetIndex);
  89.     /// Computes a weighted sum of N values from each source array and copies the result to the corresponding target array at the given TargetIndex.
  90.     void copy(const uint_t Count, const uint_t* Indices, const double_t* Weights, const uint_t TargetIndex);
  91.  
  92. private:
  93.     class implementation;
  94.     implementation* const m_implementation;
  95.  
  96.     attribute_array_copier(const attribute_array_copier&);
  97.     attribute_array_copier& operator=(const attribute_array_copier&);
  98. };
  99.  
  100. } // namespace k3d
  101.  
  102. #endif // !K3DSDK_ATTRIBUTE_ARRAY_COPIER_H
  103.  
  104.