Coverage Report

Created: 2025-07-23 06:21

/src/alembic/lib/Alembic/AbcMaterial/OMaterial.h
Line
Count
Source (jump to first uncovered line)
1
//-*****************************************************************************
2
//
3
// Copyright (c) 2009-2015,
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_AbcMaterial_OMaterial_h
38
#define Alembic_AbcMaterial_OMaterial_h
39
40
#include <Alembic/Abc/All.h>
41
42
#include <Alembic/Util/Export.h>
43
#include <Alembic/AbcMaterial/SchemaInfoDeclarations.h>
44
45
namespace Alembic {
46
namespace AbcMaterial {
47
namespace ALEMBIC_VERSION_NS {
48
49
//! Schema for writing shader definitions as either an object or
50
//! a compound property.
51
//! Only "monolithic" shader definitions (i.e. non network) are presently
52
//! supported in this implementation.
53
class ALEMBIC_EXPORT OMaterialSchema
54
    : public Abc::OSchema<MaterialSchemaInfo>
55
{
56
public:
57
58
    //-------------------------------------------------------------------------
59
    //BOILERPLATE
60
61
    typedef OMaterialSchema this_type;
62
63
0
    OMaterialSchema() {}
64
65
    OMaterialSchema(
66
        Alembic::AbcCoreAbstract::CompoundPropertyWriterPtr iParent,
67
        const std::string &iName,
68
        const Abc::Argument &iArg0 = Abc::Argument(),
69
        const Abc::Argument &iArg1 = Abc::Argument(),
70
        const Abc::Argument &iArg2 = Abc::Argument(),
71
        const Abc::Argument &iArg3 = Abc::Argument() );
72
73
    OMaterialSchema( Abc::OCompoundProperty iParent,
74
                     const std::string &iName,
75
                     const Abc::Argument &iArg0 = Abc::Argument(),
76
                     const Abc::Argument &iArg1 = Abc::Argument(),
77
                     const Abc::Argument &iArg2 = Abc::Argument() );
78
79
    //-------------------------------------------------------------------------
80
    //ACTUAL STUFF
81
82
    //! Declare shader for a given target and shaderType.
83
    //! "Target's" value is an agreed upon convention for a renderer
84
    //! or application (i.e. "prman")
85
    //! "ShaderType's" value is an agreed upon convention for shader terminals
86
    //! such as "surface," "displacement," "light", "coshader_somename."
87
    //! "ShaderName's" value is an identifier meaningful to the target
88
    //! application (i.e. "paintedplastic," "fancy_spot_light").
89
    //! It's only valid to call this once per target/shaderType combo.
90
    void setShader( const std::string & iTarget,
91
                    const std::string & iShaderType,
92
                    const std::string & iShaderName );
93
94
    //! Declare and retrieve a container for storing properties representing
95
    //! parameters for the target and shaderType. You put them in there
96
    //! yourself since there are no restrictions on type or sampling other
97
    //! than what's appropriate and meaningful for the target application.
98
    //! Repeated calls will return the same object.
99
    Abc::OCompoundProperty getShaderParameters(
100
        const std::string & iTarget, const std::string & iShaderType );
101
102
    //add node by name, target, type, set node connection?, set node
103
    //terminals?
104
105
    void addNetworkNode( const std::string & iNodeName,
106
                         const std::string & iTarget,
107
                         const std::string & iNodeType );
108
109
    void setNetworkNodeConnection( const std::string & iNodeName,
110
                                   const std::string & iInputName,
111
                                   const std::string & iConnectedNodeName,
112
                                   const std::string & iConnectedOutputName );
113
114
    Abc::OCompoundProperty
115
    getNetworkNodeParameters( const std::string & iNodeName );
116
117
    void setNetworkTerminal( const std::string & iTarget,
118
                             const std::string & iShaderType,
119
                             const std::string & iNodeName,
120
                             const std::string & iOutputName = "" );
121
122
    void
123
    setNetworkInterfaceParameterMapping(
124
        const std::string & iInterfaceParamName,
125
        const std::string & iMapToNodeName,
126
        const std::string & iMapToParamName );
127
128
    Abc::OCompoundProperty getNetworkInterfaceParameters();
129
130
protected:
131
132
    void init();
133
134
    // all the network nodes will be placed under this property
135
    Abc::OCompoundProperty m_node;
136
    void createNodeCompound();
137
138
    class Data;
139
140
    // shared and not scoped because we want this to survive a copy
141
    Util::shared_ptr< Data > m_data;
142
};
143
144
//! Object declaration
145
typedef Abc::OSchemaObject<OMaterialSchema> OMaterial;
146
147
typedef Util::shared_ptr< OMaterial > OMaterialPtr;
148
149
} // End namespace ALEMBIC_VERSION_NS
150
151
using namespace ALEMBIC_VERSION_NS;
152
153
} // End namespace AbcMaterial
154
} // End namespace Alembic
155
156
157
#endif
158