new <default> XML tag, which creates a default value for a parameter that has not been specified on the command line
parent
9c4a5fe47b
commit
b5148cdfa3
|
@ -28,6 +28,7 @@
|
|||
<xsd:element name="blackbody" type="blackbody"/>
|
||||
|
||||
<xsd:element name="alias" type="alias"/>
|
||||
<xsd:element name="default" type="string"/>
|
||||
</xsd:choice>
|
||||
<xsd:attribute name="version" type="xsd:string"/>
|
||||
</xsd:complexType>
|
||||
|
@ -49,6 +50,7 @@
|
|||
<xsd:element name="rgb" type="rgb"/>
|
||||
<xsd:element name="srgb" type="string"/>
|
||||
<xsd:element name="blackbody" type="blackbody"/>
|
||||
<xsd:element name="default" type="string"/>
|
||||
</xsd:choice>
|
||||
</xsd:group>
|
||||
|
||||
|
|
|
@ -368,13 +368,28 @@ This lets you include different parts of a scene configuration by changing the c
|
|||
\begin{xml}
|
||||
<include filename="nested-scene-$\texttt{\$}$version.xml"/>
|
||||
\end{xml}
|
||||
\subsection{Default parameter values}
|
||||
As mentioned before, scenes may contain named parameters that are supplied via the command line:
|
||||
\begin{xml}
|
||||
<bsdf type="diffuse">
|
||||
<rgb name="reflectance" value="$\texttt{\$}$reflectance"/>
|
||||
</bsdf>
|
||||
\end{xml}
|
||||
In this case, an error will occur when loading the scene without an explicit command line argument of the form
|
||||
\code{-Dreflectance=}\mbox{$\langle$\emph{something}$\rangle$}. For convenience, it is possible to specify
|
||||
a default parameter value that takes precedence when no command line arguments are given. The syntax for this is
|
||||
\begin{xml}
|
||||
<default name="reflectance" value="something"/>
|
||||
\end{xml}
|
||||
and must precede occurrences of the parameter in the XML file.
|
||||
|
||||
\subsection{Aliases}
|
||||
Sometimes, it can be useful to associate an object (e.g. a scattering model)
|
||||
with multiple identifiers. This can be accomplished using the \code{alias
|
||||
as=..} keyword:
|
||||
\begin{xml}
|
||||
<bsdf type="diffuse" id="myMaterial1"/>
|
||||
<alias id="myMaterial1" as="myMaterial2"/>
|
||||
<bsdf type="diffuse" id="myMaterial1"/>
|
||||
<alias id="myMaterial1" as="myMaterial2"/>
|
||||
\end{xml}
|
||||
After this statement, the diffuse scattering model will be bound to
|
||||
\emph{both} identifiers ``\code{myMaterial1}'' and ``\code{myMaterial2}''.
|
||||
|
|
|
@ -158,7 +158,7 @@ private:
|
|||
ELookAt, EScale, EMatrix, EPoint,
|
||||
EVector, ERGB, ESRGB, EBlackBody,
|
||||
ESpectrum, ETransform, EAnimation,
|
||||
EInclude, EAlias
|
||||
EInclude, EAlias, EDefault
|
||||
};
|
||||
|
||||
typedef std::pair<ETag, const Class *> TagEntry;
|
||||
|
|
|
@ -195,7 +195,7 @@ void gaussLegendre(int n, Float *nodes, Float *weights) {
|
|||
|
||||
while (true) {
|
||||
if (++it > 20)
|
||||
SLog(EError, "gaussLegendre(): did not converge after 20 iterations!");
|
||||
SLog(EError, "gaussLegendre(%i): did not converge after 20 iterations!", n);
|
||||
|
||||
/* Search for the interior roots of P_{n+1}(x) using Newton's method. */
|
||||
std::pair<double, double> L = legendrePD(n+1, x);
|
||||
|
@ -219,7 +219,6 @@ void gaussLegendre(int n, Float *nodes, Float *weights) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void gaussLobatto(int n, Float *nodes, Float *weights) {
|
||||
if (n-- < 2)
|
||||
SLog(EError, "gaussLobatto(): n must be >= 2");
|
||||
|
@ -238,7 +237,7 @@ void gaussLobatto(int n, Float *nodes, Float *weights) {
|
|||
|
||||
while (true) {
|
||||
if (++it > 20)
|
||||
SLog(EError, "gaussLobatto(): did not converge after 20 iterations!");
|
||||
SLog(EError, "gaussLobatto(%i): did not converge after 20 iterations!", n);
|
||||
|
||||
/* Search for the interior roots of P_n'(x) using Newton's method. The same
|
||||
roots are also shared by P_{n+1}-P_{n-1}, which is nicer to evaluate. */
|
||||
|
|
|
@ -102,9 +102,10 @@ SceneHandler::SceneHandler(const SAXParser *parser,
|
|||
m_tags["blackbody"] = TagEntry(EBlackBody, (Class *) NULL);
|
||||
m_tags["spectrum"] = TagEntry(ESpectrum, (Class *) NULL);
|
||||
m_tags["transform"] = TagEntry(ETransform, (Class *) NULL);
|
||||
m_tags["animation"] = TagEntry(EAnimation, (Class *) NULL);
|
||||
m_tags["animation"] = TagEntry(EAnimation, (Class *) NULL);
|
||||
m_tags["include"] = TagEntry(EInclude, (Class *) NULL);
|
||||
m_tags["alias"] = TagEntry(EAlias, (Class *) NULL);
|
||||
m_tags["default"] = TagEntry(EDefault, (Class *) NULL);
|
||||
|
||||
XMLTransService::Codes failReason;
|
||||
m_transcoder = XMLPlatformUtils::fgTransService->makeNewTranscoderFor(
|
||||
|
@ -656,6 +657,12 @@ void SceneHandler::endElement(const XMLCh* const xmlName) {
|
|||
}
|
||||
break;
|
||||
|
||||
case EDefault: {
|
||||
if (m_params.find(context.attributes["name"]) == m_params.end())
|
||||
m_params[context.attributes["name"]] = context.attributes["value"];
|
||||
}
|
||||
break;
|
||||
|
||||
default: {
|
||||
if (tag.second == NULL)
|
||||
XMLLog(EError, "Internal error: could not instantiate an object "
|
||||
|
|
Loading…
Reference in New Issue