0031431: Visualization, PrsMgr_PresentableObject - simplify HLR computing interface
[occt.git] / src / Graphic3d / Graphic3d_AttribBuffer.cxx
CommitLineData
da87ddc3 1// Copyright (c) 2018 OPEN CASCADE SAS
2//
3// This file is part of Open CASCADE Technology software library.
4//
5// This library is free software; you can redistribute it and/or modify it under
6// the terms of the GNU Lesser General Public License version 2.1 as published
7// by the Free Software Foundation, with special exception defined in the file
8// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9// distribution for complete text of the license and disclaimer of any warranty.
10//
11// Alternatively, this file may be used under the terms of Open CASCADE
12// commercial license or contractual agreement.
13
14#include <Graphic3d_AttribBuffer.hxx>
15
16IMPLEMENT_STANDARD_RTTIEXT(Graphic3d_AttribBuffer, Graphic3d_Buffer)
17
18// =======================================================================
19// function : Graphic3d_AttribBuffer
20// purpose :
21// =======================================================================
22Graphic3d_AttribBuffer::Graphic3d_AttribBuffer(const Handle(NCollection_BaseAllocator)& theAlloc)
23: Graphic3d_Buffer (theAlloc),
24 myIsInterleaved (Standard_True),
25 myIsMutable (Standard_False)
26{
27}
28
29// =======================================================================
30// function : Init
31// purpose :
32// =======================================================================
33bool Graphic3d_AttribBuffer::Init (const Standard_Integer theNbElems,
34 const Graphic3d_Attribute* theAttribs,
35 const Standard_Integer theNbAttribs)
36{
37 if (!Graphic3d_Buffer::Init (theNbElems, theAttribs, theNbAttribs))
38 {
39 return false;
40 }
41
42 if (mySize > (Standard_Size )IntegerLast()
43 && myIsMutable)
44 {
45 throw Standard_OutOfRange ("Graphic3d_AttribBuffer::Init(), Mutable flag cannot be used for buffer exceeding 32-bit address space");
46 }
47 return true;
48}
49
50// =======================================================================
51// function : SetMutable
52// purpose :
53// =======================================================================
54void Graphic3d_AttribBuffer::SetMutable (Standard_Boolean theMutable)
55{
56 if (mySize > (Standard_Size )IntegerLast()
57 && theMutable)
58 {
59 throw Standard_OutOfRange ("Graphic3d_AttribBuffer::SetMutable(), Mutable flag cannot be used for buffer exceeding 32-bit address space");
60 }
61 myIsMutable = theMutable;
62}
63
64// =======================================================================
65// function : Invalidate
66// purpose :
67// =======================================================================
68void Graphic3d_AttribBuffer::SetInterleaved (Standard_Boolean theIsInterleaved)
69{
70 if (NbMaxElements() != 0)
71 {
72 throw Standard_ProgramError ("Graphic3d_AttribBuffer::SetInterleaved() should not be called for allocated buffer");
73 }
74 myIsInterleaved = theIsInterleaved;
75}
76
77// =======================================================================
78// function : invalidate
79// purpose :
80// =======================================================================
81void Graphic3d_AttribBuffer::invalidate (const Graphic3d_BufferRange& theRange)
82{
83 if (mySize > (Standard_Size )IntegerLast())
84 {
85 throw Standard_OutOfRange ("Graphic3d_Buffer::Invalidate() cannot be used for buffer exceeding 32-bit address space");
86 }
87
88 myInvalidatedRange.Unite (theRange);
89}
90
91// =======================================================================
92// function : Invalidate
93// purpose :
94// =======================================================================
95void Graphic3d_AttribBuffer::Invalidate()
96{
97 if (mySize > (Standard_Size )IntegerLast())
98 {
99 throw Standard_OutOfRange ("Graphic3d_AttribBuffer::Invalidate() cannot be used for buffer exceeding 32-bit address space");
100 }
101
102 invalidate (Graphic3d_BufferRange (0, (Standard_Integer )mySize));
103}
104
105// =======================================================================
106// function : Invalidate
107// purpose :
108// =======================================================================
109void Graphic3d_AttribBuffer::Invalidate (Standard_Integer theAttributeIndex)
110{
111 Standard_OutOfRange_Raise_if (theAttributeIndex < 0
112 || theAttributeIndex >= NbAttributes, "Graphic3d_AttribBuffer::Invalidate()");
113 if (myIsInterleaved)
114 {
115 Invalidate();
116 return;
117 }
118
119 Graphic3d_BufferRange aRange;
120 const Standard_Integer aNbMaxVerts = NbMaxElements();
121 for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter)
122 {
123 const Graphic3d_Attribute& anAttrib = Attribute (anAttribIter);
124 const Standard_Integer anAttribStride = Graphic3d_Attribute::Stride (anAttrib.DataType);
125 if (anAttribIter == theAttributeIndex)
126 {
127 aRange.Length = anAttribStride * aNbMaxVerts;
128 invalidate (aRange);
129 return;
130 }
131
132 aRange.Start += anAttribStride * aNbMaxVerts;
133 }
134}
135
136// =======================================================================
137// function : Invalidate
138// purpose :
139// =======================================================================
140void Graphic3d_AttribBuffer::Invalidate (Standard_Integer theAttributeIndex,
141 Standard_Integer theVertexLower,
142 Standard_Integer theVertexUpper)
143{
144 Standard_OutOfRange_Raise_if (theAttributeIndex < 0
145 || theAttributeIndex >= NbAttributes
146 || theVertexLower < 0
147 || theVertexLower > theVertexUpper
148 || theVertexUpper >= NbMaxElements(), "Graphic3d_AttribBuffer::Invalidate()");
149 if (myIsInterleaved)
150 {
151 Invalidate (theVertexLower, theVertexUpper);
152 return;
153 }
154
155 Graphic3d_BufferRange aRange;
156 const Standard_Integer aNbMaxVerts = NbMaxElements();
157 for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter)
158 {
159 const Graphic3d_Attribute& anAttrib = Attribute (anAttribIter);
160 const Standard_Integer anAttribStride = Graphic3d_Attribute::Stride (anAttrib.DataType);
161 if (anAttribIter == theAttributeIndex)
162 {
163 aRange.Start += anAttribStride * theVertexLower;
164 aRange.Length = anAttribStride * (theVertexUpper - theVertexLower + 1);
165 invalidate (aRange);
166 return;
167 }
168
169 aRange.Start += anAttribStride * aNbMaxVerts;
170 }
171}
172
173// =======================================================================
174// function : Invalidate
175// purpose :
176// =======================================================================
177void Graphic3d_AttribBuffer::Invalidate (Standard_Integer theVertexLower,
178 Standard_Integer theVertexUpper)
179{
180 Standard_OutOfRange_Raise_if (theVertexLower < 0
181 || theVertexLower > theVertexUpper
182 || theVertexUpper >= NbMaxElements(), "Graphic3d_AttribBuffer::Invalidate()");
183 if (myIsInterleaved)
184 {
185 invalidate (Graphic3d_BufferRange (Stride * theVertexLower,
186 Stride * (theVertexUpper - theVertexLower + 1)));
187 return;
188 }
189
190 for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter)
191 {
192 Invalidate (anAttribIter, theVertexLower, theVertexUpper);
193 }
194}