Dust3D开源项目分析——渲染与材质部分 | 材质预览 Part 1

本文探讨了Dust3D中的MaterialPreviewsGenerator类,它作为QObject的继承,提供了添加材质、生成预览并管理预览模型的功能。核心内容包括材质管理、预览生成信号槽和私有数据结构的使用。

 2021SC@SDUSC

materialpreviewsgenerator.h定义了材质预览生成器类,它是QObject的公有继承子类。

#ifndef DUST3D_MATERIAL_PREVIEWS_GENERATOR_H
#define DUST3D_MATERIAL_PREVIEWS_GENERATOR_H
#include <QObject>
#include <map>
#include <QUuid>
#include <vector>
#include "model.h"
#include "materiallayer.h"

class MaterialPreviewsGenerator : public QObject
{
    Q_OBJECT
public:
    MaterialPreviewsGenerator();
    ~MaterialPreviewsGenerator();
    void addMaterial(QUuid materialId, const std::vector<MaterialLayer> &layers);
    const std::set<QUuid> &generatedPreviewMaterialIds();
    Model *takePreview(QUuid materialId);
    void generate();
signals:
    void finished();
public slots:
    void process();
private:
    std::vector<std::pair<QUuid, std::vector<MaterialLayer>>> m_materials;
    std::map<QUuid, Model *> m_previews;
    std::set<QUuid> m_generatedMaterialIds;
};

#endif

在公有部分,可以看到MaterialPreviewGenerator类有添加材质、生成材质Id、生成预览等方法

在私有成员中,可以看到用于预览的材质vector容器m_materials,容器中值的类型是pair,一个pair对应一对QUuid和材质层。m_previews是map容器,用于存储进行预览的材质,其关键字是QUuid,值的类型是指向Model对象的指针。m_generatedMaterialIds是集合容器,存放生成的预览材质Id(QUuid)。

MaterialPreviewsGenerator的构造函数不进行额外的操作,析构函数负责做一些数据清理:

MaterialPreviewsGenerator::~MaterialPreviewsGenerator()
{
    for (auto &item: m_previews) {
        delete item.second;
    }
}

遍历m_previews,删除每个map关键字对应的值。

void MaterialPreviewsGenerator::addMaterial(QUuid materialId, const std::vector<MaterialLayer> &layers)
{
    m_materials.push_back({materialId, layers});
}

addMaterial()函数接收一个materialId和材质层layers,将他们组合成一个pair后追加到vector容器m_materials尾部。

const std::set<QUuid> &MaterialPreviewsGenerator::generatedPreviewMaterialIds()
{
    return m_generatedMaterialIds;
}

generatedPreviewMaterialsIds()负责查询生成好的预览材质ID,是私有成员m_generatedMaterialIds的Get方法。

Model *MaterialPreviewsGenerator::takePreview(QUuid materialId)
{
    Model *resultMesh = m_previews[materialId];
    m_previews[materialId] = nullptr;
    return resultMesh;
}

takePreview()的作用是取出对应ID的预览材质。将m_previews中关键字为materialId的值(Model指针)赋给指针resultMesh后返回,并且已经从map容器m_previews中取出的值置为空指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值