3D PDF: Default resources, resource chain

This commit is contained in:
Jakub Melka
2022-12-10 18:33:09 +01:00
parent cebfd9d989
commit f986096501
3 changed files with 96 additions and 9 deletions

View File

@@ -1413,6 +1413,7 @@ public:
auto back() const { return m_blocks.back(); }
auto size() const { return m_blocks.size(); }
auto get(size_t index) const { return m_blocks[index]; }
private:
std::vector<PDF3D_U3D_Block_Data> m_blocks;
@@ -2256,7 +2257,32 @@ const PDF3D_U3D_ContextManager::ContextData* PDF3D_U3D_ContextManager::getContex
PDF3D_U3D::PDF3D_U3D()
{
// Default light
m_defaultLight.setType(PDF3D_U3D_Light::Ambient);
m_defaultLight.setIsSpecular(false);
m_defaultLight.setIsSpotDecay(false);
m_defaultLight.setIsEnabled(true);
m_defaultLight.setIntensity(1.0);
m_defaultLight.setColor(QColor::fromRgbF(0.75, 0.75, 0.75, 1.0));
// Default texture
m_defaultTexture = QImage(8, 8, QImage::Format_RGBA8888);
m_defaultTexture.fill(Qt::black);
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
m_defaultTexture.setPixelColor(4 + i, j, QColor::fromRgbF(1.0, 0.4, 0.2, 1.0));
m_defaultTexture.setPixelColor(i, 4 + j, QColor::fromRgbF(1.0, 0.4, 0.2, 1.0));
}
}
// Default material
m_defaultMaterial.setAmbientColor(QColor::fromRgbF(0.75, 0.75, 0.75, 1.0));
// Default shader - initialized in the constructor
m_defaultShader = PDF3D_U3D_Shader();
}
const PDF3D_U3D_Node& PDF3D_U3D::getNode(const QString& nodeName) const
@@ -2295,7 +2321,7 @@ const PDF3D_U3D_Light* PDF3D_U3D::getLight(const QString& lightName) const
return &it->second;
}
return nullptr;
return &m_defaultLight;
}
QImage PDF3D_U3D::getTexture(const QString& textureName) const
@@ -2306,7 +2332,7 @@ QImage PDF3D_U3D::getTexture(const QString& textureName) const
return it->second;
}
return QImage();
return m_defaultTexture;
}
const PDF3D_U3D_Shader* PDF3D_U3D::getShader(const QString& shaderName) const
@@ -2317,7 +2343,7 @@ const PDF3D_U3D_Shader* PDF3D_U3D::getShader(const QString& shaderName) const
return &it->second;
}
return nullptr;
return &m_defaultShader;
}
const PDF3D_U3D_Material* PDF3D_U3D::getMaterial(const QString& materialName) const
@@ -2328,7 +2354,7 @@ const PDF3D_U3D_Material* PDF3D_U3D::getMaterial(const QString& materialName) co
return &it->second;
}
return nullptr;
return &m_defaultMaterial;
}
const PDF3D_U3D_Geometry* PDF3D_U3D::getGeometry(const QString& geometryName) const
@@ -2372,6 +2398,15 @@ void PDF3D_U3D::setGeometry(const QString& geometryName, QSharedPointer<PDF3D_U3
m_geometries[geometryName] = std::move(geometry);
}
void PDF3D_U3D::setShadersToGeometry(const QString& geometryName, const std::vector<QStringList>& shaderLists)
{
auto it = m_geometries.find(geometryName);
if (it != m_geometries.cend())
{
it->second->setShaders(shaderLists);
}
}
PDF3D_U3D PDF3D_U3D::parse(const QByteArray& data, QStringList* errors)
{
PDF3D_U3D_Parser parser;
@@ -3134,7 +3169,6 @@ void PDF3D_U3D_Parser::addBlockToU3D(PDF3D_U3D_AbstractBlockPtr block)
light.setIntensity(lightResourceBlock->getIntensity());
light.setAttenuation(QVector3D(attenuation[0], attenuation[1], attenuation[2]));
PDF3D_U3D_Light::Type type = PDF3D_U3D_Light::Ambient;
switch (lightResourceBlock->getType())
{
@@ -3353,6 +3387,24 @@ void PDF3D_U3D_Parser::addBlockToU3D(PDF3D_U3D_AbstractBlockPtr block)
break;
}
case PDF3D_U3D_Block_Info::BT_Modifier2DGlyph:
case PDF3D_U3D_Block_Info::BT_ModifierSubdivision:
case PDF3D_U3D_Block_Info::BT_ModifierAnimation:
case PDF3D_U3D_Block_Info::BT_ModifierBoneWeights:
case PDF3D_U3D_Block_Info::BT_ModifierCLOD:
m_errors << PDFTranslationContext::tr("Block type (%1) not supported in scene decoder.").arg(block->getBlockType(), 8, 16);
break;
case PDF3D_U3D_Block_Info::BT_ModifierShading:
{
const PDF3D_U3D_ShadingModifierBlock* modelNodeBlock = dynamic_cast<const PDF3D_U3D_ShadingModifierBlock*>(block.data());
const PDF3D_U3D_ShadingModifierBlock::ShaderLists& shaderLists = modelNodeBlock->getShaderLists();
const auto& node = m_object.getNode(modelNodeBlock->getModifierName());
m_object.setShadersToGeometry(node.getResourceName(), shaderLists);
break;
}
default:
{
// TODO: add block to U3D
@@ -5651,6 +5703,21 @@ PDF3D_U3D_AbstractBlockPtr PDF3D_U3D_ShadingModifierBlock::parse(QByteArray data
return pointer;
}
const QString& PDF3D_U3D_ShadingModifierBlock::getModifierName() const
{
return m_modifierName;
}
uint32_t PDF3D_U3D_ShadingModifierBlock::getChainIndex() const
{
return m_chainIndex;
}
uint32_t PDF3D_U3D_ShadingModifierBlock::getAttributes() const
{
return m_attributes;
}
const PDF3D_U3D_ShadingModifierBlock::ShaderLists& PDF3D_U3D_ShadingModifierBlock::getShaderLists() const
{
return m_shaderLists;
@@ -6593,6 +6660,16 @@ void PDF3D_U3D_MeshGeometry::addTriangle(Triangle triangle)
m_triangles.emplace_back(std::move(triangle));
}
std::vector<QStringList> PDF3D_U3D_Geometry::shaders() const
{
return m_shaders;
}
void PDF3D_U3D_Geometry::setShaders(const std::vector<QStringList>& newShaders)
{
m_shaders = newShaders;
}
} // namespace u3d
} // namespace pdf

View File

@@ -118,6 +118,12 @@ public:
virtual PDF3D_U3D_LineSetGeometry* asLineSetGeometry() { return nullptr; }
virtual const PDF3D_U3D_LineSetGeometry* asLineSetGeometry() const { return nullptr; }
std::vector<QStringList> shaders() const;
void setShaders(const std::vector<QStringList>& newShaders);
protected:
std::vector<QStringList> m_shaders;
};
class PDF4QTLIBSHARED_EXPORT PDF3D_U3D_MeshGeometry : public PDF3D_U3D_Geometry
@@ -425,7 +431,7 @@ public:
void setTextureInfos(const PDF_U3D_TextureInfos& newTextureInfos);
private:
bool m_isLightingEnabled = false;
bool m_isLightingEnabled = true;
bool m_isAlphaTestEnabled = false;
bool m_isUseVertexColor = false;
float m_alphaTestReference = 0.0;
@@ -551,6 +557,8 @@ public:
void setMaterialResource(const QString& materialName, PDF3D_U3D_Material material);
void setGeometry(const QString& geometryName, QSharedPointer<PDF3D_U3D_Geometry> geometry);
void setShadersToGeometry(const QString& geometryName, const std::vector<QStringList>& shaderLists);
static PDF3D_U3D parse(const QByteArray& data, QStringList* errors);
private:
@@ -561,6 +569,11 @@ private:
std::map<QString, PDF3D_U3D_Shader> m_shaderResources;
std::map<QString, PDF3D_U3D_Material> m_materialResources;
std::map<QString, QSharedPointer<PDF3D_U3D_Geometry>> m_geometries;
PDF3D_U3D_Light m_defaultLight;
QImage m_defaultTexture;
PDF3D_U3D_Material m_defaultMaterial;
PDF3D_U3D_Shader m_defaultShader;
};
} // namespace u3d

View File

@@ -793,9 +793,6 @@ Qt3DCore::QNode* PDF3DSceneProcessor::createLineSetGeometry(const pdf::u3d::PDF3
return nullptr;
}
// TODO: Odstranit
return nullptr;
switch (m_mode)
{
case BoundingBox: