File size: 2,471 Bytes
1dd0e3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#pragma once

#include <string>
#include <vector>
#include <functional>
#include <mutex>
#include <atomic>

namespace hhb {
namespace algorithm {

class AICommandManager {
public:
    static AICommandManager& getInstance();

    void setModelLoadedCallback(std::function<void(bool)> callback);
    void setAnalysisCompleteCallback(std::function<void(const std::string&)> callback);
    void setHighlightCallback(std::function<void(const std::vector<int>&, int)> callback);

    bool loadModel(const std::string& filename);
    void resetCamera();
    void setCameraPosition(float x, float y, float z);
    void setCameraRotation(float pitch, float yaw);
    void setZoom(float zoom);
    void setHighlight(int type, const std::vector<int>& indices);
    void setPBRParams(float metallic, float roughness);
    void clearHighlight();
    void executeAnalysis(const std::string& command);

    float getCameraPositionX() const { return cameraPositionX.load(); }
    float getCameraPositionY() const { return cameraPositionY.load(); }
    float getCameraPositionZ() const { return cameraPositionZ.load(); }
    float getCameraPitch() const { return cameraPitch.load(); }
    float getCameraYaw() const { return cameraYaw.load(); }
    float getZoom() const { return zoom.load(); }

    bool isModelLoaded() const { return modelLoaded.load(); }

    enum class HighlightType {
        None = 0,
        ThinParts = 1,
        CurvedSurfaces = 2,
        SharpEdges = 3,
        FlatSurfaces = 4
    };

private:
    AICommandManager() = default;
    ~AICommandManager() = default;
    AICommandManager(const AICommandManager&) = delete;
    AICommandManager& operator=(const AICommandManager&) = delete;

    std::atomic<bool> modelLoaded{false};
    std::atomic<float> cameraPositionX{0.0f};
    std::atomic<float> cameraPositionY{0.0f};
    std::atomic<float> cameraPositionZ{5.0f};
    std::atomic<float> cameraPitch{0.0f};
    std::atomic<float> cameraYaw{0.0f};
    std::atomic<float> zoom{1.0f};
    std::atomic<float> metallic{0.5f};
    std::atomic<float> roughness{0.5f};
    std::atomic<HighlightType> currentHighlightType{HighlightType::None};

    std::vector<int> currentHighlightIndices;
    std::mutex highlightMutex;

    std::function<void(bool)> modelLoadedCallback;
    std::function<void(const std::string&)> analysisCompleteCallback;
    std::function<void(const std::vector<int>&, int)> highlightCallback;
};

} // namespace algorithm
} // namespace hhb