Example #1
0
void Shape::addChild(const std::string &name, ConfigurableObject *child) {
	const Class *cClass = child->getClass();
	if (cClass->derivesFrom(MTS_CLASS(BSDF))) {
		m_bsdf = static_cast<BSDF *>(child);
	} else if (cClass->derivesFrom(MTS_CLASS(Emitter))) {
		Emitter *emitter = static_cast<Emitter *>(child);
		if (m_emitter != NULL)
			Log(EError, "Tried to attach multiple emitters to a shape!");
		if (emitter) {
			if (!emitter->isOnSurface())
				Log(EError, "Tried to attach an incompatible emitter to a surface!");
			if (m_exteriorMedium)
				emitter->setMedium(m_exteriorMedium);
		}
		m_emitter = emitter;
	} else if (cClass->derivesFrom(MTS_CLASS(Sensor))) {
		Sensor *sensor = static_cast<Sensor *>(child);
		if (m_sensor != NULL)
			Log(EError, "Tried to attach multiple sensors to a shape!");
		if (sensor) {
			if (!sensor->isOnSurface())
				Log(EError, "Tried to attach an incompatible sensor to a surface!");
			if (m_exteriorMedium)
				sensor->setMedium(m_exteriorMedium);
		}
		m_sensor = sensor;
	} else if (cClass->derivesFrom(MTS_CLASS(Subsurface))) {
		Assert(m_subsurface == NULL);
		if (m_interiorMedium != NULL)
			Log(EError, "Shape \"%s\" has both an interior medium "
				"and a subsurface scattering model -- please choose one or the other!", getName().c_str());
		m_subsurface = static_cast<Subsurface *>(child);
	} else if (cClass->derivesFrom(MTS_CLASS(Medium))) {
		if (name == "interior") {
			Assert(m_interiorMedium == NULL || m_interiorMedium == child);
			if (m_subsurface != NULL)
				Log(EError, "Shape \"%s\" has both an interior medium "
					"and a subsurface scattering model -- please choose one or the other!", getName().c_str());
			m_interiorMedium = static_cast<Medium *>(child);
		} else if (name == "exterior") {
			Assert(m_exteriorMedium == NULL || m_exteriorMedium == child);
			m_exteriorMedium = static_cast<Medium *>(child);
			if (m_emitter)
				m_emitter->setMedium(m_exteriorMedium);
			if (m_sensor)
				m_sensor->setMedium(m_exteriorMedium);
		} else {
			Log(EError, "Shape: Invalid medium child (must be named "
				"'interior' or 'exterior')!");
		}
	} else {
		ConfigurableObject::addChild(name, child);
	}
}