/usr/src/castle-game-engine-5.2.0/x3d/opengl/castlesceneinternalshape.pas is in castle-game-engine-src 5.2.0-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | {
Copyright 2003-2014 Michalis Kamburelis.
This file is part of "Castle Game Engine".
"Castle Game Engine" is free software; see the file COPYING.txt,
included in this distribution, for details about the copyright.
"Castle Game Engine" is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
----------------------------------------------------------------------------
}
{ Shape class for OpenGL rendering.
@exclude Internal unit for CastleScene. }
unit CastleSceneInternalShape;
{$I castleconf.inc}
interface
uses X3DNodes, X3DFields, CastleRenderer, CastleGL;
type
{ Shape within a scene rendered using OpenGL.
This is TShape extended with some information needed by TCastleScene.
Non-internal units never expose instances of this class. }
TGLShape = class abstract(TX3DRendererShape)
public
{ Keeps track if this shape was passed to Renderer.Prepare. }
PreparedForRenderer: boolean;
UseBlending: boolean;
{ Is UseBlending calculated and current. }
PreparedUseBlending: boolean;
{ Used only by RenderFrustumOctree. }
RenderFrustumOctree_Visible: boolean;
{ Used only when Attributes.ReallyUseOcclusionQuery.
OcclusionQueryId is 0 if not initialized yet.
When it's 0, value of OcclusionQueryAsked doesn't matter,
OcclusionQueryAsked is always reset to @false when initializing
OcclusionQueryId. }
OcclusionQueryId: TGLint;
OcclusionQueryAsked: boolean;
{ For Hierarchical Occlusion Culling. }
RenderedFrameId: Cardinal;
procedure Changed(const InactiveOnly: boolean;
const Changes: TX3DChanges); override;
procedure PrepareResources;
procedure GLContextClose;
{ Access the Renderer of parent TCastleScene. }
function Renderer: TGLRenderer; virtual; abstract;
{ Request from parent TCastleScene to call our PrepareResources at next time. }
procedure SchedulePrepareResources; virtual; abstract;
end;
implementation
uses CastleScene;
{ TGLShape --------------------------------------------------------------- }
procedure TGLShape.Changed(const InactiveOnly: boolean;
const Changes: TX3DChanges);
begin
inherited;
if Cache <> nil then
begin
{ Ignore changes that don't affect prepared arrays,
like transformation, clip planes and everything else that is applied
by renderer every time, and doesn't affect TGeometryArrays. }
if Changes * [chCoordinate] <> [] then
Cache.FreeArrays([vtCoordinate]) else
if Changes * [chVisibleVRML1State, chGeometryVRML1State,
chColorNode, chTextureCoordinate, chGeometry, chFontStyle] <> [] then
Cache.FreeArrays(AllVboTypes);
end;
if Changes * [chTextureImage, chTextureRendererProperties] <> [] then
begin
Renderer.UnprepareTexture(State.Texture);
PreparedForRenderer := false;
PreparedUseBlending := false;
SchedulePrepareResources;
end;
{ When Material.transparency changes, recalculate UseBlending. }
if chUseBlending in Changes then
begin
PreparedUseBlending := false;
SchedulePrepareResources;
end;
end;
procedure TGLShape.PrepareResources;
begin
if not PreparedForRenderer then
begin
Renderer.Prepare(Self);
PreparedForRenderer := true;
end;
if not PreparedUseBlending then
begin
{ UseBlending is used by RenderScene to decide is Blending used for given
shape. }
UseBlending := Transparent;
PreparedUseBlending := true;
end;
{$ifndef OpenGLES}
if TCastleScene(ParentScene).Attributes.ReallyUseOcclusionQuery and
(OcclusionQueryId = 0) then
begin
glGenQueriesARB(1, @OcclusionQueryId);
OcclusionQueryAsked := false;
end;
{$endif}
end;
procedure TGLShape.GLContextClose;
begin
PreparedForRenderer := false;
PreparedUseBlending := false;
{$ifndef OpenGLES}
if OcclusionQueryId <> 0 then
begin
glDeleteQueriesARB(1, @OcclusionQueryId);
OcclusionQueryId := 0;
end;
{$endif}
end;
end.
|