aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/module/destructible/include/DestructibleRenderableImpl.h
blob: b33895fbe833610ea3e2eed8ee46cee315b93537 (plain) (blame)
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
/*
 * Copyright (c) 2008-2017, NVIDIA CORPORATION.  All rights reserved.
 *
 * NVIDIA CORPORATION and its licensors retain all intellectual property
 * and proprietary rights in and to this software, related documentation
 * and any modifications thereto.  Any use, reproduction, disclosure or
 * distribution of this software and related documentation without an express
 * license agreement from NVIDIA CORPORATION is strictly prohibited.
 */


#ifndef __DESTRUCTIBLE_RENDERABLE_IMPL_H__
#define __DESTRUCTIBLE_RENDERABLE_IMPL_H__

#include "Apex.h"
#include "DestructibleActor.h"
#include "DestructibleRenderable.h"
#include "ApexRWLockable.h"
#include "ApexActor.h"
#if APEX_RUNTIME_FRACTURE
#include "../fracture/Renderable.h"
#endif

#include "ReadCheck.h"

namespace nvidia
{
namespace apex
{
class RenderMeshActor;
}

namespace destructible
{

class DestructibleActorImpl;

class DestructibleRenderableImpl : public DestructibleRenderable, public ApexRenderable, public UserAllocated, public ApexRWLockable
{
public:
	APEX_RW_LOCKABLE_BOILERPLATE

	DestructibleRenderableImpl(RenderMeshActor* renderMeshActors[DestructibleActorMeshType::Count], DestructibleAssetImpl* asset, int32_t listIndex);
	~DestructibleRenderableImpl();

	// Begin DestructibleRenderable methods
	virtual RenderMeshActor*	getRenderMeshActor(DestructibleActorMeshType::Enum type = DestructibleActorMeshType::Skinned) const
	{
		READ_ZONE();
		return (uint32_t)type < DestructibleActorMeshType::Count ? mRenderMeshActors[type] : NULL;
	}

	virtual void				release();
	// End DestructibleRenderable methods

	// Begin Renderable methods
	virtual	void				updateRenderResources(bool rewriteBuffers, void* userRenderData);

	virtual	void				dispatchRenderResources(UserRenderer& api);

	virtual	PxBounds3			getBounds() const
	{
		PxBounds3 bounds = ApexRenderable::getBounds();
#if APEX_RUNTIME_FRACTURE
		bounds.include(mRTrenderable.getBounds());
#endif
		return bounds;
	}

	virtual	void				lockRenderResources()
	{
		ApexRenderable::renderDataLock();
	}

	virtual	void				unlockRenderResources()
	{
		ApexRenderable::renderDataUnLock();
	}
	// End Renderable methods

	// Begin DestructibleRenderable methods
	// Returns this if successful, NULL otherwise
	DestructibleRenderableImpl*		incrementReferenceCount();

	int32_t						getReferenceCount()
	{
		return mRefCount;
	}

	void						setBounds(const PxBounds3& bounds)
	{
		mRenderBounds = bounds;
	}
	// End DestructibleRenderable methods

#if APEX_RUNTIME_FRACTURE
	::nvidia::fracture::Renderable& getRTrenderable() { return mRTrenderable; }
#endif

private:

	RenderMeshActor*	mRenderMeshActors[DestructibleActorMeshType::Count];	// Indexed by DestructibleActorMeshType::Enum
	DestructibleAssetImpl*	mAsset;
	int32_t				mListIndex;
	volatile int32_t		mRefCount;
#if APEX_RUNTIME_FRACTURE
	::nvidia::fracture::Renderable mRTrenderable;
#endif
};

}
} // end namespace nvidia

#endif // __DESTRUCTIBLE_RENDERABLE_IMPL_H__