-
Notifications
You must be signed in to change notification settings - Fork 329
/
cmdSampleTexture.cpp
108 lines (88 loc) · 3.28 KB
/
cmdSampleTexture.cpp
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
// BEGIN SampleTexture command
//
class CCommandSampleTexture : public CRhinoCommand
{
public:
CCommandSampleTexture() = default;
virtual ~CCommandSampleTexture() = default;
virtual UUID CommandUUID() override { static const UUID uuid = { 0x50B79DB6, 0xD2B7, 0x4696, { 0x89, 0xD7, 0x0B, 0xA7, 0x11, 0xD5, 0xE8, 0xDE } }; return uuid; }
virtual const wchar_t* EnglishCommandName() override { return L"SampleTexture"; }
virtual CRhinoCommand::result RunCommand(const CRhinoCommandContext& context) override ;
};
// The one and only CCommandSampleTexture object
static class CCommandSampleTexture theSampleTextureCommand;
CRhinoCommand::result CCommandSampleTexture::RunCommand(const CRhinoCommandContext& context)
{
const auto* pDoc = context.Document();
if (nullptr == pDoc)
return failure;
unsigned int geometry_filter =
CRhinoGetObject::surface_object |
CRhinoGetObject::polysrf_object |
CRhinoGetObject::mesh_object;
CRhinoGetObject go;
go.SetCommandPrompt(L"Select surface, polysurface, or mesh to add texture");
go.SetGeometryFilter(geometry_filter);
go.EnablePreSelect(TRUE);
go.EnableSubObjectSelect(FALSE);
go.GetObjects(1, 1);
if (go.CommandResult() != CRhinoCommand::success)
return go.CommandResult();
const auto& object_ref = go.Object(0);
const auto* object = object_ref.Object();
if (nullptr == object)
return CRhinoCommand::failure;
if (object->Attributes().m_material_index >= 0)
{
RhinoApp().Print(L"Object already has a material assigned.\n");
return nothing;
}
CRhinoGetFileDialog gf;
gf.SetScriptMode(context.IsInteractive() ? FALSE : TRUE);
const auto bResult = gf.DisplayFileDialog(CRhinoGetFileDialog::open_bitmap_dialog);
if (!bResult)
return cancel;
ON_wString filename = gf.FileName();
filename.TrimLeftAndRight();
if (filename.IsEmpty())
return nothing;
if (!CRhinoFileUtilities::FileExists(filename))
{
RhinoApp().Print(L"The specified file cannot be found.\n");
return nothing;
}
CRhinoDib dib;
if (!dib.ReadFromFile(pDoc->RuntimeSerialNumber(), filename))
{
RhinoApp().Print(L"The specified file cannot be identifed as a supported type.\n");
return nothing;
}
// Create a material and add the texture to it.
ON_Material mat;
mat.AddTexture(filename, ON_Texture::TYPE::bitmap_texture);
// Create an RDK material from the material.
auto* pMaterial = ::RhRdkNewBasicMaterial(mat, pDoc);
if (nullptr == pMaterial)
return nothing;
// Set the name of the material from the file name.
ON_wString sName;
ON_FileSystemPath::SplitPath(filename, nullptr, nullptr, &sName, nullptr);
pMaterial->SetInstanceName(sName);
// Attach the material to the document's render content collection.
auto& contents = pDoc->Contents().BeginChange(RhRdkChangeContext::Program);
contents.Attach(*pMaterial);
contents.EndChange();
// Assign the material to the object.
CRhRdkObjectDataAccess da(object);
da.SetMaterialInstanceId(pMaterial);
return success;
}
//
// END SampleTexture command
//
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////