1 //-*****************************************************************************
2 //
3 // Copyright (c) 2009-2012,
4 //  Sony Pictures Imageworks, Inc. and
5 //  Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd.
6 //
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are
11 // met:
12 // *       Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // *       Redistributions in binary form must reproduce the above
15 // copyright notice, this list of conditions and the following disclaimer
16 // in the documentation and/or other materials provided with the
17 // distribution.
18 // *       Neither the name of Sony Pictures Imageworks, nor
19 // Industrial Light & Magic nor the names of their contributors may be used
20 // to endorse or promote products derived from this software without specific
21 // prior written permission.
22 //
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 //
35 //-*****************************************************************************
36 
37 #ifndef Alembic_AbcGeom_ICamera_h
38 #define Alembic_AbcGeom_ICamera_h
39 
40 #include <Alembic/Util/Export.h>
41 #include <Alembic/AbcGeom/Foundation.h>
42 #include <Alembic/AbcGeom/SchemaInfoDeclarations.h>
43 #include <Alembic/AbcGeom/CameraSample.h>
44 
45 namespace Alembic {
46 namespace AbcGeom {
47 namespace ALEMBIC_VERSION_NS {
48 
49 //-*****************************************************************************
50 class ALEMBIC_EXPORT ICameraSchema : public Abc::ISchema<CameraSchemaInfo>
51 {
52     //-*************************************************************************
53     // CAMERA SCHEMA
54     //-*************************************************************************
55 public:
56     //! By convention we always define this_type in AbcGeom classes.
57     //! Used by unspecified-bool-type conversion below
58     typedef ICameraSchema this_type;
59 
60     //-*************************************************************************
61     // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
62     //-*************************************************************************
63 
64     //! The default constructor creates an empty OCameraMeshSchema
65     //! ...
ICameraSchema()66     ICameraSchema() {}
67 
68     //! This constructor creates a new camera reader.
69     //! The first argument is the parent ICompoundProperty, from which the
70     //! error handler policy for is derived.  The second argument is the name
71     //! of the ICompoundProperty that contains this schemas properties.  The
72     //! remaining optional arguments can be used to override the
73     //! ErrorHandlerPolicy and to specify schema interpretation matching.
74     ICameraSchema( const ICompoundProperty & iParent,
75                    const std::string &iName,
76 
77                    const Abc::Argument &iArg0 = Abc::Argument(),
78                    const Abc::Argument &iArg1 = Abc::Argument() )
79       : Abc::ISchema<CameraSchemaInfo>( iParent, iName, iArg0, iArg1 )
80     {
81         init( iArg0, iArg1 );
82     }
83 
84     //! This constructor wraps an existing ICompoundProperty as the camera
85     //! reader, and the error handler policy is derived from it.
86     //! The  remaining optional arguments can be used to override the
87     //! ErrorHandlerPolicy and to specify schema interpretation matching.
88     ICameraSchema( const ICompoundProperty & iProp,
89                    const Abc::Argument &iArg0 = Abc::Argument(),
90                    const Abc::Argument &iArg1 = Abc::Argument() )
91       : Abc::ISchema<CameraSchemaInfo>( iProp, iArg0, iArg1 )
92     {
93         init( iArg0, iArg1 );
94     }
95 
96 
97     //! Copy constructor.
ICameraSchema(const ICameraSchema & iCopy)98     ICameraSchema(const ICameraSchema& iCopy)
99         : Abc::ISchema<CameraSchemaInfo>()
100     {
101         *this = iCopy;
102     }
103 
104     //! Default assignment operator used.
105 
106     //! Return the time sampling.
getTimeSampling()107     AbcA::TimeSamplingPtr getTimeSampling() const
108     { return m_coreProperties.getTimeSampling(); }
109 
110     //! Return the number of samples contained in the property.
111     //! This can be any number, including zero.
112     //! This returns the number of samples that were written, independently
113     //! of whether or not they were constant.
getNumSamples()114     size_t getNumSamples() const
115     { return m_coreProperties.getNumSamples(); }
116 
117     //! Ask if we're constant - no change in value amongst samples,
118     //! regardless of the time sampling.
119     bool isConstant() const;
120 
121     void get( CameraSample &oSample,
122               const Abc::ISampleSelector &iSS = Abc::ISampleSelector() ) const;
123 
124     CameraSample getValue(
125         const Abc::ISampleSelector &iSS = Abc::ISampleSelector() ) const
126     {
127         CameraSample smp;
128         get( smp, iSS );
129         return smp;
130     }
131 
132     // compound property to use as parent for any arbitrary GeomParams
133     // underneath it
getArbGeomParams()134     ICompoundProperty getArbGeomParams() const { return m_arbGeomParams; }
getUserProperties()135     ICompoundProperty getUserProperties() const { return m_userProperties; }
136 
getChildBoundsProperty()137     Abc::IBox3dProperty getChildBoundsProperty() const { return m_childBoundsProperty; }
138 
139     //! Reset returns this function set to an empty, default
140     //! state.
reset()141     void reset()
142     {
143         m_coreProperties.reset();
144         m_childBoundsProperty.reset();
145         m_arbGeomParams.reset();
146         m_userProperties.reset();
147         m_ops.clear();
148         Abc::ISchema<CameraSchemaInfo>::reset();
149     }
150 
151     //! Returns whether this function set is valid.
valid()152     bool valid() const
153     {
154         return ( Abc::ISchema<CameraSchemaInfo>::valid() &&
155                  m_coreProperties.valid() );
156     }
157 
158     //! unspecified-bool-type operator overload.
159     //! ...
160     ALEMBIC_OVERRIDE_OPERATOR_BOOL( ICameraSchema::valid() );
161 
162 protected:
163     void init( const Abc::Argument &iArg0,
164                const Abc::Argument &iArg1 );
165 
166     Abc::IScalarProperty m_coreProperties;
167 
168     Abc::IBox3dProperty m_childBoundsProperty;
169 
170     Abc::ICompoundProperty m_arbGeomParams;
171     Abc::ICompoundProperty m_userProperties;
172 
173     Abc::IScalarProperty m_smallFilmBackChannels;
174     Abc::IDoubleArrayProperty m_largeFilmBackChannels;
175 
176 private:
177     std::vector < FilmBackXformOp > m_ops;
178 
179 };
180 
181 //-*****************************************************************************
182 // SCHEMA OBJECT
183 //-*****************************************************************************
184 typedef Abc::ISchemaObject<ICameraSchema> ICamera;
185 
186 typedef Util::shared_ptr< ICamera > ICameraPtr;
187 
188 } // End namespace ALEMBIC_VERSION_NS
189 
190 using namespace ALEMBIC_VERSION_NS;
191 
192 } // End namespace AbcGeom
193 } // End namespace Alembic
194 
195 #endif
196