Merge pull request #54907 from lawnjelly/rid_handles
This commit is contained in:
commit
efadd46640
17
SConstruct
17
SConstruct
@ -150,6 +150,14 @@ opts.Add(BoolVariable("disable_advanced_gui", "Disable advanced GUI nodes and be
|
||||
opts.Add(BoolVariable("no_editor_splash", "Don't use the custom splash screen for the editor", True))
|
||||
opts.Add("system_certs_path", "Use this path as SSL certificates default for editor (for package maintainers)", "")
|
||||
opts.Add(BoolVariable("use_precise_math_checks", "Math checks use very precise epsilon (debug option)", False))
|
||||
opts.Add(
|
||||
EnumVariable(
|
||||
"rids",
|
||||
"Server object management technique (debug option)",
|
||||
"pointers",
|
||||
("pointers", "handles", "tracked_handles"),
|
||||
)
|
||||
)
|
||||
|
||||
# Thirdparty libraries
|
||||
opts.Add(BoolVariable("builtin_bullet", "Use the built-in Bullet library", True))
|
||||
@ -327,6 +335,15 @@ if env_base["no_editor_splash"]:
|
||||
if not env_base["deprecated"]:
|
||||
env_base.Append(CPPDEFINES=["DISABLE_DEPRECATED"])
|
||||
|
||||
if env_base["rids"] == "handles":
|
||||
env_base.Append(CPPDEFINES=["RID_HANDLES_ENABLED"])
|
||||
print("WARNING: Building with RIDs as handles.")
|
||||
|
||||
if env_base["rids"] == "tracked_handles":
|
||||
env_base.Append(CPPDEFINES=["RID_HANDLES_ENABLED"])
|
||||
env_base.Append(CPPDEFINES=["RID_HANDLE_ALLOCATION_TRACKING_ENABLED"])
|
||||
print("WARNING: Building with RIDs as tracked handles.")
|
||||
|
||||
if selected_platform in platform_list:
|
||||
tmppath = "./platform/" + selected_platform
|
||||
sys.path.insert(0, tmppath)
|
||||
|
@ -127,13 +127,13 @@ struct TNode {
|
||||
|
||||
// instead of using linked list we maintain
|
||||
// item references (for quick lookup)
|
||||
PooledList<ItemRef, true> _refs;
|
||||
PooledList<ItemExtra, true> _extra;
|
||||
PooledList<ItemRef, uint32_t, true> _refs;
|
||||
PooledList<ItemExtra, uint32_t, true> _extra;
|
||||
PooledList<ItemPairs> _pairs;
|
||||
|
||||
// these 2 are not in sync .. nodes != leaves!
|
||||
PooledList<TNode, true> _nodes;
|
||||
PooledList<TLeaf, true> _leaves;
|
||||
PooledList<TNode, uint32_t, true> _nodes;
|
||||
PooledList<TLeaf, uint32_t, true> _leaves;
|
||||
|
||||
// we can maintain an un-ordered list of which references are active,
|
||||
// in order to do a slow incremental optimize of the tree over each frame.
|
||||
|
@ -43,35 +43,59 @@
|
||||
// that does call constructors / destructors on request / free, this should probably be
|
||||
// a separate template.
|
||||
|
||||
// The zero_on_first_request feature is optional and is useful for e.g. pools of handles,
|
||||
// which may use a ref count which we want to be initialized to zero the first time a handle is created,
|
||||
// but left alone on subsequent allocations (as will typically be incremented).
|
||||
|
||||
// Note that there is no function to compact the pool - this would
|
||||
// invalidate any existing pool IDs held externally.
|
||||
// Compaction can be done but would rely on a more complex method
|
||||
// of preferentially giving out lower IDs in the freelist first.
|
||||
|
||||
#include "core/local_vector.h"
|
||||
|
||||
template <class T, bool force_trivial = false>
|
||||
template <class T, class U = uint32_t, bool force_trivial = false, bool zero_on_first_request = false>
|
||||
class PooledList {
|
||||
LocalVector<T, uint32_t, force_trivial> list;
|
||||
LocalVector<uint32_t, uint32_t, true> freelist;
|
||||
LocalVector<T, U, force_trivial> list;
|
||||
LocalVector<U, U, true> freelist;
|
||||
|
||||
// not all list members are necessarily used
|
||||
int _used_size;
|
||||
U _used_size;
|
||||
|
||||
public:
|
||||
PooledList() {
|
||||
_used_size = 0;
|
||||
}
|
||||
|
||||
int estimate_memory_use() const {
|
||||
return (list.size() * sizeof(T)) + (freelist.size() * sizeof(uint32_t));
|
||||
// Use with care, in most cases you should make sure to
|
||||
// free all elements first (i.e. _used_size would be zero),
|
||||
// although it could also be used without this as an optimization
|
||||
// in some cases.
|
||||
void clear() {
|
||||
list.clear();
|
||||
freelist.clear();
|
||||
_used_size = 0;
|
||||
}
|
||||
|
||||
const T &operator[](uint32_t p_index) const {
|
||||
uint64_t estimate_memory_use() const {
|
||||
return ((uint64_t)list.size() * sizeof(T)) + ((uint64_t)freelist.size() * sizeof(U));
|
||||
}
|
||||
|
||||
const T &operator[](U p_index) const {
|
||||
return list[p_index];
|
||||
}
|
||||
T &operator[](uint32_t p_index) {
|
||||
T &operator[](U p_index) {
|
||||
return list[p_index];
|
||||
}
|
||||
|
||||
int size() const { return _used_size; }
|
||||
// To be explicit in a pool there is a distinction
|
||||
// between the number of elements that are currently
|
||||
// in use, and the number of elements that have been reserved.
|
||||
// Using size() would be vague.
|
||||
U used_size() const { return _used_size; }
|
||||
U reserved_size() const { return list.size(); }
|
||||
|
||||
T *request(uint32_t &r_id) {
|
||||
T *request(U &r_id) {
|
||||
_used_size++;
|
||||
|
||||
if (freelist.size()) {
|
||||
@ -79,57 +103,73 @@ public:
|
||||
int new_size = freelist.size() - 1;
|
||||
r_id = freelist[new_size];
|
||||
freelist.resize(new_size);
|
||||
|
||||
return &list[r_id];
|
||||
}
|
||||
|
||||
r_id = list.size();
|
||||
list.resize(r_id + 1);
|
||||
|
||||
static_assert((!zero_on_first_request) || (__is_pod(T)), "zero_on_first_request requires trivial type");
|
||||
if (zero_on_first_request && __is_pod(T)) {
|
||||
list[r_id] = {};
|
||||
}
|
||||
|
||||
return &list[r_id];
|
||||
}
|
||||
void free(const uint32_t &p_id) {
|
||||
void free(const U &p_id) {
|
||||
// should not be on free list already
|
||||
CRASH_COND(p_id >= list.size());
|
||||
ERR_FAIL_UNSIGNED_INDEX(p_id, list.size());
|
||||
freelist.push_back(p_id);
|
||||
ERR_FAIL_COND_MSG(!_used_size, "_used_size has become out of sync, have you double freed an item?");
|
||||
_used_size--;
|
||||
}
|
||||
};
|
||||
|
||||
// a pooled list which automatically keeps a list of the active members
|
||||
template <class T, bool force_trivial = false>
|
||||
template <class T, class U = uint32_t, bool force_trivial = false, bool zero_on_first_request = false>
|
||||
class TrackedPooledList {
|
||||
public:
|
||||
int pool_size() const { return _pool.size(); }
|
||||
int active_size() const { return _active_list.size(); }
|
||||
U pool_used_size() const { return _pool.used_size(); }
|
||||
U pool_reserved_size() const { return _pool.reserved_size(); }
|
||||
U active_size() const { return _active_list.size(); }
|
||||
|
||||
uint32_t get_active_id(uint32_t p_index) const {
|
||||
// use with care, see the earlier notes in the PooledList clear()
|
||||
void clear() {
|
||||
_pool.clear();
|
||||
_active_list.clear();
|
||||
_active_map.clear();
|
||||
}
|
||||
|
||||
U get_active_id(U p_index) const {
|
||||
return _active_list[p_index];
|
||||
}
|
||||
|
||||
const T &get_active(uint32_t p_index) const {
|
||||
const T &get_active(U p_index) const {
|
||||
return _pool[get_active_id(p_index)];
|
||||
}
|
||||
|
||||
T &get_active(uint32_t p_index) {
|
||||
T &get_active(U p_index) {
|
||||
return _pool[get_active_id(p_index)];
|
||||
}
|
||||
|
||||
const T &operator[](uint32_t p_index) const {
|
||||
const T &operator[](U p_index) const {
|
||||
return _pool[p_index];
|
||||
}
|
||||
T &operator[](uint32_t p_index) {
|
||||
T &operator[](U p_index) {
|
||||
return _pool[p_index];
|
||||
}
|
||||
|
||||
T *request(uint32_t &r_id) {
|
||||
T *request(U &r_id) {
|
||||
T *item = _pool.request(r_id);
|
||||
|
||||
// add to the active list
|
||||
uint32_t active_list_id = _active_list.size();
|
||||
U active_list_id = _active_list.size();
|
||||
_active_list.push_back(r_id);
|
||||
|
||||
// expand the active map (this should be in sync with the pool list
|
||||
if (_pool.size() > (int)_active_map.size()) {
|
||||
_active_map.resize(_pool.size());
|
||||
if (_pool.used_size() > _active_map.size()) {
|
||||
_active_map.resize(_pool.used_size());
|
||||
}
|
||||
|
||||
// store in the active map
|
||||
@ -138,11 +178,11 @@ public:
|
||||
return item;
|
||||
}
|
||||
|
||||
void free(const uint32_t &p_id) {
|
||||
void free(const U &p_id) {
|
||||
_pool.free(p_id);
|
||||
|
||||
// remove from the active list.
|
||||
uint32_t list_id = _active_map[p_id];
|
||||
U list_id = _active_map[p_id];
|
||||
|
||||
// zero the _active map to detect bugs (only in debug?)
|
||||
_active_map[p_id] = -1;
|
||||
@ -150,19 +190,19 @@ public:
|
||||
_active_list.remove_unordered(list_id);
|
||||
|
||||
// keep the replacement in sync with the correct list Id
|
||||
if (list_id < (uint32_t)_active_list.size()) {
|
||||
if (list_id < _active_list.size()) {
|
||||
// which pool id has been replaced in the active list
|
||||
uint32_t replacement_id = _active_list[list_id];
|
||||
U replacement_id = _active_list[list_id];
|
||||
|
||||
// keep that replacements map up to date with the new position
|
||||
_active_map[replacement_id] = list_id;
|
||||
}
|
||||
}
|
||||
|
||||
const LocalVector<uint32_t, uint32_t> &get_active_list() const { return _active_list; }
|
||||
const LocalVector<U, U> &get_active_list() const { return _active_list; }
|
||||
|
||||
private:
|
||||
PooledList<T, force_trivial> _pool;
|
||||
LocalVector<uint32_t, uint32_t> _active_map;
|
||||
LocalVector<uint32_t, uint32_t> _active_list;
|
||||
PooledList<T, U, force_trivial, zero_on_first_request> _pool;
|
||||
LocalVector<U, U> _active_map;
|
||||
LocalVector<U, U> _active_list;
|
||||
};
|
||||
|
@ -30,6 +30,7 @@
|
||||
|
||||
#include "rid.h"
|
||||
|
||||
#ifndef RID_HANDLES_ENABLED
|
||||
RID_Data::~RID_Data() {
|
||||
}
|
||||
|
||||
@ -38,3 +39,4 @@ SafeRefCount RID_OwnerBase::refcount;
|
||||
void RID_OwnerBase::init_rid() {
|
||||
refcount.init();
|
||||
}
|
||||
#endif // not RID_HANDLES_ENABLED
|
||||
|
@ -33,10 +33,13 @@
|
||||
|
||||
#include "core/list.h"
|
||||
#include "core/os/memory.h"
|
||||
#include "core/rid_handle.h"
|
||||
#include "core/safe_refcount.h"
|
||||
#include "core/set.h"
|
||||
#include "core/typedefs.h"
|
||||
|
||||
#ifndef RID_HANDLES_ENABLED
|
||||
|
||||
class RID_OwnerBase;
|
||||
|
||||
class RID_Data {
|
||||
@ -187,4 +190,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
#endif // not handles
|
||||
|
||||
#endif
|
||||
|
303
core/rid_handle.cpp
Normal file
303
core/rid_handle.cpp
Normal file
@ -0,0 +1,303 @@
|
||||
/*************************************************************************/
|
||||
/* rid_handle.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "rid_handle.h"
|
||||
|
||||
#ifdef RID_HANDLES_ENABLED
|
||||
#include "core/os/memory.h"
|
||||
#include "core/print_string.h"
|
||||
#include "core/ustring.h"
|
||||
|
||||
// This define will flag up an error when get() or getptr() is called with a NULL object.
|
||||
// These calls should more correctly be made as get_or_null().
|
||||
// #define RID_HANDLE_FLAG_NULL_GETS
|
||||
|
||||
RID_Database g_rid_database;
|
||||
|
||||
RID_Data::~RID_Data() {
|
||||
}
|
||||
|
||||
void RID_OwnerBase::init_rid() {
|
||||
// NOOP
|
||||
}
|
||||
|
||||
RID_OwnerBase::~RID_OwnerBase() {
|
||||
_shutdown = true;
|
||||
}
|
||||
|
||||
void RID_OwnerBase::_rid_print(const char *pszType, String sz, const RID &p_rid) {
|
||||
String tn = pszType;
|
||||
print_line(tn + " : " + sz + " " + itos(p_rid._id) + " [ " + itos(p_rid._revision) + " ]");
|
||||
}
|
||||
|
||||
RID_Database::RID_Database() {
|
||||
// request first element so the handles start from 1
|
||||
uint32_t dummy;
|
||||
_pool.request(dummy);
|
||||
}
|
||||
|
||||
RID_Database::~RID_Database() {
|
||||
}
|
||||
|
||||
String RID_Database::_rid_to_string(const RID &p_rid, const PoolElement &p_pe) {
|
||||
String s = "RID id=" + itos(p_rid._id);
|
||||
s += " [ rev " + itos(p_rid._revision) + " ], ";
|
||||
|
||||
s += "PE [ rev " + itos(p_pe.revision) + " ] ";
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
if (p_pe.filename) {
|
||||
s += String(p_pe.filename) + " ";
|
||||
}
|
||||
s += "line " + itos(p_pe.line_number);
|
||||
#endif
|
||||
return s;
|
||||
}
|
||||
|
||||
void RID_Database::preshutdown() {
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
for (uint32_t n = 0; n < _pool.active_size(); n++) {
|
||||
uint32_t id = _pool.get_active_id(n);
|
||||
|
||||
// ignore zero as it is a dummy
|
||||
if (!id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
PoolElement &pe = _pool[id];
|
||||
|
||||
if (pe.data) {
|
||||
if (pe.data->_owner) {
|
||||
const char *tn = pe.data->_owner->get_typename();
|
||||
|
||||
// does it already exist?
|
||||
bool found = false;
|
||||
for (unsigned int i = 0; i < _owner_names.size(); i++) {
|
||||
if (_owner_names[i] == tn) {
|
||||
found = true;
|
||||
pe.owner_name_id = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
pe.owner_name_id = _owner_names.size();
|
||||
_owner_names.push_back(tn);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void RID_Database::register_leak(uint32_t p_line_number, uint32_t p_owner_name_id, const char *p_filename) {
|
||||
// does the leak exist already?
|
||||
for (unsigned int n = 0; n < _leaks.size(); n++) {
|
||||
Leak &leak = _leaks[n];
|
||||
if ((leak.line_number == p_line_number) && (leak.filename == p_filename) && (leak.owner_name_id == p_owner_name_id)) {
|
||||
leak.num_objects_leaked += 1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Leak leak;
|
||||
leak.filename = p_filename;
|
||||
leak.line_number = p_line_number;
|
||||
leak.owner_name_id = p_owner_name_id;
|
||||
leak.num_objects_leaked = 1;
|
||||
_leaks.push_back(leak);
|
||||
}
|
||||
|
||||
void RID_Database::shutdown() {
|
||||
// free the first dummy element, so we don't report a false leak
|
||||
_pool.free(0);
|
||||
|
||||
// print leaks
|
||||
if (_pool.active_size()) {
|
||||
ERR_PRINT("RID_Database leaked " + itos(_pool.active_size()) + " objects at exit.");
|
||||
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
for (uint32_t n = 0; n < _pool.active_size(); n++) {
|
||||
const PoolElement &pe = _pool.get_active(n);
|
||||
|
||||
register_leak(pe.line_number, pe.owner_name_id, pe.filename);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
for (uint32_t n = 0; n < _leaks.size(); n++) {
|
||||
const Leak &leak = _leaks[n];
|
||||
|
||||
const char *tn = "RID_Owner unknown";
|
||||
if (_owner_names.size()) {
|
||||
tn = _owner_names[leak.owner_name_id];
|
||||
}
|
||||
|
||||
const char *fn = "Filename unknown";
|
||||
if (leak.filename) {
|
||||
fn = leak.filename;
|
||||
}
|
||||
|
||||
_err_print_error(tn, fn, leak.line_number, itos(leak.num_objects_leaked) + " RID objects leaked");
|
||||
}
|
||||
#endif
|
||||
|
||||
_shutdown = true;
|
||||
}
|
||||
|
||||
void RID_Database::handle_make_rid(RID &r_rid, RID_Data *p_data, RID_OwnerBase *p_owner) {
|
||||
ERR_FAIL_COND_MSG(_shutdown, "RID_Database make_rid use after shutdown.");
|
||||
ERR_FAIL_COND_MSG(!p_data, "RID_Database make_rid, data is empty.");
|
||||
bool data_was_empty = true;
|
||||
|
||||
_mutex.lock();
|
||||
PoolElement *pe = _pool.request(r_rid._id);
|
||||
data_was_empty = !pe->data;
|
||||
|
||||
pe->data = p_data;
|
||||
p_data->_owner = p_owner;
|
||||
pe->revision = pe->revision + 1;
|
||||
r_rid._revision = pe->revision;
|
||||
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
pe->line_number = 0;
|
||||
pe->filename = nullptr;
|
||||
#endif
|
||||
|
||||
_mutex.unlock();
|
||||
|
||||
ERR_FAIL_COND_MSG(!data_was_empty, "RID_Database make_rid, previous data was not empty.");
|
||||
}
|
||||
|
||||
RID_Data *RID_Database::handle_get(const RID &p_rid) {
|
||||
RID_Data *data = handle_get_or_null(p_rid);
|
||||
#ifdef RID_HANDLE_FLAG_NULL_GETS
|
||||
ERR_FAIL_COND_V_MSG(!data, nullptr, "RID_Database get is NULL");
|
||||
#endif
|
||||
return data;
|
||||
}
|
||||
|
||||
RID_Data *RID_Database::handle_getptr(const RID &p_rid) {
|
||||
RID_Data *data = handle_get_or_null(p_rid);
|
||||
#ifdef RID_HANDLE_FLAG_NULL_GETS
|
||||
ERR_FAIL_COND_V_MSG(!data, nullptr, "RID_Database getptr is NULL");
|
||||
#endif
|
||||
return data;
|
||||
}
|
||||
|
||||
// Note, no locks used in the getters.
|
||||
// Godot 4.x does use locks in the getters, but it is arguably overkill because even though
|
||||
// the pointer returned will be correct (i.e. it has not been replaced during this call),
|
||||
// it can be invalidated during the client code use. (There may also be an internal reason why
|
||||
// locks are needed in 4.x, as the database is different.)
|
||||
// An example of a "safer" way to do this kind of thing is object level locking,
|
||||
// (but that has complications of its own), or atomic object changes.
|
||||
|
||||
RID_Data *RID_Database::handle_get_or_null(const RID &p_rid) {
|
||||
if (p_rid.is_valid()) {
|
||||
ERR_FAIL_COND_V_MSG(_shutdown, nullptr, "RID_Database get_or_null after shutdown.");
|
||||
|
||||
// The if statement is to allow breakpointing without a recompile.
|
||||
if (p_rid._id >= _pool.pool_reserved_size()) {
|
||||
ERR_FAIL_COND_V_MSG(p_rid._id >= _pool.pool_reserved_size(), nullptr, "RID_Database get_or_null, RID id was outside pool size.");
|
||||
}
|
||||
|
||||
const PoolElement &pe = _pool[p_rid._id];
|
||||
if (pe.revision != p_rid._revision) {
|
||||
print_verbose("RID revision incorrect : " + _rid_to_string(p_rid, pe));
|
||||
ERR_FAIL_COND_V_MSG(pe.revision != p_rid._revision, nullptr, "RID_Database get_or_null, revision is incorrect, object possibly freed before use.");
|
||||
}
|
||||
|
||||
return pe.data;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
bool RID_Database::handle_owns(const RID &p_rid) const {
|
||||
ERR_FAIL_COND_V_MSG(_shutdown, false, "RID_Database owns after shutdown.");
|
||||
|
||||
if (!p_rid.is_valid()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (p_rid._id >= _pool.pool_reserved_size()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const PoolElement &pe = _pool[p_rid._id];
|
||||
if (pe.revision != p_rid._revision) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!pe.data) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void RID_Database::handle_free(const RID &p_rid) {
|
||||
ERR_FAIL_COND_MSG(_shutdown, "RID_Database free after shutdown.");
|
||||
bool revision_correct = true;
|
||||
|
||||
ERR_FAIL_COND_MSG(p_rid._id >= _pool.pool_reserved_size(), "RID_Database free, RID id was outside pool size.");
|
||||
_mutex.lock();
|
||||
PoolElement &pe = _pool[p_rid._id];
|
||||
revision_correct = pe.revision == p_rid._revision;
|
||||
|
||||
// mark the data as zero, which indicates unused element
|
||||
if (revision_correct) {
|
||||
pe.data->_owner = nullptr;
|
||||
pe.data = nullptr;
|
||||
_pool.free(p_rid._id);
|
||||
}
|
||||
|
||||
_mutex.unlock();
|
||||
|
||||
ERR_FAIL_COND_MSG(!revision_correct, "RID_Database free, revision is incorrect, object possibly freed more than once.");
|
||||
}
|
||||
|
||||
RID RID_Database::prime(const RID &p_rid, int p_line_number, const char *p_filename) {
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
if (p_rid.is_valid()) {
|
||||
ERR_FAIL_COND_V_MSG(_shutdown, p_rid, "RID_Database prime after shutdown.");
|
||||
ERR_FAIL_COND_V_MSG(p_rid._id >= _pool.pool_reserved_size(), p_rid, "RID_Database prime, RID id was outside pool size.");
|
||||
|
||||
PoolElement &pe = _pool[p_rid._id];
|
||||
ERR_FAIL_COND_V_MSG(pe.revision != p_rid._revision, p_rid, "RID_Database prime, revision is incorrect, object possibly freed before use.");
|
||||
|
||||
// no threading checks as it the tracking info doesn't matter if there is a race condition
|
||||
pe.line_number = p_line_number;
|
||||
pe.filename = p_filename;
|
||||
}
|
||||
#endif
|
||||
return p_rid;
|
||||
}
|
||||
|
||||
#endif // RID_HANDLES_ENABLED
|
253
core/rid_handle.h
Normal file
253
core/rid_handle.h
Normal file
@ -0,0 +1,253 @@
|
||||
/*************************************************************************/
|
||||
/* rid_handle.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef RID_HANDLE_H
|
||||
#define RID_HANDLE_H
|
||||
|
||||
#include "core/list.h"
|
||||
#include "core/os/mutex.h"
|
||||
#include "core/pooled_list.h"
|
||||
#include "core/safe_refcount.h"
|
||||
#include "core/typedefs.h"
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
// SCONS parameters:
|
||||
// rids=pointers (default)
|
||||
// rids=handles
|
||||
// rids=tracked_handles (handles plus allocation tracking)
|
||||
|
||||
// Defines RID_HANDLES_ENABLED and RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
// should be defined from Scons as required following the above convention.
|
||||
|
||||
// RID_PRIME is the macro which stores line numbers and file in the RID_Database.
|
||||
// It will be a NOOP if tracking is off.
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
#define RID_PRIME(a) g_rid_database.prime(a, __LINE__, __FILE__)
|
||||
#else
|
||||
#define RID_PRIME(a) a
|
||||
#endif
|
||||
|
||||
// All the handle code can be compiled out if they are not in use.
|
||||
#ifdef RID_HANDLES_ENABLED
|
||||
|
||||
// This define will print out each make_rid and free_rid. Useful for debugging.
|
||||
// #define RID_HANDLE_PRINT_LIFETIMES
|
||||
|
||||
class RID_OwnerBase;
|
||||
class RID_Database;
|
||||
|
||||
class RID_Data {
|
||||
friend class RID_OwnerBase;
|
||||
friend class RID_Database;
|
||||
|
||||
RID_OwnerBase *_owner;
|
||||
uint32_t _id;
|
||||
|
||||
public:
|
||||
uint32_t get_id() const { return _id; }
|
||||
|
||||
virtual ~RID_Data();
|
||||
};
|
||||
|
||||
class RID_Handle {
|
||||
public:
|
||||
union {
|
||||
struct {
|
||||
uint32_t _id;
|
||||
uint32_t _revision;
|
||||
};
|
||||
uint64_t _handle_data;
|
||||
};
|
||||
|
||||
RID_Handle() {
|
||||
_handle_data = 0;
|
||||
}
|
||||
|
||||
bool operator==(const RID_Handle &p_rid) const {
|
||||
return _handle_data == p_rid._handle_data;
|
||||
}
|
||||
bool operator<(const RID_Handle &p_rid) const {
|
||||
return _handle_data < p_rid._handle_data;
|
||||
}
|
||||
bool operator<=(const RID_Handle &p_rid) const {
|
||||
return _handle_data <= p_rid._handle_data;
|
||||
}
|
||||
bool operator>(const RID_Handle &p_rid) const {
|
||||
return _handle_data > p_rid._handle_data;
|
||||
}
|
||||
bool operator!=(const RID_Handle &p_rid) const {
|
||||
return _handle_data != p_rid._handle_data;
|
||||
}
|
||||
bool is_valid() const { return _id != 0; }
|
||||
|
||||
uint32_t get_id() const { return _id ? _handle_data : 0; }
|
||||
};
|
||||
|
||||
class RID : public RID_Handle {
|
||||
};
|
||||
|
||||
class RID_Database {
|
||||
struct PoolElement {
|
||||
RID_Data *data;
|
||||
uint32_t revision;
|
||||
#ifdef RID_HANDLE_ALLOCATION_TRACKING_ENABLED
|
||||
uint16_t line_number;
|
||||
uint16_t owner_name_id;
|
||||
const char *filename;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct Leak {
|
||||
uint16_t line_number;
|
||||
uint16_t owner_name_id;
|
||||
const char *filename;
|
||||
uint32_t num_objects_leaked;
|
||||
};
|
||||
|
||||
// The pooled list zeros on first request .. this is important
|
||||
// so that we initialize the revision to zero. Other than that, it
|
||||
// is treated as a POD type.
|
||||
TrackedPooledList<PoolElement, uint32_t, true, true> _pool;
|
||||
bool _shutdown = false;
|
||||
Mutex _mutex;
|
||||
|
||||
// This is purely for printing the leaks at the end, as RID_Owners may be
|
||||
// destroyed before the RID_Database is shutdown, so the RID_Data may be invalid
|
||||
// by this point, and we still want to have a record of the owner names.
|
||||
// The owner names should part of the binary, thus the pointers should still be valid.
|
||||
// They were retrieved using typeid(T).name()
|
||||
LocalVector<const char *> _owner_names;
|
||||
LocalVector<Leak> _leaks;
|
||||
|
||||
void register_leak(uint32_t p_line_number, uint32_t p_owner_name_id, const char *p_filename);
|
||||
String _rid_to_string(const RID &p_rid, const PoolElement &p_pe);
|
||||
|
||||
public:
|
||||
RID_Database();
|
||||
~RID_Database();
|
||||
|
||||
// Called to record the owner names before RID_Owners are destroyed
|
||||
void preshutdown();
|
||||
|
||||
// Called after destroying RID_Owners to detect leaks
|
||||
void shutdown();
|
||||
|
||||
// Prepare a RID for memory tracking
|
||||
RID prime(const RID &p_rid, int p_line_number, const char *p_filename);
|
||||
|
||||
void handle_make_rid(RID &r_rid, RID_Data *p_data, RID_OwnerBase *p_owner);
|
||||
RID_Data *handle_get(const RID &p_rid);
|
||||
RID_Data *handle_getptr(const RID &p_rid);
|
||||
RID_Data *handle_get_or_null(const RID &p_rid);
|
||||
bool handle_owns(const RID &p_rid) const;
|
||||
void handle_free(const RID &p_rid);
|
||||
};
|
||||
|
||||
extern RID_Database g_rid_database;
|
||||
|
||||
class RID_OwnerBase {
|
||||
protected:
|
||||
bool _is_owner(const RID &p_rid) const {
|
||||
const RID_Data *p = g_rid_database.handle_get_or_null(p_rid);
|
||||
return (p && (p->_owner == this));
|
||||
}
|
||||
|
||||
void _remove_owner(RID &p_rid) {
|
||||
RID_Data *p = g_rid_database.handle_get_or_null(p_rid);
|
||||
if (p) {
|
||||
p->_owner = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void _rid_print(const char *pszType, String sz, const RID &p_rid);
|
||||
|
||||
const char *_typename = nullptr;
|
||||
bool _shutdown = false;
|
||||
|
||||
public:
|
||||
virtual void get_owned_list(List<RID> *p_owned) = 0;
|
||||
const char *get_typename() const { return _typename; }
|
||||
|
||||
static void init_rid();
|
||||
virtual ~RID_OwnerBase();
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class RID_Owner : public RID_OwnerBase {
|
||||
public:
|
||||
RID make_rid(T *p_data) {
|
||||
RID rid;
|
||||
g_rid_database.handle_make_rid(rid, p_data, this);
|
||||
|
||||
#ifdef RID_HANDLE_PRINT_LIFETIMES
|
||||
_rid_print(_typename, "make_rid", rid);
|
||||
#endif
|
||||
return rid;
|
||||
}
|
||||
|
||||
T *get(const RID &p_rid) {
|
||||
return static_cast<T *>(g_rid_database.handle_get(p_rid));
|
||||
}
|
||||
|
||||
T *getornull(const RID &p_rid) {
|
||||
return static_cast<T *>(g_rid_database.handle_get_or_null(p_rid));
|
||||
}
|
||||
|
||||
T *getptr(const RID &p_rid) {
|
||||
return static_cast<T *>(g_rid_database.handle_getptr(p_rid));
|
||||
}
|
||||
|
||||
bool owns(const RID &p_rid) const {
|
||||
return _is_owner(p_rid);
|
||||
}
|
||||
|
||||
void free(RID p_rid) {
|
||||
#ifdef RID_HANDLE_PRINT_LIFETIMES
|
||||
_rid_print(_typename, "free_rid", p_rid);
|
||||
#endif
|
||||
_remove_owner(p_rid);
|
||||
g_rid_database.handle_free(p_rid);
|
||||
}
|
||||
|
||||
void get_owned_list(List<RID> *p_owned){
|
||||
#ifdef DEBUG_ENABLED
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
RID_Owner() {
|
||||
_typename = typeid(T).name();
|
||||
}
|
||||
};
|
||||
|
||||
#endif // RID_HANDLES_ENABLED
|
||||
|
||||
#endif // RID_HANDLE_H
|
@ -354,7 +354,7 @@ void RasterizerGLES2::set_boot_image(const Ref<Image> &p_image, const Color &p_c
|
||||
|
||||
canvas->canvas_begin();
|
||||
|
||||
RID texture = storage->texture_create();
|
||||
RID texture = RID_PRIME(storage->texture_create());
|
||||
storage->texture_allocate(texture, p_image->get_width(), p_image->get_height(), 0, p_image->get_format(), VS::TEXTURE_TYPE_2D, p_use_filter ? (uint32_t)VS::TEXTURE_FLAG_FILTER : 0);
|
||||
storage->texture_set_data(texture, p_image);
|
||||
|
||||
@ -535,6 +535,7 @@ RasterizerGLES2::RasterizerGLES2() {
|
||||
}
|
||||
|
||||
RasterizerGLES2::~RasterizerGLES2() {
|
||||
memdelete(storage);
|
||||
memdelete(scene);
|
||||
memdelete(canvas);
|
||||
memdelete(storage);
|
||||
}
|
||||
|
@ -3919,25 +3919,25 @@ void RasterizerSceneGLES2::initialize() {
|
||||
{
|
||||
//default material and shader
|
||||
|
||||
default_shader = storage->shader_create();
|
||||
default_shader = RID_PRIME(storage->shader_create());
|
||||
storage->shader_set_code(default_shader, "shader_type spatial;\n");
|
||||
default_material = storage->material_create();
|
||||
default_material = RID_PRIME(storage->material_create());
|
||||
storage->material_set_shader(default_material, default_shader);
|
||||
|
||||
default_shader_twosided = storage->shader_create();
|
||||
default_material_twosided = storage->material_create();
|
||||
default_shader_twosided = RID_PRIME(storage->shader_create());
|
||||
default_material_twosided = RID_PRIME(storage->material_create());
|
||||
storage->shader_set_code(default_shader_twosided, "shader_type spatial; render_mode cull_disabled;\n");
|
||||
storage->material_set_shader(default_material_twosided, default_shader_twosided);
|
||||
}
|
||||
|
||||
{
|
||||
default_worldcoord_shader = storage->shader_create();
|
||||
default_worldcoord_shader = RID_PRIME(storage->shader_create());
|
||||
storage->shader_set_code(default_worldcoord_shader, "shader_type spatial; render_mode world_vertex_coords;\n");
|
||||
default_worldcoord_material = storage->material_create();
|
||||
default_worldcoord_material = RID_PRIME(storage->material_create());
|
||||
storage->material_set_shader(default_worldcoord_material, default_worldcoord_shader);
|
||||
|
||||
default_worldcoord_shader_twosided = storage->shader_create();
|
||||
default_worldcoord_material_twosided = storage->material_create();
|
||||
default_worldcoord_shader_twosided = RID_PRIME(storage->shader_create());
|
||||
default_worldcoord_material_twosided = RID_PRIME(storage->material_create());
|
||||
storage->shader_set_code(default_worldcoord_shader_twosided, "shader_type spatial; render_mode cull_disabled,world_vertex_coords;\n");
|
||||
storage->material_set_shader(default_worldcoord_material_twosided, default_worldcoord_shader_twosided);
|
||||
}
|
||||
@ -3945,10 +3945,10 @@ void RasterizerSceneGLES2::initialize() {
|
||||
{
|
||||
//default material and shader
|
||||
|
||||
default_overdraw_shader = storage->shader_create();
|
||||
default_overdraw_shader = RID_PRIME(storage->shader_create());
|
||||
// Use relatively low opacity so that more "layers" of overlapping objects can be distinguished.
|
||||
storage->shader_set_code(default_overdraw_shader, "shader_type spatial;\nrender_mode blend_add,unshaded;\n void fragment() { ALBEDO=vec3(0.4,0.8,0.8); ALPHA=0.1; }");
|
||||
default_overdraw_material = storage->material_create();
|
||||
default_overdraw_material = RID_PRIME(storage->material_create());
|
||||
storage->material_set_shader(default_overdraw_material, default_overdraw_shader);
|
||||
}
|
||||
|
||||
|
@ -396,7 +396,7 @@ void RasterizerCanvasGLES3::_legacy_canvas_render_item(Item *p_ci, RenderItemSta
|
||||
}
|
||||
}
|
||||
|
||||
glBindBufferBase(GL_UNIFORM_BUFFER, 1, static_cast<LightInternal *>(light->light_internal.get_data())->ubo);
|
||||
glBindBufferBase(GL_UNIFORM_BUFFER, 1, static_cast<LightInternal *>(light_internal_owner.get(light->light_internal))->ubo);
|
||||
|
||||
if (has_shadow) {
|
||||
RasterizerStorageGLES3::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(light->shadow_buffer);
|
||||
@ -1500,7 +1500,7 @@ void RasterizerCanvasGLES3::render_joined_item(const BItemJoined &p_bij, RenderI
|
||||
}
|
||||
}
|
||||
|
||||
glBindBufferBase(GL_UNIFORM_BUFFER, 1, static_cast<LightInternal *>(light->light_internal.get_data())->ubo);
|
||||
glBindBufferBase(GL_UNIFORM_BUFFER, 1, static_cast<LightInternal *>(light_internal_owner.get(light->light_internal))->ubo);
|
||||
|
||||
if (has_shadow) {
|
||||
RasterizerStorageGLES3::CanvasLightShadow *cls = storage->canvas_light_shadow_owner.get(light->shadow_buffer);
|
||||
|
@ -291,7 +291,7 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
canvas->canvas_begin();
|
||||
|
||||
RID texture = storage->texture_create();
|
||||
RID texture = RID_PRIME(storage->texture_create());
|
||||
storage->texture_allocate(texture, p_image->get_width(), p_image->get_height(), 0, p_image->get_format(), VS::TEXTURE_TYPE_2D, p_use_filter ? (uint32_t)VS::TEXTURE_FLAG_FILTER : 0);
|
||||
storage->texture_set_data(texture, p_image);
|
||||
|
||||
@ -497,7 +497,7 @@ RasterizerGLES3::RasterizerGLES3() {
|
||||
}
|
||||
|
||||
RasterizerGLES3::~RasterizerGLES3() {
|
||||
memdelete(storage);
|
||||
memdelete(canvas);
|
||||
memdelete(scene);
|
||||
memdelete(canvas);
|
||||
memdelete(storage);
|
||||
}
|
||||
|
@ -4942,25 +4942,25 @@ void RasterizerSceneGLES3::initialize() {
|
||||
{
|
||||
//default material and shader
|
||||
|
||||
default_shader = storage->shader_create();
|
||||
default_shader = RID_PRIME(storage->shader_create());
|
||||
storage->shader_set_code(default_shader, "shader_type spatial;\n");
|
||||
default_material = storage->material_create();
|
||||
default_material = RID_PRIME(storage->material_create());
|
||||
storage->material_set_shader(default_material, default_shader);
|
||||
|
||||
default_shader_twosided = storage->shader_create();
|
||||
default_material_twosided = storage->material_create();
|
||||
default_shader_twosided = RID_PRIME(storage->shader_create());
|
||||
default_material_twosided = RID_PRIME(storage->material_create());
|
||||
storage->shader_set_code(default_shader_twosided, "shader_type spatial; render_mode cull_disabled;\n");
|
||||
storage->material_set_shader(default_material_twosided, default_shader_twosided);
|
||||
|
||||
//default for shaders using world coordinates (typical for triplanar)
|
||||
|
||||
default_worldcoord_shader = storage->shader_create();
|
||||
default_worldcoord_shader = RID_PRIME(storage->shader_create());
|
||||
storage->shader_set_code(default_worldcoord_shader, "shader_type spatial; render_mode world_vertex_coords;\n");
|
||||
default_worldcoord_material = storage->material_create();
|
||||
default_worldcoord_material = RID_PRIME(storage->material_create());
|
||||
storage->material_set_shader(default_worldcoord_material, default_worldcoord_shader);
|
||||
|
||||
default_worldcoord_shader_twosided = storage->shader_create();
|
||||
default_worldcoord_material_twosided = storage->material_create();
|
||||
default_worldcoord_shader_twosided = RID_PRIME(storage->shader_create());
|
||||
default_worldcoord_material_twosided = RID_PRIME(storage->material_create());
|
||||
storage->shader_set_code(default_worldcoord_shader_twosided, "shader_type spatial; render_mode cull_disabled,world_vertex_coords;\n");
|
||||
storage->material_set_shader(default_worldcoord_material_twosided, default_worldcoord_shader_twosided);
|
||||
}
|
||||
@ -4968,10 +4968,10 @@ void RasterizerSceneGLES3::initialize() {
|
||||
{
|
||||
//default material and shader
|
||||
|
||||
default_overdraw_shader = storage->shader_create();
|
||||
default_overdraw_shader = RID_PRIME(storage->shader_create());
|
||||
// Use relatively low opacity so that more "layers" of overlapping objects can be distinguished.
|
||||
storage->shader_set_code(default_overdraw_shader, "shader_type spatial;\nrender_mode blend_add,unshaded;\n void fragment() { ALBEDO=vec3(0.4,0.8,0.8); ALPHA=0.1; }");
|
||||
default_overdraw_material = storage->material_create();
|
||||
default_overdraw_material = RID_PRIME(storage->material_create());
|
||||
storage->material_set_shader(default_overdraw_material, default_overdraw_shader);
|
||||
}
|
||||
|
||||
@ -5282,18 +5282,18 @@ RasterizerSceneGLES3::RasterizerSceneGLES3() {
|
||||
}
|
||||
|
||||
RasterizerSceneGLES3::~RasterizerSceneGLES3() {
|
||||
memdelete(default_material.get_data());
|
||||
memdelete(default_material_twosided.get_data());
|
||||
memdelete(default_shader.get_data());
|
||||
memdelete(default_shader_twosided.get_data());
|
||||
memdelete(storage->material_owner.getptr(default_material));
|
||||
memdelete(storage->material_owner.getptr(default_material_twosided));
|
||||
memdelete(storage->shader_owner.getptr(default_shader));
|
||||
memdelete(storage->shader_owner.getptr(default_shader_twosided));
|
||||
|
||||
memdelete(default_worldcoord_material.get_data());
|
||||
memdelete(default_worldcoord_material_twosided.get_data());
|
||||
memdelete(default_worldcoord_shader.get_data());
|
||||
memdelete(default_worldcoord_shader_twosided.get_data());
|
||||
memdelete(storage->material_owner.getptr(default_worldcoord_material));
|
||||
memdelete(storage->material_owner.getptr(default_worldcoord_material_twosided));
|
||||
memdelete(storage->shader_owner.getptr(default_worldcoord_shader));
|
||||
memdelete(storage->shader_owner.getptr(default_worldcoord_shader_twosided));
|
||||
|
||||
memdelete(default_overdraw_material.get_data());
|
||||
memdelete(default_overdraw_shader.get_data());
|
||||
memdelete(storage->material_owner.getptr(default_overdraw_material));
|
||||
memdelete(storage->shader_owner.getptr(default_overdraw_shader));
|
||||
|
||||
memfree(state.spot_array_tmp);
|
||||
memfree(state.omni_array_tmp);
|
||||
|
@ -62,9 +62,9 @@ Array EditorInterface::_make_mesh_previews(const Array &p_meshes, int p_preview_
|
||||
Vector<Ref<Texture>> EditorInterface::make_mesh_previews(const Vector<Ref<Mesh>> &p_meshes, Vector<Transform> *p_transforms, int p_preview_size) {
|
||||
int size = p_preview_size;
|
||||
|
||||
RID scenario = VS::get_singleton()->scenario_create();
|
||||
RID scenario = RID_PRIME(VS::get_singleton()->scenario_create());
|
||||
|
||||
RID viewport = VS::get_singleton()->viewport_create();
|
||||
RID viewport = RID_PRIME(VS::get_singleton()->viewport_create());
|
||||
VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_ALWAYS);
|
||||
VS::get_singleton()->viewport_set_vflip(viewport, true);
|
||||
VS::get_singleton()->viewport_set_scenario(viewport, scenario);
|
||||
@ -73,10 +73,10 @@ Vector<Ref<Texture>> EditorInterface::make_mesh_previews(const Vector<Ref<Mesh>>
|
||||
VS::get_singleton()->viewport_set_active(viewport, true);
|
||||
RID viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
|
||||
|
||||
RID camera = VS::get_singleton()->camera_create();
|
||||
RID camera = RID_PRIME(VS::get_singleton()->camera_create());
|
||||
VS::get_singleton()->viewport_attach_camera(viewport, camera);
|
||||
|
||||
RID light = VS::get_singleton()->directional_light_create();
|
||||
RID light = RID_PRIME(VS::get_singleton()->directional_light_create());
|
||||
RID light_instance = VS::get_singleton()->instance_create2(light, scenario);
|
||||
|
||||
RID light2 = VS::get_singleton()->directional_light_create();
|
||||
|
@ -1273,7 +1273,7 @@ void AnimationPlayerEditor::_allocate_onion_layers() {
|
||||
bool is_present = onion.differences_only && i == captures - 1;
|
||||
|
||||
// Each capture is a viewport with a canvas item attached that renders a full-size rect with the contents of the main viewport.
|
||||
onion.captures.write[i] = VS::get_singleton()->viewport_create();
|
||||
onion.captures.write[i] = RID_PRIME(VS::get_singleton()->viewport_create());
|
||||
VS::get_singleton()->viewport_set_usage(onion.captures[i], VS::VIEWPORT_USAGE_2D);
|
||||
VS::get_singleton()->viewport_set_size(onion.captures[i], capture_size.width, capture_size.height);
|
||||
VS::get_singleton()->viewport_set_update_mode(onion.captures[i], VS::VIEWPORT_UPDATE_ALWAYS);
|
||||
@ -1737,8 +1737,8 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
|
||||
onion.last_frame = 0;
|
||||
onion.can_overlay = false;
|
||||
onion.capture_size = Size2();
|
||||
onion.capture.canvas = VS::get_singleton()->canvas_create();
|
||||
onion.capture.canvas_item = VS::get_singleton()->canvas_item_create();
|
||||
onion.capture.canvas = RID_PRIME(VS::get_singleton()->canvas_create());
|
||||
onion.capture.canvas_item = RID_PRIME(VS::get_singleton()->canvas_item_create());
|
||||
VS::get_singleton()->canvas_item_set_parent(onion.capture.canvas_item, onion.capture.canvas);
|
||||
|
||||
onion.capture.material = Ref<ShaderMaterial>(memnew(ShaderMaterial));
|
||||
|
@ -352,9 +352,9 @@ Ref<Texture> EditorMaterialPreviewPlugin::generate(const RES &p_from, const Size
|
||||
}
|
||||
|
||||
EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
|
||||
scenario = VS::get_singleton()->scenario_create();
|
||||
scenario = RID_PRIME(VS::get_singleton()->scenario_create());
|
||||
|
||||
viewport = VS::get_singleton()->viewport_create();
|
||||
viewport = RID_PRIME(VS::get_singleton()->viewport_create());
|
||||
VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED);
|
||||
VS::get_singleton()->viewport_set_scenario(viewport, scenario);
|
||||
VS::get_singleton()->viewport_set_size(viewport, 128, 128);
|
||||
@ -363,16 +363,16 @@ EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
|
||||
VS::get_singleton()->viewport_set_vflip(viewport, true);
|
||||
viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
|
||||
|
||||
camera = VS::get_singleton()->camera_create();
|
||||
camera = RID_PRIME(VS::get_singleton()->camera_create());
|
||||
VS::get_singleton()->viewport_attach_camera(viewport, camera);
|
||||
VS::get_singleton()->camera_set_transform(camera, Transform(Basis(), Vector3(0, 0, 3)));
|
||||
VS::get_singleton()->camera_set_perspective(camera, 45, 0.1, 10);
|
||||
|
||||
light = VS::get_singleton()->directional_light_create();
|
||||
light = RID_PRIME(VS::get_singleton()->directional_light_create());
|
||||
light_instance = VS::get_singleton()->instance_create2(light, scenario);
|
||||
VS::get_singleton()->instance_set_transform(light_instance, Transform().looking_at(Vector3(-1, -1, -1), Vector3(0, 1, 0)));
|
||||
|
||||
light2 = VS::get_singleton()->directional_light_create();
|
||||
light2 = RID_PRIME(VS::get_singleton()->directional_light_create());
|
||||
VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
|
||||
//VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
|
||||
|
||||
@ -380,7 +380,7 @@ EditorMaterialPreviewPlugin::EditorMaterialPreviewPlugin() {
|
||||
|
||||
VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
|
||||
|
||||
sphere = VS::get_singleton()->mesh_create();
|
||||
sphere = RID_PRIME(VS::get_singleton()->mesh_create());
|
||||
sphere_instance = VS::get_singleton()->instance_create2(sphere, scenario);
|
||||
|
||||
int lats = 32;
|
||||
@ -779,9 +779,9 @@ Ref<Texture> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p
|
||||
}
|
||||
|
||||
EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() {
|
||||
scenario = VS::get_singleton()->scenario_create();
|
||||
scenario = RID_PRIME(VS::get_singleton()->scenario_create());
|
||||
|
||||
viewport = VS::get_singleton()->viewport_create();
|
||||
viewport = RID_PRIME(VS::get_singleton()->viewport_create());
|
||||
VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED);
|
||||
VS::get_singleton()->viewport_set_vflip(viewport, true);
|
||||
VS::get_singleton()->viewport_set_scenario(viewport, scenario);
|
||||
@ -807,8 +807,8 @@ EditorMeshPreviewPlugin::EditorMeshPreviewPlugin() {
|
||||
|
||||
VS::get_singleton()->instance_set_transform(light_instance2, Transform().looking_at(Vector3(0, 1, 0), Vector3(0, 0, 1)));
|
||||
|
||||
//sphere = VS::get_singleton()->mesh_create();
|
||||
mesh_instance = VS::get_singleton()->instance_create();
|
||||
//sphere = RID_PRIME(VS::get_singleton()->mesh_create());
|
||||
mesh_instance = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_scenario(mesh_instance, scenario);
|
||||
}
|
||||
|
||||
@ -910,15 +910,15 @@ Ref<Texture> EditorFontPreviewPlugin::generate(const RES &p_from, const Size2 &p
|
||||
}
|
||||
|
||||
EditorFontPreviewPlugin::EditorFontPreviewPlugin() {
|
||||
viewport = VS::get_singleton()->viewport_create();
|
||||
viewport = RID_PRIME(VS::get_singleton()->viewport_create());
|
||||
VS::get_singleton()->viewport_set_update_mode(viewport, VS::VIEWPORT_UPDATE_DISABLED);
|
||||
VS::get_singleton()->viewport_set_vflip(viewport, true);
|
||||
VS::get_singleton()->viewport_set_size(viewport, 128, 128);
|
||||
VS::get_singleton()->viewport_set_active(viewport, true);
|
||||
viewport_texture = VS::get_singleton()->viewport_get_texture(viewport);
|
||||
|
||||
canvas = VS::get_singleton()->canvas_create();
|
||||
canvas_item = VS::get_singleton()->canvas_item_create();
|
||||
canvas = RID_PRIME(VS::get_singleton()->canvas_create());
|
||||
canvas_item = RID_PRIME(VS::get_singleton()->canvas_item_create());
|
||||
|
||||
VS::get_singleton()->viewport_attach_canvas(viewport, canvas);
|
||||
VS::get_singleton()->canvas_item_set_parent(canvas_item, canvas);
|
||||
|
@ -3139,7 +3139,7 @@ void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
uint32_t layer = 1 << (GIZMO_BASE_LAYER + p_idx);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
move_gizmo_instance[i] = VS::get_singleton()->instance_create();
|
||||
move_gizmo_instance[i] = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_base(move_gizmo_instance[i], spatial_editor->get_move_gizmo(i)->get_rid());
|
||||
VS::get_singleton()->instance_set_scenario(move_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
|
||||
VS::get_singleton()->instance_set_visible(move_gizmo_instance[i], false);
|
||||
@ -3147,7 +3147,7 @@ void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
VS::get_singleton()->instance_set_layer_mask(move_gizmo_instance[i], layer);
|
||||
VS::get_singleton()->instance_set_portal_mode(move_gizmo_instance[i], VisualServer::INSTANCE_PORTAL_MODE_GLOBAL);
|
||||
|
||||
move_plane_gizmo_instance[i] = VS::get_singleton()->instance_create();
|
||||
move_plane_gizmo_instance[i] = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_base(move_plane_gizmo_instance[i], spatial_editor->get_move_plane_gizmo(i)->get_rid());
|
||||
VS::get_singleton()->instance_set_scenario(move_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
|
||||
VS::get_singleton()->instance_set_visible(move_plane_gizmo_instance[i], false);
|
||||
@ -3155,7 +3155,7 @@ void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
VS::get_singleton()->instance_set_layer_mask(move_plane_gizmo_instance[i], layer);
|
||||
VS::get_singleton()->instance_set_portal_mode(move_plane_gizmo_instance[i], VisualServer::INSTANCE_PORTAL_MODE_GLOBAL);
|
||||
|
||||
rotate_gizmo_instance[i] = VS::get_singleton()->instance_create();
|
||||
rotate_gizmo_instance[i] = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_base(rotate_gizmo_instance[i], spatial_editor->get_rotate_gizmo(i)->get_rid());
|
||||
VS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
|
||||
VS::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false);
|
||||
@ -3163,7 +3163,7 @@ void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
VS::get_singleton()->instance_set_layer_mask(rotate_gizmo_instance[i], layer);
|
||||
VS::get_singleton()->instance_set_portal_mode(rotate_gizmo_instance[i], VisualServer::INSTANCE_PORTAL_MODE_GLOBAL);
|
||||
|
||||
scale_gizmo_instance[i] = VS::get_singleton()->instance_create();
|
||||
scale_gizmo_instance[i] = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_base(scale_gizmo_instance[i], spatial_editor->get_scale_gizmo(i)->get_rid());
|
||||
VS::get_singleton()->instance_set_scenario(scale_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
|
||||
VS::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false);
|
||||
@ -3171,7 +3171,7 @@ void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
VS::get_singleton()->instance_set_layer_mask(scale_gizmo_instance[i], layer);
|
||||
VS::get_singleton()->instance_set_portal_mode(scale_gizmo_instance[i], VisualServer::INSTANCE_PORTAL_MODE_GLOBAL);
|
||||
|
||||
scale_plane_gizmo_instance[i] = VS::get_singleton()->instance_create();
|
||||
scale_plane_gizmo_instance[i] = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_base(scale_plane_gizmo_instance[i], spatial_editor->get_scale_plane_gizmo(i)->get_rid());
|
||||
VS::get_singleton()->instance_set_scenario(scale_plane_gizmo_instance[i], get_tree()->get_root()->get_world()->get_scenario());
|
||||
VS::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false);
|
||||
@ -3181,7 +3181,7 @@ void SpatialEditorViewport::_init_gizmo_instance(int p_idx) {
|
||||
}
|
||||
|
||||
// Rotation white outline
|
||||
rotate_gizmo_instance[3] = VS::get_singleton()->instance_create();
|
||||
rotate_gizmo_instance[3] = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_base(rotate_gizmo_instance[3], spatial_editor->get_rotate_gizmo(3)->get_rid());
|
||||
VS::get_singleton()->instance_set_scenario(rotate_gizmo_instance[3], get_tree()->get_root()->get_world()->get_scenario());
|
||||
VS::get_singleton()->instance_set_visible(rotate_gizmo_instance[3], false);
|
||||
@ -5274,7 +5274,7 @@ void SpatialEditor::_init_indicators() {
|
||||
|
||||
_init_grid();
|
||||
|
||||
origin = VisualServer::get_singleton()->mesh_create();
|
||||
origin = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
Array d;
|
||||
d.resize(VS::ARRAY_MAX);
|
||||
d[VisualServer::ARRAY_VERTEX] = origin_points;
|
||||
@ -5837,7 +5837,7 @@ void SpatialEditor::_init_grid() {
|
||||
}
|
||||
|
||||
// Create a mesh from the pushed vector points and colors.
|
||||
grid[c] = VisualServer::get_singleton()->mesh_create();
|
||||
grid[c] = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
Array d;
|
||||
d.resize(VS::ARRAY_MAX);
|
||||
d[VisualServer::ARRAY_VERTEX] = grid_points[c];
|
||||
|
@ -2343,6 +2343,10 @@ void Main::cleanup(bool p_force) {
|
||||
ERR_FAIL_COND(!_start_success);
|
||||
}
|
||||
|
||||
#ifdef RID_HANDLES_ENABLED
|
||||
g_rid_database.preshutdown();
|
||||
#endif
|
||||
|
||||
if (script_debugger) {
|
||||
// Flush any remaining messages
|
||||
script_debugger->idle_poll();
|
||||
@ -2451,4 +2455,8 @@ void Main::cleanup(bool p_force) {
|
||||
unregister_core_types();
|
||||
|
||||
OS::get_singleton()->finalize_core();
|
||||
|
||||
#ifdef RID_HANDLES_ENABLED
|
||||
g_rid_database.shutdown();
|
||||
#endif
|
||||
}
|
||||
|
@ -85,7 +85,7 @@ protected:
|
||||
PhysicsServer *ps = PhysicsServer::get_singleton();
|
||||
|
||||
RID mesh_instance = vs->instance_create2(type_mesh_map[p_shape], scenario);
|
||||
RID body = ps->body_create(p_body, !p_active_default);
|
||||
RID body = RID_PRIME(ps->body_create(p_body, !p_active_default));
|
||||
ps->body_set_space(body, space);
|
||||
ps->body_set_param(body, PhysicsServer::BODY_PARAM_BOUNCE, 0.0);
|
||||
//todo set space
|
||||
@ -107,7 +107,7 @@ protected:
|
||||
RID plane_shape = ps->shape_create(PhysicsServer::SHAPE_PLANE);
|
||||
ps->shape_set_data(plane_shape, p_plane);
|
||||
|
||||
RID b = ps->body_create(PhysicsServer::BODY_MODE_STATIC);
|
||||
RID b = RID_PRIME(ps->body_create(PhysicsServer::BODY_MODE_STATIC));
|
||||
ps->body_set_space(b, space);
|
||||
//todo set space
|
||||
ps->body_add_shape(b, plane_shape);
|
||||
@ -136,7 +136,7 @@ protected:
|
||||
/* BOX SHAPE */
|
||||
|
||||
PoolVector<Plane> box_planes = Geometry::build_box_planes(Vector3(0.5, 0.5, 0.5));
|
||||
RID box_mesh = vs->mesh_create();
|
||||
RID box_mesh = RID_PRIME(vs->mesh_create());
|
||||
Geometry::MeshData box_data = Geometry::build_convex_mesh(box_planes);
|
||||
vs->mesh_add_surface_from_mesh_data(box_mesh, box_data);
|
||||
type_mesh_map[PhysicsServer::SHAPE_BOX] = box_mesh;
|
||||
@ -149,7 +149,7 @@ protected:
|
||||
|
||||
PoolVector<Plane> capsule_planes = Geometry::build_capsule_planes(0.5, 0.7, 12, Vector3::AXIS_Z);
|
||||
|
||||
RID capsule_mesh = vs->mesh_create();
|
||||
RID capsule_mesh = RID_PRIME(vs->mesh_create());
|
||||
Geometry::MeshData capsule_data = Geometry::build_convex_mesh(capsule_planes);
|
||||
vs->mesh_add_surface_from_mesh_data(capsule_mesh, capsule_data);
|
||||
|
||||
@ -166,7 +166,7 @@ protected:
|
||||
|
||||
PoolVector<Plane> convex_planes = Geometry::build_cylinder_planes(0.5, 0.7, 5, Vector3::AXIS_Z);
|
||||
|
||||
RID convex_mesh = vs->mesh_create();
|
||||
RID convex_mesh = RID_PRIME(vs->mesh_create());
|
||||
Geometry::MeshData convex_data = Geometry::build_convex_mesh(convex_planes);
|
||||
ConvexHullComputer::convex_hull(convex_data.vertices, convex_data);
|
||||
vs->mesh_add_surface_from_mesh_data(convex_mesh, convex_data);
|
||||
@ -192,7 +192,7 @@ protected:
|
||||
normals.push_back(p.normal);
|
||||
}
|
||||
|
||||
RID trimesh_mesh = vs->mesh_create();
|
||||
RID trimesh_mesh = RID_PRIME(vs->mesh_create());
|
||||
Array d;
|
||||
d.resize(VS::ARRAY_MAX);
|
||||
d[VS::ARRAY_VERTEX] = p_faces;
|
||||
@ -201,7 +201,7 @@ protected:
|
||||
|
||||
RID triins = vs->instance_create2(trimesh_mesh, scenario);
|
||||
|
||||
RID tribody = ps->body_create(PhysicsServer::BODY_MODE_STATIC);
|
||||
RID tribody = RID_PRIME(ps->body_create(PhysicsServer::BODY_MODE_STATIC));
|
||||
ps->body_set_space(tribody, space);
|
||||
//todo set space
|
||||
ps->body_add_shape(tribody, trimesh_shape);
|
||||
@ -273,14 +273,14 @@ public:
|
||||
init_shapes();
|
||||
|
||||
PhysicsServer *ps = PhysicsServer::get_singleton();
|
||||
space = ps->space_create();
|
||||
space = RID_PRIME(ps->space_create());
|
||||
ps->space_set_active(space, true);
|
||||
|
||||
VisualServer *vs = VisualServer::get_singleton();
|
||||
|
||||
/* LIGHT */
|
||||
RID lightaux = vs->directional_light_create();
|
||||
scenario = vs->scenario_create();
|
||||
RID lightaux = RID_PRIME(vs->directional_light_create());
|
||||
scenario = RID_PRIME(vs->scenario_create());
|
||||
vs->light_set_shadow(lightaux, true);
|
||||
light = vs->instance_create2(lightaux, scenario);
|
||||
Transform t;
|
||||
@ -289,9 +289,9 @@ public:
|
||||
|
||||
/* CAMERA */
|
||||
|
||||
camera = vs->camera_create();
|
||||
camera = RID_PRIME(vs->camera_create());
|
||||
|
||||
RID viewport = vs->viewport_create();
|
||||
RID viewport = RID_PRIME(vs->viewport_create());
|
||||
Size2i screen_size = OS::get_singleton()->get_window_size();
|
||||
vs->viewport_set_size(viewport, screen_size.x, screen_size.y);
|
||||
vs->viewport_attach_to_screen(viewport, Rect2(Vector2(), screen_size));
|
||||
@ -342,7 +342,7 @@ public:
|
||||
|
||||
PoolVector<Plane> capsule_planes = Geometry::build_capsule_planes(0.5, 1, 12, 5, Vector3::AXIS_Y);
|
||||
|
||||
RID capsule_mesh = vs->mesh_create();
|
||||
RID capsule_mesh = RID_PRIME(vs->mesh_create());
|
||||
Geometry::MeshData capsule_data = Geometry::build_convex_mesh(capsule_planes);
|
||||
vs->mesh_add_surface_from_mesh_data(capsule_mesh, capsule_data);
|
||||
type_mesh_map[PhysicsServer::SHAPE_CAPSULE] = capsule_mesh;
|
||||
@ -357,7 +357,7 @@ public:
|
||||
ps->shape_set_data(capsule_shape, capsule_params);
|
||||
|
||||
RID mesh_instance = vs->instance_create2(capsule_mesh, scenario);
|
||||
character = ps->body_create(PhysicsServer::BODY_MODE_CHARACTER);
|
||||
character = RID_PRIME(ps->body_create(PhysicsServer::BODY_MODE_CHARACTER));
|
||||
ps->body_set_space(character, space);
|
||||
//todo add space
|
||||
ps->body_add_shape(character, capsule_shape);
|
||||
|
@ -80,7 +80,7 @@ class TestPhysics2DMainLoop : public MainLoop {
|
||||
|
||||
Ref<Image> image = memnew(Image(32, 2, 0, Image::FORMAT_LA8, pixels));
|
||||
|
||||
body_shape_data[Physics2DServer::SHAPE_SEGMENT].image = vs->texture_create_from_image(image);
|
||||
body_shape_data[Physics2DServer::SHAPE_SEGMENT].image = RID_PRIME(vs->texture_create_from_image(image));
|
||||
|
||||
RID segment_shape = ps->segment_shape_create();
|
||||
Rect2 sg(Point2(-16, 0), Point2(16, 0));
|
||||
@ -104,7 +104,7 @@ class TestPhysics2DMainLoop : public MainLoop {
|
||||
|
||||
Ref<Image> image = memnew(Image(32, 32, 0, Image::FORMAT_LA8, pixels));
|
||||
|
||||
body_shape_data[Physics2DServer::SHAPE_CIRCLE].image = vs->texture_create_from_image(image);
|
||||
body_shape_data[Physics2DServer::SHAPE_CIRCLE].image = RID_PRIME(vs->texture_create_from_image(image));
|
||||
|
||||
RID circle_shape = ps->circle_shape_create();
|
||||
ps->shape_set_data(circle_shape, 16);
|
||||
@ -128,7 +128,7 @@ class TestPhysics2DMainLoop : public MainLoop {
|
||||
|
||||
Ref<Image> image = memnew(Image(32, 32, 0, Image::FORMAT_LA8, pixels));
|
||||
|
||||
body_shape_data[Physics2DServer::SHAPE_RECTANGLE].image = vs->texture_create_from_image(image);
|
||||
body_shape_data[Physics2DServer::SHAPE_RECTANGLE].image = RID_PRIME(vs->texture_create_from_image(image));
|
||||
|
||||
RID rectangle_shape = ps->rectangle_shape_create();
|
||||
ps->shape_set_data(rectangle_shape, Vector2(16, 16));
|
||||
@ -153,7 +153,7 @@ class TestPhysics2DMainLoop : public MainLoop {
|
||||
|
||||
Ref<Image> image = memnew(Image(32, 64, 0, Image::FORMAT_LA8, pixels));
|
||||
|
||||
body_shape_data[Physics2DServer::SHAPE_CAPSULE].image = vs->texture_create_from_image(image);
|
||||
body_shape_data[Physics2DServer::SHAPE_CAPSULE].image = RID_PRIME(vs->texture_create_from_image(image));
|
||||
|
||||
RID capsule_shape = ps->capsule_shape_create();
|
||||
ps->shape_set_data(capsule_shape, Vector2(16, 32));
|
||||
@ -166,7 +166,7 @@ class TestPhysics2DMainLoop : public MainLoop {
|
||||
{
|
||||
Ref<Image> image = memnew(Image(convex_png));
|
||||
|
||||
body_shape_data[Physics2DServer::SHAPE_CONVEX_POLYGON].image = vs->texture_create_from_image(image);
|
||||
body_shape_data[Physics2DServer::SHAPE_CONVEX_POLYGON].image = RID_PRIME(vs->texture_create_from_image(image));
|
||||
|
||||
RID convex_polygon_shape = ps->convex_polygon_shape_create();
|
||||
|
||||
@ -229,14 +229,14 @@ protected:
|
||||
VisualServer *vs = VisualServer::get_singleton();
|
||||
Physics2DServer *ps = Physics2DServer::get_singleton();
|
||||
|
||||
RID body = ps->body_create();
|
||||
RID body = RID_PRIME(ps->body_create());
|
||||
ps->body_add_shape(body, body_shape_data[p_shape].shape);
|
||||
ps->body_set_space(body, space);
|
||||
ps->body_set_continuous_collision_detection_mode(body, Physics2DServer::CCD_MODE_CAST_SHAPE);
|
||||
ps->body_set_state(body, Physics2DServer::BODY_STATE_TRANSFORM, p_xform);
|
||||
|
||||
//print_line("add body with xform: "+p_xform);
|
||||
RID sprite = vs->canvas_item_create();
|
||||
RID sprite = RID_PRIME(vs->canvas_item_create());
|
||||
vs->canvas_item_set_parent(sprite, canvas);
|
||||
vs->canvas_item_set_transform(sprite, p_xform);
|
||||
Size2 imgsize(vs->texture_get_width(body_shape_data[p_shape].image), vs->texture_get_height(body_shape_data[p_shape].image));
|
||||
@ -259,7 +259,7 @@ protected:
|
||||
RID plane = ps->line_shape_create();
|
||||
ps->shape_set_data(plane, arr);
|
||||
|
||||
RID plane_body = ps->body_create();
|
||||
RID plane_body = RID_PRIME(ps->body_create());
|
||||
ps->body_set_mode(plane_body, Physics2DServer::BODY_MODE_STATIC);
|
||||
ps->body_set_space(plane_body, space);
|
||||
ps->body_add_shape(plane_body, plane);
|
||||
@ -271,13 +271,13 @@ protected:
|
||||
|
||||
RID concave = ps->concave_polygon_shape_create();
|
||||
ps->shape_set_data(concave, p_points);
|
||||
RID body = ps->body_create();
|
||||
RID body = RID_PRIME(ps->body_create());
|
||||
ps->body_set_mode(body, Physics2DServer::BODY_MODE_STATIC);
|
||||
ps->body_set_space(body, space);
|
||||
ps->body_add_shape(body, concave);
|
||||
ps->body_set_state(body, Physics2DServer::BODY_STATE_TRANSFORM, p_xform);
|
||||
|
||||
RID sprite = vs->canvas_item_create();
|
||||
RID sprite = RID_PRIME(vs->canvas_item_create());
|
||||
vs->canvas_item_set_parent(sprite, canvas);
|
||||
vs->canvas_item_set_transform(sprite, p_xform);
|
||||
for (int i = 0; i < p_points.size(); i += 2) {
|
||||
@ -318,15 +318,15 @@ public:
|
||||
VisualServer *vs = VisualServer::get_singleton();
|
||||
Physics2DServer *ps = Physics2DServer::get_singleton();
|
||||
|
||||
space = ps->space_create();
|
||||
space = RID_PRIME(ps->space_create());
|
||||
ps->space_set_active(space, true);
|
||||
ps->set_active(true);
|
||||
ps->area_set_param(space, Physics2DServer::AREA_PARAM_GRAVITY_VECTOR, Vector2(0, 1));
|
||||
ps->area_set_param(space, Physics2DServer::AREA_PARAM_GRAVITY, 98);
|
||||
|
||||
{
|
||||
RID vp = vs->viewport_create();
|
||||
canvas = vs->canvas_create();
|
||||
RID vp = RID_PRIME(vs->viewport_create());
|
||||
canvas = RID_PRIME(vs->canvas_create());
|
||||
|
||||
Size2i screen_size = OS::get_singleton()->get_window_size();
|
||||
vs->viewport_attach_canvas(vp, canvas);
|
||||
@ -342,7 +342,7 @@ public:
|
||||
vs->viewport_set_canvas_transform(vp, canvas, view_xform);
|
||||
}
|
||||
|
||||
ray = vs->canvas_item_create();
|
||||
ray = RID_PRIME(vs->canvas_item_create());
|
||||
vs->canvas_item_set_parent(ray, canvas);
|
||||
//ray_query = ps->query_create(this,"_ray_query_callback",Variant());
|
||||
//ps->query_intersection(ray_query,space);
|
||||
|
@ -73,7 +73,7 @@ public:
|
||||
print_line("INITIALIZING TEST RENDER");
|
||||
VisualServer *vs = VisualServer::get_singleton();
|
||||
test_cube = vs->get_test_cube();
|
||||
scenario = vs->scenario_create();
|
||||
scenario = RID_PRIME(vs->scenario_create());
|
||||
|
||||
Vector<Vector3> vts;
|
||||
|
||||
@ -120,7 +120,7 @@ public:
|
||||
Geometry::MeshData md;
|
||||
Error err = ConvexHullComputer::convex_hull(vts, md);
|
||||
print_line("ERR: " + itos(err));
|
||||
test_cube = vs->mesh_create();
|
||||
test_cube = RID_PRIME(vs->mesh_create());
|
||||
vs->mesh_add_surface_from_mesh_data(test_cube, md);
|
||||
//vs->scenario_set_debug(scenario,VS::SCENARIO_DEBUG_WIREFRAME);
|
||||
|
||||
@ -154,11 +154,11 @@ public:
|
||||
instances.push_back(ii);
|
||||
}
|
||||
|
||||
camera = vs->camera_create();
|
||||
camera = RID_PRIME(vs->camera_create());
|
||||
|
||||
// vs->camera_set_perspective( camera, 60.0,0.1, 100.0 );
|
||||
|
||||
viewport = vs->viewport_create();
|
||||
viewport = RID_PRIME(vs->viewport_create());
|
||||
Size2i screen_size = OS::get_singleton()->get_window_size();
|
||||
vs->viewport_set_size(viewport, screen_size.x, screen_size.y);
|
||||
vs->viewport_attach_to_screen(viewport, Rect2(Vector2(), screen_size));
|
||||
|
@ -43,7 +43,7 @@ void CSGShape::set_use_collision(bool p_enable) {
|
||||
|
||||
if (use_collision) {
|
||||
root_collision_shape.instance();
|
||||
root_collision_instance = PhysicsServer::get_singleton()->body_create(PhysicsServer::BODY_MODE_STATIC);
|
||||
root_collision_instance = RID_PRIME(PhysicsServer::get_singleton()->body_create(PhysicsServer::BODY_MODE_STATIC));
|
||||
PhysicsServer::get_singleton()->body_set_state(root_collision_instance, PhysicsServer::BODY_STATE_TRANSFORM, get_global_transform());
|
||||
PhysicsServer::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid());
|
||||
PhysicsServer::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space());
|
||||
@ -501,7 +501,7 @@ void CSGShape::_notification(int p_what) {
|
||||
|
||||
if (use_collision && is_root_shape()) {
|
||||
root_collision_shape.instance();
|
||||
root_collision_instance = PhysicsServer::get_singleton()->body_create(PhysicsServer::BODY_MODE_STATIC);
|
||||
root_collision_instance = RID_PRIME(PhysicsServer::get_singleton()->body_create(PhysicsServer::BODY_MODE_STATIC));
|
||||
PhysicsServer::get_singleton()->body_set_state(root_collision_instance, PhysicsServer::BODY_STATE_TRANSFORM, get_global_transform());
|
||||
PhysicsServer::get_singleton()->body_add_shape(root_collision_instance, root_collision_shape->get_rid());
|
||||
PhysicsServer::get_singleton()->body_set_space(root_collision_instance, get_world()->get_space());
|
||||
|
@ -70,7 +70,7 @@ bool GridMap::_set(const StringName &p_name, const Variant &p_value) {
|
||||
BakedMesh bm;
|
||||
bm.mesh = meshes[i];
|
||||
ERR_CONTINUE(!bm.mesh.is_valid());
|
||||
bm.instance = VS::get_singleton()->instance_create();
|
||||
bm.instance = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid());
|
||||
VS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id());
|
||||
if (is_inside_tree()) {
|
||||
@ -295,15 +295,15 @@ void GridMap::set_cell_item(int p_x, int p_y, int p_z, int p_item, int p_rot) {
|
||||
//create octant because it does not exist
|
||||
Octant *g = memnew(Octant);
|
||||
g->dirty = true;
|
||||
g->static_body = PhysicsServer::get_singleton()->body_create(PhysicsServer::BODY_MODE_STATIC);
|
||||
g->static_body = RID_PRIME(PhysicsServer::get_singleton()->body_create(PhysicsServer::BODY_MODE_STATIC));
|
||||
PhysicsServer::get_singleton()->body_attach_object_instance_id(g->static_body, get_instance_id());
|
||||
PhysicsServer::get_singleton()->body_set_collision_layer(g->static_body, collision_layer);
|
||||
PhysicsServer::get_singleton()->body_set_collision_mask(g->static_body, collision_mask);
|
||||
SceneTree *st = SceneTree::get_singleton();
|
||||
|
||||
if (st && st->is_debugging_collisions_hint()) {
|
||||
g->collision_debug = VisualServer::get_singleton()->mesh_create();
|
||||
g->collision_debug_instance = VisualServer::get_singleton()->instance_create();
|
||||
g->collision_debug = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
g->collision_debug_instance = RID_PRIME(VisualServer::get_singleton()->instance_create());
|
||||
VisualServer::get_singleton()->instance_set_base(g->collision_debug_instance, g->collision_debug);
|
||||
}
|
||||
|
||||
@ -499,7 +499,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
|
||||
for (Map<int, List<Pair<Transform, IndexKey>>>::Element *E = multimesh_items.front(); E; E = E->next()) {
|
||||
Octant::MultimeshInstance mmi;
|
||||
|
||||
RID mm = VS::get_singleton()->multimesh_create();
|
||||
RID mm = RID_PRIME(VS::get_singleton()->multimesh_create());
|
||||
VS::get_singleton()->multimesh_allocate(mm, E->get().size(), VS::MULTIMESH_TRANSFORM_3D, VS::MULTIMESH_COLOR_NONE);
|
||||
VS::get_singleton()->multimesh_set_mesh(mm, mesh_library->get_item_mesh(E->key())->get_rid());
|
||||
|
||||
@ -518,7 +518,7 @@ bool GridMap::_octant_update(const OctantKey &p_key) {
|
||||
idx++;
|
||||
}
|
||||
|
||||
RID instance = VS::get_singleton()->instance_create();
|
||||
RID instance = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_base(instance, mm);
|
||||
|
||||
if (is_inside_tree()) {
|
||||
@ -1024,7 +1024,7 @@ void GridMap::make_baked_meshes(bool p_gen_lightmap_uv, float p_lightmap_uv_texe
|
||||
|
||||
BakedMesh bm;
|
||||
bm.mesh = mesh;
|
||||
bm.instance = VS::get_singleton()->instance_create();
|
||||
bm.instance = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid());
|
||||
VS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id());
|
||||
if (is_inside_tree()) {
|
||||
|
@ -1033,7 +1033,7 @@ void GridMapEditor::_notification(int p_what) {
|
||||
get_tree()->connect("node_removed", this, "_node_removed");
|
||||
mesh_library_palette->connect("item_selected", this, "_item_selected_cbk");
|
||||
for (int i = 0; i < 3; i++) {
|
||||
grid[i] = VS::get_singleton()->mesh_create();
|
||||
grid[i] = RID_PRIME(VS::get_singleton()->mesh_create());
|
||||
grid_instance[i] = VS::get_singleton()->instance_create2(grid[i], get_tree()->get_root()->get_world()->get_scenario());
|
||||
VS::get_singleton()->instance_set_layer_mask(grid_instance[i], 1 << SpatialEditorViewport::MISC_TOOL_LAYER);
|
||||
selection_level_instance[i] = VisualServer::get_singleton()->instance_create2(selection_level_mesh[i], get_tree()->get_root()->get_world()->get_scenario());
|
||||
@ -1327,8 +1327,8 @@ GridMapEditor::GridMapEditor(EditorNode *p_editor) {
|
||||
lock_view = false;
|
||||
cursor_rot = 0;
|
||||
|
||||
selection_mesh = VisualServer::get_singleton()->mesh_create();
|
||||
paste_mesh = VisualServer::get_singleton()->mesh_create();
|
||||
selection_mesh = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
paste_mesh = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
|
||||
{
|
||||
// Selection mesh create.
|
||||
@ -1438,7 +1438,7 @@ GridMapEditor::GridMapEditor(EditorNode *p_editor) {
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
d[VS::ARRAY_VERTEX] = square[i];
|
||||
selection_level_mesh[i] = VS::get_singleton()->mesh_create();
|
||||
selection_level_mesh[i] = RID_PRIME(VS::get_singleton()->mesh_create());
|
||||
VisualServer::get_singleton()->mesh_add_surface_from_arrays(selection_level_mesh[i], VS::PRIMITIVE_LINES, d);
|
||||
VisualServer::get_singleton()->mesh_surface_set_material(selection_level_mesh[i], 0, selection_floor_mat->get_rid());
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ NoiseTexture::NoiseTexture() {
|
||||
|
||||
noise = Ref<OpenSimplexNoise>();
|
||||
|
||||
texture = VS::get_singleton()->texture_create();
|
||||
texture = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
|
||||
_queue_update();
|
||||
}
|
||||
|
@ -570,7 +570,7 @@ void Area2D::_bind_methods() {
|
||||
}
|
||||
|
||||
Area2D::Area2D() :
|
||||
CollisionObject2D(Physics2DServer::get_singleton()->area_create(), true) {
|
||||
CollisionObject2D(RID_PRIME(Physics2DServer::get_singleton()->area_create()), true) {
|
||||
space_override = SPACE_OVERRIDE_DISABLED;
|
||||
set_gravity(98);
|
||||
set_gravity_vector(Vector2(0, 1));
|
||||
|
@ -1265,7 +1265,7 @@ int CanvasItem::get_canvas_layer() const {
|
||||
|
||||
CanvasItem::CanvasItem() :
|
||||
xform_change(this) {
|
||||
canvas_item = VisualServer::get_singleton()->canvas_item_create();
|
||||
canvas_item = RID_PRIME(VisualServer::get_singleton()->canvas_item_create());
|
||||
visible = true;
|
||||
pending_update = false;
|
||||
modulate = Color(1, 1, 1, 1);
|
||||
|
@ -1376,8 +1376,8 @@ CPUParticles2D::CPUParticles2D() {
|
||||
redraw = false;
|
||||
emitting = false;
|
||||
|
||||
mesh = VisualServer::get_singleton()->mesh_create();
|
||||
multimesh = VisualServer::get_singleton()->multimesh_create();
|
||||
mesh = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
multimesh = RID_PRIME(VisualServer::get_singleton()->multimesh_create());
|
||||
VisualServer::get_singleton()->multimesh_set_mesh(multimesh, mesh);
|
||||
|
||||
set_emitting(true);
|
||||
|
@ -435,7 +435,7 @@ void Light2D::_bind_methods() {
|
||||
}
|
||||
|
||||
Light2D::Light2D() {
|
||||
canvas_light = VisualServer::get_singleton()->canvas_light_create();
|
||||
canvas_light = RID_PRIME(VisualServer::get_singleton()->canvas_light_create());
|
||||
enabled = true;
|
||||
editor_only = false;
|
||||
shadow = false;
|
||||
|
@ -143,7 +143,7 @@ void OccluderPolygon2D::_bind_methods() {
|
||||
}
|
||||
|
||||
OccluderPolygon2D::OccluderPolygon2D() {
|
||||
occ_polygon = VS::get_singleton()->canvas_occluder_polygon_create();
|
||||
occ_polygon = RID_PRIME(VS::get_singleton()->canvas_occluder_polygon_create());
|
||||
closed = true;
|
||||
cull = CULL_DISABLED;
|
||||
rect_cache_dirty = true;
|
||||
@ -277,7 +277,7 @@ void LightOccluder2D::_bind_methods() {
|
||||
}
|
||||
|
||||
LightOccluder2D::LightOccluder2D() {
|
||||
occluder = VS::get_singleton()->canvas_light_occluder_create();
|
||||
occluder = RID_PRIME(VS::get_singleton()->canvas_light_occluder_create());
|
||||
mask = 1;
|
||||
set_notify_transform(true);
|
||||
}
|
||||
|
@ -381,7 +381,7 @@ void Particles2D::_bind_methods() {
|
||||
}
|
||||
|
||||
Particles2D::Particles2D() {
|
||||
particles = VS::get_singleton()->particles_create();
|
||||
particles = RID_PRIME(VS::get_singleton()->particles_create());
|
||||
|
||||
one_shot = false; // Needed so that set_emitting doesn't access uninitialized values
|
||||
set_emitting(true);
|
||||
|
@ -61,7 +61,7 @@ void PhysicsBody2D::_bind_methods() {
|
||||
}
|
||||
|
||||
PhysicsBody2D::PhysicsBody2D(Physics2DServer::BodyMode p_mode) :
|
||||
CollisionObject2D(Physics2DServer::get_singleton()->body_create(), false) {
|
||||
CollisionObject2D(RID_PRIME(Physics2DServer::get_singleton()->body_create()), false) {
|
||||
Physics2DServer::get_singleton()->body_set_mode(get_rid(), p_mode);
|
||||
set_pickable(false);
|
||||
}
|
||||
|
@ -293,7 +293,7 @@ Skeleton2D::Skeleton2D() {
|
||||
bone_setup_dirty = true;
|
||||
transform_dirty = true;
|
||||
|
||||
skeleton = VS::get_singleton()->skeleton_create();
|
||||
skeleton = RID_PRIME(VS::get_singleton()->skeleton_create());
|
||||
set_notify_transform(true);
|
||||
}
|
||||
|
||||
|
@ -415,7 +415,7 @@ void TileMap::update_dirty_quadrants() {
|
||||
RID debug_canvas_item;
|
||||
|
||||
if (prev_canvas_item == RID() || prev_material != mat || prev_z_index != z_index) {
|
||||
canvas_item = vs->canvas_item_create();
|
||||
canvas_item = RID_PRIME(vs->canvas_item_create());
|
||||
if (mat.is_valid()) {
|
||||
vs->canvas_item_set_material(canvas_item, mat->get_rid());
|
||||
}
|
||||
@ -430,7 +430,7 @@ void TileMap::update_dirty_quadrants() {
|
||||
q.canvas_items.push_back(canvas_item);
|
||||
|
||||
if (debug_shapes) {
|
||||
debug_canvas_item = vs->canvas_item_create();
|
||||
debug_canvas_item = RID_PRIME(vs->canvas_item_create());
|
||||
vs->canvas_item_set_parent(debug_canvas_item, canvas_item);
|
||||
vs->canvas_item_set_z_as_relative_to_parent(debug_canvas_item, false);
|
||||
vs->canvas_item_set_z_index(debug_canvas_item, VS::CANVAS_ITEM_Z_MAX - 1);
|
||||
@ -619,7 +619,7 @@ void TileMap::update_dirty_quadrants() {
|
||||
q.navpoly_ids[E->key()] = np;
|
||||
|
||||
if (debug_navigation) {
|
||||
RID debug_navigation_item = vs->canvas_item_create();
|
||||
RID debug_navigation_item = RID_PRIME(vs->canvas_item_create());
|
||||
vs->canvas_item_set_parent(debug_navigation_item, canvas_item);
|
||||
vs->canvas_item_set_z_as_relative_to_parent(debug_navigation_item, false);
|
||||
vs->canvas_item_set_z_index(debug_navigation_item, VS::CANVAS_ITEM_Z_MAX - 2); // Display one below collision debug
|
||||
@ -679,7 +679,7 @@ void TileMap::update_dirty_quadrants() {
|
||||
xform.set_origin(offset.floor() + q.pos);
|
||||
_fix_cell_transform(xform, c, occluder_ofs, s);
|
||||
|
||||
RID orid = VS::get_singleton()->canvas_light_occluder_create();
|
||||
RID orid = RID_PRIME(VS::get_singleton()->canvas_light_occluder_create());
|
||||
VS::get_singleton()->canvas_light_occluder_set_transform(orid, get_global_transform() * xform);
|
||||
VS::get_singleton()->canvas_light_occluder_set_polygon(orid, occluder->get_rid());
|
||||
VS::get_singleton()->canvas_light_occluder_attach_to_canvas(orid, get_canvas());
|
||||
@ -757,7 +757,7 @@ Map<TileMap::PosKey, TileMap::Quadrant>::Element *TileMap::_create_quadrant(cons
|
||||
xform.set_origin(q.pos);
|
||||
//q.canvas_item = VisualServer::get_singleton()->canvas_item_create();
|
||||
if (!use_parent) {
|
||||
q.body = Physics2DServer::get_singleton()->body_create();
|
||||
q.body = RID_PRIME(Physics2DServer::get_singleton()->body_create());
|
||||
Physics2DServer::get_singleton()->body_set_mode(q.body, use_kinematic ? Physics2DServer::BODY_MODE_KINEMATIC : Physics2DServer::BODY_MODE_STATIC);
|
||||
|
||||
Physics2DServer::get_singleton()->body_attach_object_instance_id(q.body, get_instance_id());
|
||||
|
@ -615,7 +615,7 @@ void Area::_bind_methods() {
|
||||
}
|
||||
|
||||
Area::Area() :
|
||||
CollisionObject(PhysicsServer::get_singleton()->area_create(), true) {
|
||||
CollisionObject(RID_PRIME(PhysicsServer::get_singleton()->area_create()), true) {
|
||||
space_override = SPACE_OVERRIDE_DISABLED;
|
||||
set_gravity(9.8);
|
||||
locked = false;
|
||||
|
@ -147,7 +147,7 @@ void BakedLightmapData::clear_data() {
|
||||
if (baked_light.is_valid()) {
|
||||
VS::get_singleton()->free(baked_light);
|
||||
}
|
||||
baked_light = VS::get_singleton()->lightmap_capture_create();
|
||||
baked_light = RID_PRIME(VS::get_singleton()->lightmap_capture_create());
|
||||
}
|
||||
|
||||
void BakedLightmapData::_set_user_data(const Array &p_data) {
|
||||
@ -243,7 +243,7 @@ void BakedLightmapData::_bind_methods() {
|
||||
}
|
||||
|
||||
BakedLightmapData::BakedLightmapData() {
|
||||
baked_light = VS::get_singleton()->lightmap_capture_create();
|
||||
baked_light = RID_PRIME(VS::get_singleton()->lightmap_capture_create());
|
||||
energy = 1;
|
||||
cell_subdiv = 1;
|
||||
interior = false;
|
||||
|
@ -645,7 +645,7 @@ Vector3 Camera::get_doppler_tracked_velocity() const {
|
||||
}
|
||||
}
|
||||
Camera::Camera() {
|
||||
camera = VisualServer::get_singleton()->camera_create();
|
||||
camera = RID_PRIME(VisualServer::get_singleton()->camera_create());
|
||||
size = 1;
|
||||
fov = 0;
|
||||
frustum_offset = Vector2();
|
||||
@ -880,7 +880,7 @@ ClippedCamera::ClippedCamera() {
|
||||
collision_mask = 1;
|
||||
set_notify_local_transform(Engine::get_singleton()->is_editor_hint());
|
||||
points.resize(5);
|
||||
pyramid_shape = PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONVEX_POLYGON);
|
||||
pyramid_shape = RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONVEX_POLYGON));
|
||||
clip_to_areas = false;
|
||||
clip_to_bodies = true;
|
||||
}
|
||||
|
@ -244,7 +244,7 @@ void CollisionObject::_update_debug_shapes() {
|
||||
}
|
||||
}
|
||||
if (!s.debug_shape.is_valid()) {
|
||||
s.debug_shape = VS::get_singleton()->instance_create();
|
||||
s.debug_shape = RID_PRIME(VS::get_singleton()->instance_create());
|
||||
VS::get_singleton()->instance_set_scenario(s.debug_shape, get_world()->get_scenario());
|
||||
|
||||
if (!s.shape->is_connected("changed", this, "_shape_changed")) {
|
||||
|
@ -198,7 +198,7 @@ bool CollisionShape::is_disabled() const {
|
||||
}
|
||||
|
||||
CollisionShape::CollisionShape() {
|
||||
//indicator = VisualServer::get_singleton()->mesh_create();
|
||||
//indicator = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
disabled = false;
|
||||
parent = nullptr;
|
||||
owner_id = 0;
|
||||
|
@ -1519,7 +1519,7 @@ CPUParticles::CPUParticles() {
|
||||
|
||||
set_notify_transform(true);
|
||||
|
||||
multimesh = VisualServer::get_singleton()->multimesh_create();
|
||||
multimesh = RID_PRIME(VisualServer::get_singleton()->multimesh_create());
|
||||
VisualServer::get_singleton()->multimesh_set_visible_instances(multimesh, 0);
|
||||
set_base(multimesh);
|
||||
|
||||
|
@ -175,7 +175,7 @@ void GIProbeData::_bind_methods() {
|
||||
}
|
||||
|
||||
GIProbeData::GIProbeData() {
|
||||
probe = VS::get_singleton()->gi_probe_create();
|
||||
probe = RID_PRIME(VS::get_singleton()->gi_probe_create());
|
||||
}
|
||||
|
||||
GIProbeData::~GIProbeData() {
|
||||
@ -522,7 +522,7 @@ GIProbe::GIProbe() {
|
||||
interior = false;
|
||||
compress = false;
|
||||
|
||||
gi_probe = VS::get_singleton()->gi_probe_create();
|
||||
gi_probe = RID_PRIME(VS::get_singleton()->gi_probe_create());
|
||||
set_disable_scale(true);
|
||||
}
|
||||
|
||||
|
@ -144,7 +144,7 @@ void ImmediateGeometry::_bind_methods() {
|
||||
}
|
||||
|
||||
ImmediateGeometry::ImmediateGeometry() {
|
||||
im = VisualServer::get_singleton()->immediate_create();
|
||||
im = RID_PRIME(VisualServer::get_singleton()->immediate_create());
|
||||
set_base(im);
|
||||
empty = true;
|
||||
}
|
||||
|
@ -273,13 +273,13 @@ Light::Light(VisualServer::LightType p_type) {
|
||||
type = p_type;
|
||||
switch (p_type) {
|
||||
case VS::LIGHT_DIRECTIONAL:
|
||||
light = VisualServer::get_singleton()->directional_light_create();
|
||||
light = RID_PRIME(VisualServer::get_singleton()->directional_light_create());
|
||||
break;
|
||||
case VS::LIGHT_OMNI:
|
||||
light = VisualServer::get_singleton()->omni_light_create();
|
||||
light = RID_PRIME(VisualServer::get_singleton()->omni_light_create());
|
||||
break;
|
||||
case VS::LIGHT_SPOT:
|
||||
light = VisualServer::get_singleton()->spot_light_create();
|
||||
light = RID_PRIME(VisualServer::get_singleton()->spot_light_create());
|
||||
break;
|
||||
default: {
|
||||
};
|
||||
|
@ -384,7 +384,7 @@ void Particles::_bind_methods() {
|
||||
}
|
||||
|
||||
Particles::Particles() {
|
||||
particles = VS::get_singleton()->particles_create();
|
||||
particles = RID_PRIME(VS::get_singleton()->particles_create());
|
||||
set_base(particles);
|
||||
one_shot = false; // Needed so that set_emitting doesn't access uninitialized values
|
||||
set_emitting(true);
|
||||
|
@ -99,7 +99,7 @@ void PhysicsBody::_bind_methods() {
|
||||
}
|
||||
|
||||
PhysicsBody::PhysicsBody(PhysicsServer::BodyMode p_mode) :
|
||||
CollisionObject(PhysicsServer::get_singleton()->body_create(p_mode), false) {
|
||||
CollisionObject(RID_PRIME(PhysicsServer::get_singleton()->body_create(p_mode)), false) {
|
||||
}
|
||||
|
||||
#ifndef DISABLE_DEPRECATED
|
||||
@ -2411,7 +2411,7 @@ void PhysicalBone::_reload_joint() {
|
||||
|
||||
switch (get_joint_type()) {
|
||||
case JOINT_TYPE_PIN: {
|
||||
joint = PhysicsServer::get_singleton()->joint_create_pin(body_a->get_rid(), local_a.origin, get_rid(), joint_offset.origin);
|
||||
joint = RID_PRIME(PhysicsServer::get_singleton()->joint_create_pin(body_a->get_rid(), local_a.origin, get_rid(), joint_offset.origin));
|
||||
const PinJointData *pjd(static_cast<const PinJointData *>(joint_data));
|
||||
PhysicsServer::get_singleton()->pin_joint_set_param(joint, PhysicsServer::PIN_JOINT_BIAS, pjd->bias);
|
||||
PhysicsServer::get_singleton()->pin_joint_set_param(joint, PhysicsServer::PIN_JOINT_DAMPING, pjd->damping);
|
||||
@ -2419,7 +2419,7 @@ void PhysicalBone::_reload_joint() {
|
||||
|
||||
} break;
|
||||
case JOINT_TYPE_CONE: {
|
||||
joint = PhysicsServer::get_singleton()->joint_create_cone_twist(body_a->get_rid(), local_a, get_rid(), joint_offset);
|
||||
joint = RID_PRIME(PhysicsServer::get_singleton()->joint_create_cone_twist(body_a->get_rid(), local_a, get_rid(), joint_offset));
|
||||
const ConeJointData *cjd(static_cast<const ConeJointData *>(joint_data));
|
||||
PhysicsServer::get_singleton()->cone_twist_joint_set_param(joint, PhysicsServer::CONE_TWIST_JOINT_SWING_SPAN, cjd->swing_span);
|
||||
PhysicsServer::get_singleton()->cone_twist_joint_set_param(joint, PhysicsServer::CONE_TWIST_JOINT_TWIST_SPAN, cjd->twist_span);
|
||||
@ -2429,7 +2429,7 @@ void PhysicalBone::_reload_joint() {
|
||||
|
||||
} break;
|
||||
case JOINT_TYPE_HINGE: {
|
||||
joint = PhysicsServer::get_singleton()->joint_create_hinge(body_a->get_rid(), local_a, get_rid(), joint_offset);
|
||||
joint = RID_PRIME(PhysicsServer::get_singleton()->joint_create_hinge(body_a->get_rid(), local_a, get_rid(), joint_offset));
|
||||
const HingeJointData *hjd(static_cast<const HingeJointData *>(joint_data));
|
||||
PhysicsServer::get_singleton()->hinge_joint_set_flag(joint, PhysicsServer::HINGE_JOINT_FLAG_USE_LIMIT, hjd->angular_limit_enabled);
|
||||
PhysicsServer::get_singleton()->hinge_joint_set_param(joint, PhysicsServer::HINGE_JOINT_LIMIT_UPPER, hjd->angular_limit_upper);
|
||||
@ -2440,7 +2440,7 @@ void PhysicalBone::_reload_joint() {
|
||||
|
||||
} break;
|
||||
case JOINT_TYPE_SLIDER: {
|
||||
joint = PhysicsServer::get_singleton()->joint_create_slider(body_a->get_rid(), local_a, get_rid(), joint_offset);
|
||||
joint = RID_PRIME(PhysicsServer::get_singleton()->joint_create_slider(body_a->get_rid(), local_a, get_rid(), joint_offset));
|
||||
const SliderJointData *sjd(static_cast<const SliderJointData *>(joint_data));
|
||||
PhysicsServer::get_singleton()->slider_joint_set_param(joint, PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_UPPER, sjd->linear_limit_upper);
|
||||
PhysicsServer::get_singleton()->slider_joint_set_param(joint, PhysicsServer::SLIDER_JOINT_LINEAR_LIMIT_LOWER, sjd->linear_limit_lower);
|
||||
@ -2455,7 +2455,7 @@ void PhysicalBone::_reload_joint() {
|
||||
|
||||
} break;
|
||||
case JOINT_TYPE_6DOF: {
|
||||
joint = PhysicsServer::get_singleton()->joint_create_generic_6dof(body_a->get_rid(), local_a, get_rid(), joint_offset);
|
||||
joint = RID_PRIME(PhysicsServer::get_singleton()->joint_create_generic_6dof(body_a->get_rid(), local_a, get_rid(), joint_offset));
|
||||
const SixDOFJointData *g6dofjd(static_cast<const SixDOFJointData *>(joint_data));
|
||||
for (int axis = 0; axis < 3; ++axis) {
|
||||
PhysicsServer::get_singleton()->generic_6dof_joint_set_flag(joint, static_cast<Vector3::Axis>(axis), PhysicsServer::G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT, g6dofjd->axis_data[axis].linear_limit_enabled);
|
||||
|
@ -398,7 +398,7 @@ RID HingeJoint::_configure_joint(PhysicsBody *body_a, PhysicsBody *body_b) {
|
||||
|
||||
local_b.orthonormalize();
|
||||
|
||||
RID j = PhysicsServer::get_singleton()->joint_create_hinge(body_a->get_rid(), local_a, body_b ? body_b->get_rid() : RID(), local_b);
|
||||
RID j = RID_PRIME(PhysicsServer::get_singleton()->joint_create_hinge(body_a->get_rid(), local_a, body_b ? body_b->get_rid() : RID(), local_b));
|
||||
for (int i = 0; i < PARAM_MAX; i++) {
|
||||
PhysicsServer::get_singleton()->hinge_joint_set_param(j, PhysicsServer::HingeJointParam(i), params[i]);
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ Portal::Portal() {
|
||||
_use_default_margin = true;
|
||||
|
||||
// the visual server portal lifetime is linked to the lifetime of this object
|
||||
_portal_rid = VisualServer::get_singleton()->portal_create();
|
||||
_portal_rid = RID_PRIME(VisualServer::get_singleton()->portal_create());
|
||||
|
||||
#ifdef TOOLS_ENABLED
|
||||
_room_manager_godot_ID = 0;
|
||||
|
@ -246,7 +246,7 @@ ReflectionProbe::ReflectionProbe() {
|
||||
cull_mask = (1 << 20) - 1;
|
||||
update_mode = UPDATE_ONCE;
|
||||
|
||||
probe = VisualServer::get_singleton()->reflection_probe_create();
|
||||
probe = RID_PRIME(VisualServer::get_singleton()->reflection_probe_create());
|
||||
VS::get_singleton()->instance_set_base(get_instance(), probe);
|
||||
set_disable_scale(true);
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ void Room::clear() {
|
||||
}
|
||||
|
||||
Room::Room() {
|
||||
_room_rid = VisualServer::get_singleton()->room_create();
|
||||
_room_rid = RID_PRIME(VisualServer::get_singleton()->room_create());
|
||||
}
|
||||
|
||||
Room::~Room() {
|
||||
|
@ -41,7 +41,7 @@ void RoomGroup::_bind_methods() {
|
||||
}
|
||||
|
||||
RoomGroup::RoomGroup() {
|
||||
_room_group_rid = VisualServer::get_singleton()->roomgroup_create();
|
||||
_room_group_rid = RID_PRIME(VisualServer::get_singleton()->roomgroup_create());
|
||||
}
|
||||
|
||||
RoomGroup::~RoomGroup() {
|
||||
|
@ -813,7 +813,7 @@ Ref<SkinReference> Skeleton::register_skin(const Ref<Skin> &p_skin) {
|
||||
|
||||
skin_ref->skeleton_node = this;
|
||||
skin_ref->bind_count = 0;
|
||||
skin_ref->skeleton = VisualServer::get_singleton()->skeleton_create();
|
||||
skin_ref->skeleton = RID_PRIME(VisualServer::get_singleton()->skeleton_create());
|
||||
skin_ref->skeleton_node = this;
|
||||
skin_ref->skin = skin;
|
||||
|
||||
|
@ -731,7 +731,7 @@ bool SoftBody::is_ray_pickable() const {
|
||||
}
|
||||
|
||||
SoftBody::SoftBody() :
|
||||
physics_rid(PhysicsServer::get_singleton()->soft_body_create()),
|
||||
physics_rid(RID_PRIME(PhysicsServer::get_singleton()->soft_body_create())),
|
||||
collision_mask(1),
|
||||
collision_layer(1),
|
||||
simulation_started(false),
|
||||
|
@ -358,7 +358,7 @@ SpriteBase3D::SpriteBase3D() {
|
||||
pending_update = false;
|
||||
opacity = 1.0;
|
||||
|
||||
material = VisualServer::get_singleton()->material_create();
|
||||
material = RID_PRIME(VisualServer::get_singleton()->material_create());
|
||||
// Set defaults for material, names need to match up those in SpatialMaterial
|
||||
VS::get_singleton()->material_set_param(material, "albedo", Color(1, 1, 1, 1));
|
||||
VS::get_singleton()->material_set_param(material, "specular", 0.5);
|
||||
@ -370,7 +370,7 @@ SpriteBase3D::SpriteBase3D() {
|
||||
VS::get_singleton()->material_set_param(material, "uv2_scale", Vector3(1, 1, 1));
|
||||
VS::get_singleton()->material_set_param(material, "alpha_scissor_threshold", 0.98);
|
||||
|
||||
mesh = VisualServer::get_singleton()->mesh_create();
|
||||
mesh = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
|
||||
PoolVector3Array mesh_vertices;
|
||||
PoolVector3Array mesh_normals;
|
||||
|
@ -98,7 +98,7 @@ void VisibilityNotifier::_refresh_portal_mode() {
|
||||
if (get_portal_mode() == PORTAL_MODE_ROAMING) {
|
||||
if (is_inside_world()) {
|
||||
if (_cull_instance_rid == RID()) {
|
||||
_cull_instance_rid = VisualServer::get_singleton()->ghost_create();
|
||||
_cull_instance_rid = RID_PRIME(VisualServer::get_singleton()->ghost_create());
|
||||
}
|
||||
|
||||
if (is_inside_world() && get_world().is_valid() && get_world()->get_scenario().is_valid() && is_inside_tree()) {
|
||||
|
@ -156,7 +156,7 @@ RID VisualInstance::get_base() const {
|
||||
}
|
||||
|
||||
VisualInstance::VisualInstance() {
|
||||
instance = VisualServer::get_singleton()->instance_create();
|
||||
instance = RID_PRIME(VisualServer::get_singleton()->instance_create());
|
||||
VisualServer::get_singleton()->instance_attach_object_instance_id(instance, get_instance_id());
|
||||
layers = 1;
|
||||
set_notify_transform(true);
|
||||
|
@ -191,7 +191,7 @@ RootMotionView::RootMotionView() {
|
||||
radius = 10;
|
||||
cell_size = 1;
|
||||
set_process_internal(true);
|
||||
immediate = VisualServer::get_singleton()->immediate_create();
|
||||
immediate = RID_PRIME(VisualServer::get_singleton()->immediate_create());
|
||||
set_base(immediate);
|
||||
color = Color(0.5, 0.5, 1.0);
|
||||
}
|
||||
|
@ -322,7 +322,7 @@ CanvasLayer::CanvasLayer() {
|
||||
rot = 0;
|
||||
locrotscale_dirty = false;
|
||||
layer = 1;
|
||||
canvas = VS::get_singleton()->canvas_create();
|
||||
canvas = RID_PRIME(VS::get_singleton()->canvas_create());
|
||||
custom_viewport = nullptr;
|
||||
custom_viewport_id = 0;
|
||||
sort_index = 0;
|
||||
|
@ -146,7 +146,7 @@ ViewportTexture::ViewportTexture() {
|
||||
vp = nullptr;
|
||||
flags = 0;
|
||||
set_local_to_scene(true);
|
||||
proxy = VS::get_singleton()->texture_create();
|
||||
proxy = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
}
|
||||
|
||||
ViewportTexture::~ViewportTexture() {
|
||||
@ -286,15 +286,15 @@ void Viewport::_notification(int p_what) {
|
||||
if (get_tree()->is_debugging_collisions_hint()) {
|
||||
//2D
|
||||
Physics2DServer::get_singleton()->space_set_debug_contacts(find_world_2d()->get_space(), get_tree()->get_collision_debug_contact_count());
|
||||
contact_2d_debug = VisualServer::get_singleton()->canvas_item_create();
|
||||
contact_2d_debug = RID_PRIME(VisualServer::get_singleton()->canvas_item_create());
|
||||
VisualServer::get_singleton()->canvas_item_set_parent(contact_2d_debug, find_world_2d()->get_canvas());
|
||||
//3D
|
||||
PhysicsServer::get_singleton()->space_set_debug_contacts(find_world()->get_space(), get_tree()->get_collision_debug_contact_count());
|
||||
contact_3d_debug_multimesh = VisualServer::get_singleton()->multimesh_create();
|
||||
contact_3d_debug_multimesh = RID_PRIME(VisualServer::get_singleton()->multimesh_create());
|
||||
VisualServer::get_singleton()->multimesh_allocate(contact_3d_debug_multimesh, get_tree()->get_collision_debug_contact_count(), VS::MULTIMESH_TRANSFORM_3D, VS::MULTIMESH_COLOR_8BIT);
|
||||
VisualServer::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh, 0);
|
||||
VisualServer::get_singleton()->multimesh_set_mesh(contact_3d_debug_multimesh, get_tree()->get_debug_contact_mesh()->get_rid());
|
||||
contact_3d_debug_instance = VisualServer::get_singleton()->instance_create();
|
||||
contact_3d_debug_instance = RID_PRIME(VisualServer::get_singleton()->instance_create());
|
||||
VisualServer::get_singleton()->instance_set_base(contact_3d_debug_instance, contact_3d_debug_multimesh);
|
||||
VisualServer::get_singleton()->instance_set_scenario(contact_3d_debug_instance, find_world()->get_scenario());
|
||||
//VisualServer::get_singleton()->instance_geometry_set_flag(contact_3d_debug_instance, VS::INSTANCE_FLAG_VISIBLE_IN_ALL_ROOMS, true);
|
||||
@ -1171,7 +1171,7 @@ void Viewport::enable_camera_override(bool p_enable) {
|
||||
}
|
||||
|
||||
if (p_enable) {
|
||||
camera_override.rid = VisualServer::get_singleton()->camera_create();
|
||||
camera_override.rid = RID_PRIME(VisualServer::get_singleton()->camera_create());
|
||||
} else {
|
||||
VisualServer::get_singleton()->free(camera_override.rid);
|
||||
camera_override.rid = RID();
|
||||
@ -3337,7 +3337,7 @@ void Viewport::_subwindow_visibility_changed() {
|
||||
Viewport::Viewport() {
|
||||
world_2d = Ref<World2D>(memnew(World2D));
|
||||
|
||||
viewport = VisualServer::get_singleton()->viewport_create();
|
||||
viewport = RID_PRIME(VisualServer::get_singleton()->viewport_create());
|
||||
texture_rid = VisualServer::get_singleton()->viewport_get_texture(viewport);
|
||||
texture_flags = 0;
|
||||
|
||||
|
@ -71,6 +71,6 @@ void BoxShape::_bind_methods() {
|
||||
}
|
||||
|
||||
BoxShape::BoxShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_BOX)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_BOX))) {
|
||||
set_extents(Vector3(1, 1, 1));
|
||||
}
|
||||
|
@ -107,7 +107,7 @@ void CapsuleShape::_bind_methods() {
|
||||
}
|
||||
|
||||
CapsuleShape::CapsuleShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CAPSULE)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CAPSULE))) {
|
||||
radius = 1.0;
|
||||
height = 1.0;
|
||||
_update_shape();
|
||||
|
@ -81,6 +81,6 @@ void ConcavePolygonShape::_bind_methods() {
|
||||
}
|
||||
|
||||
ConcavePolygonShape::ConcavePolygonShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONCAVE_POLYGON)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONCAVE_POLYGON))) {
|
||||
//set_planes(Vector3(1,1,1));
|
||||
}
|
||||
|
@ -76,5 +76,5 @@ void ConvexPolygonShape::_bind_methods() {
|
||||
}
|
||||
|
||||
ConvexPolygonShape::ConvexPolygonShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONVEX_POLYGON)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CONVEX_POLYGON))) {
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ void CylinderShape::_bind_methods() {
|
||||
}
|
||||
|
||||
CylinderShape::CylinderShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CYLINDER)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_CYLINDER))) {
|
||||
radius = 1.0;
|
||||
height = 2.0;
|
||||
_update_shape();
|
||||
|
@ -1175,7 +1175,7 @@ Environment::Environment() :
|
||||
glow_blend_mode(GLOW_BLEND_MODE_ADDITIVE),
|
||||
dof_blur_far_quality(DOF_BLUR_QUALITY_LOW),
|
||||
dof_blur_near_quality(DOF_BLUR_QUALITY_LOW) {
|
||||
environment = VS::get_singleton()->environment_create();
|
||||
environment = RID_PRIME(VS::get_singleton()->environment_create());
|
||||
|
||||
bg_mode = BG_CLEAR_COLOR;
|
||||
bg_sky_custom_fov = 0;
|
||||
|
@ -193,7 +193,7 @@ void HeightMapShape::_bind_methods() {
|
||||
}
|
||||
|
||||
HeightMapShape::HeightMapShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_HEIGHTMAP)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_HEIGHTMAP))) {
|
||||
map_width = 2;
|
||||
map_depth = 2;
|
||||
map_data.resize(map_width * map_depth);
|
||||
|
@ -96,7 +96,7 @@ void Material::_bind_methods() {
|
||||
}
|
||||
|
||||
Material::Material() {
|
||||
material = VisualServer::get_singleton()->material_create();
|
||||
material = RID_PRIME(VisualServer::get_singleton()->material_create());
|
||||
render_priority = 0;
|
||||
}
|
||||
|
||||
|
@ -1446,7 +1446,7 @@ void ArrayMesh::reload_from_file() {
|
||||
}
|
||||
|
||||
ArrayMesh::ArrayMesh() {
|
||||
mesh = VisualServer::get_singleton()->mesh_create();
|
||||
mesh = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
blend_shape_mode = BLEND_SHAPE_MODE_RELATIVE;
|
||||
}
|
||||
|
||||
|
@ -347,7 +347,7 @@ void MultiMesh::_bind_methods() {
|
||||
}
|
||||
|
||||
MultiMesh::MultiMesh() {
|
||||
multimesh = VisualServer::get_singleton()->multimesh_create();
|
||||
multimesh = RID_PRIME(VisualServer::get_singleton()->multimesh_create());
|
||||
color_format = COLOR_NONE;
|
||||
custom_data_format = CUSTOM_DATA_NONE;
|
||||
transform_format = TRANSFORM_2D;
|
||||
|
@ -212,5 +212,5 @@ void OccluderShapeSphere::set_sphere_radius(int p_idx, real_t p_radius) {
|
||||
}
|
||||
|
||||
OccluderShapeSphere::OccluderShapeSphere() :
|
||||
OccluderShape(VisualServer::get_singleton()->occluder_create()) {
|
||||
OccluderShape(RID_PRIME(VisualServer::get_singleton()->occluder_create())) {
|
||||
}
|
||||
|
@ -84,6 +84,6 @@ void PlaneShape::_bind_methods() {
|
||||
}
|
||||
|
||||
PlaneShape::PlaneShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_PLANE)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_PLANE))) {
|
||||
set_plane(Plane(0, 1, 0, 0));
|
||||
}
|
||||
|
@ -252,7 +252,7 @@ bool PrimitiveMesh::get_flip_faces() const {
|
||||
PrimitiveMesh::PrimitiveMesh() {
|
||||
flip_faces = false;
|
||||
// defaults
|
||||
mesh = VisualServer::get_singleton()->mesh_create();
|
||||
mesh = RID_PRIME(VisualServer::get_singleton()->mesh_create());
|
||||
|
||||
// assume primitive triangles as the type, correct for all but one and it will change this :)
|
||||
primitive_type = Mesh::PRIMITIVE_TRIANGLES;
|
||||
|
@ -82,7 +82,7 @@ void RayShape::_bind_methods() {
|
||||
}
|
||||
|
||||
RayShape::RayShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_RAY)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_RAY))) {
|
||||
length = 1.0;
|
||||
slips_on_slope = false;
|
||||
|
||||
|
@ -495,7 +495,7 @@ void ProceduralSky::_bind_methods() {
|
||||
|
||||
ProceduralSky::ProceduralSky(bool p_desaturate) {
|
||||
sky = VS::get_singleton()->sky_create();
|
||||
texture = VS::get_singleton()->texture_create();
|
||||
texture = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
|
||||
update_queued = false;
|
||||
sky_top_color = Color::hex(0xa5d6f1ff);
|
||||
|
@ -77,6 +77,6 @@ void SphereShape::_bind_methods() {
|
||||
}
|
||||
|
||||
SphereShape::SphereShape() :
|
||||
Shape(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_SPHERE)) {
|
||||
Shape(RID_PRIME(PhysicsServer::get_singleton()->shape_create(PhysicsServer::SHAPE_SPHERE))) {
|
||||
set_radius(1.0);
|
||||
}
|
||||
|
@ -404,7 +404,7 @@ void ImageTexture::_bind_methods() {
|
||||
ImageTexture::ImageTexture() {
|
||||
w = h = 0;
|
||||
flags = FLAGS_DEFAULT;
|
||||
texture = VisualServer::get_singleton()->texture_create();
|
||||
texture = RID_PRIME(VisualServer::get_singleton()->texture_create());
|
||||
storage = STORAGE_RAW;
|
||||
lossy_storage_quality = 0.7;
|
||||
image_stored = false;
|
||||
@ -824,7 +824,7 @@ StreamTexture::StreamTexture() {
|
||||
w = 0;
|
||||
h = 0;
|
||||
|
||||
texture = VS::get_singleton()->texture_create();
|
||||
texture = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
}
|
||||
|
||||
StreamTexture::~StreamTexture() {
|
||||
@ -1585,7 +1585,7 @@ CubeMap::CubeMap() {
|
||||
for (int i = 0; i < 6; i++) {
|
||||
valid[i] = false;
|
||||
}
|
||||
cubemap = VisualServer::get_singleton()->texture_create();
|
||||
cubemap = RID_PRIME(VisualServer::get_singleton()->texture_create());
|
||||
storage = STORAGE_RAW;
|
||||
lossy_storage_quality = 0.7;
|
||||
format = Image::FORMAT_BPTC_RGBA;
|
||||
@ -1694,7 +1694,7 @@ RID CurveTexture::get_rid() const {
|
||||
|
||||
CurveTexture::CurveTexture() {
|
||||
_width = 2048;
|
||||
_texture = VS::get_singleton()->texture_create();
|
||||
_texture = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
}
|
||||
CurveTexture::~CurveTexture() {
|
||||
VS::get_singleton()->free(_texture);
|
||||
@ -1711,7 +1711,7 @@ GradientTexture::GradientTexture() {
|
||||
update_pending = false;
|
||||
width = 2048;
|
||||
|
||||
texture = VS::get_singleton()->texture_create();
|
||||
texture = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
_queue_update();
|
||||
}
|
||||
|
||||
@ -1860,7 +1860,7 @@ uint32_t ProxyTexture::get_flags() const {
|
||||
}
|
||||
|
||||
ProxyTexture::ProxyTexture() {
|
||||
proxy = VS::get_singleton()->texture_create();
|
||||
proxy = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
}
|
||||
|
||||
ProxyTexture::~ProxyTexture() {
|
||||
@ -2107,7 +2107,7 @@ void AnimatedTexture::_bind_methods() {
|
||||
}
|
||||
|
||||
AnimatedTexture::AnimatedTexture() {
|
||||
proxy = VS::get_singleton()->texture_create();
|
||||
proxy = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
VisualServer::get_singleton()->texture_set_force_redraw_if_visible(proxy, true);
|
||||
time = 0;
|
||||
frame_count = 1;
|
||||
@ -2416,7 +2416,7 @@ TextureLayered::TextureLayered(bool p_3d) {
|
||||
height = 0;
|
||||
depth = 0;
|
||||
|
||||
texture = VS::get_singleton()->texture_create();
|
||||
texture = RID_PRIME(VS::get_singleton()->texture_create());
|
||||
}
|
||||
|
||||
TextureLayered::~TextureLayered() {
|
||||
@ -2632,7 +2632,7 @@ uint32_t ExternalTexture::get_flags() const {
|
||||
|
||||
ExternalTexture::ExternalTexture() {
|
||||
size = Size2(1.0, 1.0);
|
||||
texture = VisualServer::get_singleton()->texture_create();
|
||||
texture = RID_PRIME(VisualServer::get_singleton()->texture_create());
|
||||
|
||||
VisualServer::get_singleton()->texture_allocate(texture, size.width, size.height, 0, Image::FORMAT_RGBA8, VS::TEXTURE_TYPE_EXTERNAL, Texture::FLAG_VIDEO_SURFACE);
|
||||
_change_notify();
|
||||
|
@ -309,8 +309,8 @@ void World::_bind_methods() {
|
||||
}
|
||||
|
||||
World::World() {
|
||||
space = PhysicsServer::get_singleton()->space_create();
|
||||
scenario = VisualServer::get_singleton()->scenario_create();
|
||||
space = RID_PRIME(PhysicsServer::get_singleton()->space_create());
|
||||
scenario = RID_PRIME(VisualServer::get_singleton()->scenario_create());
|
||||
|
||||
PhysicsServer::get_singleton()->space_set_active(space, true);
|
||||
PhysicsServer::get_singleton()->area_set_param(space, PhysicsServer::AREA_PARAM_GRAVITY, GLOBAL_DEF("physics/3d/default_gravity", 9.8));
|
||||
|
@ -348,8 +348,8 @@ Physics2DDirectSpaceState *World2D::get_direct_space_state() {
|
||||
}
|
||||
|
||||
World2D::World2D() {
|
||||
canvas = VisualServer::get_singleton()->canvas_create();
|
||||
space = Physics2DServer::get_singleton()->space_create();
|
||||
canvas = RID_PRIME(VisualServer::get_singleton()->canvas_create());
|
||||
space = RID_PRIME(Physics2DServer::get_singleton()->space_create());
|
||||
|
||||
//set space2D to be more friendly with pixels than meters, by adjusting some constants
|
||||
Physics2DServer::get_singleton()->space_set_active(space, true);
|
||||
|
@ -144,8 +144,8 @@ CameraFeed::CameraFeed() {
|
||||
|
||||
// create a texture object
|
||||
VisualServer *vs = VisualServer::get_singleton();
|
||||
texture[CameraServer::FEED_Y_IMAGE] = vs->texture_create(); // also used for RGBA
|
||||
texture[CameraServer::FEED_CBCR_IMAGE] = vs->texture_create();
|
||||
texture[CameraServer::FEED_Y_IMAGE] = RID_PRIME(vs->texture_create()); // also used for RGBA
|
||||
texture[CameraServer::FEED_CBCR_IMAGE] = RID_PRIME(vs->texture_create());
|
||||
}
|
||||
|
||||
CameraFeed::CameraFeed(String p_name, FeedPosition p_position) {
|
||||
@ -161,8 +161,8 @@ CameraFeed::CameraFeed(String p_name, FeedPosition p_position) {
|
||||
|
||||
// create a texture object
|
||||
VisualServer *vs = VisualServer::get_singleton();
|
||||
texture[CameraServer::FEED_Y_IMAGE] = vs->texture_create(); // also used for RGBA
|
||||
texture[CameraServer::FEED_CBCR_IMAGE] = vs->texture_create();
|
||||
texture[CameraServer::FEED_Y_IMAGE] = RID_PRIME(vs->texture_create()); // also used for RGBA
|
||||
texture[CameraServer::FEED_CBCR_IMAGE] = RID_PRIME(vs->texture_create());
|
||||
}
|
||||
|
||||
CameraFeed::~CameraFeed() {
|
||||
|
@ -129,13 +129,13 @@ RID PhysicsServerSW::space_create() {
|
||||
SpaceSW *space = memnew(SpaceSW);
|
||||
RID id = space_owner.make_rid(space);
|
||||
space->set_self(id);
|
||||
RID area_id = area_create();
|
||||
RID area_id = RID_PRIME(area_create());
|
||||
AreaSW *area = area_owner.get(area_id);
|
||||
ERR_FAIL_COND_V(!area, RID());
|
||||
space->set_default_area(area);
|
||||
area->set_space(space);
|
||||
area->set_priority(-1);
|
||||
RID sgb = body_create();
|
||||
RID sgb = RID_PRIME(body_create());
|
||||
body_set_space(sgb, id);
|
||||
body_set_mode(sgb, BODY_MODE_STATIC);
|
||||
space->set_static_global_body(sgb);
|
||||
|
@ -212,7 +212,7 @@ RID Physics2DServerSW::space_create() {
|
||||
Space2DSW *space = memnew(Space2DSW);
|
||||
RID id = space_owner.make_rid(space);
|
||||
space->set_self(id);
|
||||
RID area_id = area_create();
|
||||
RID area_id = RID_PRIME(area_create());
|
||||
Area2DSW *area = area_owner.get(area_id);
|
||||
ERR_FAIL_COND_V(!area, RID());
|
||||
space->set_default_area(area);
|
||||
|
@ -940,14 +940,14 @@ void PortalRenderer::_load_finalize_roaming() {
|
||||
instance_moving_update(handle, aabb, true);
|
||||
}
|
||||
|
||||
for (int n = 0; n < _rghost_pool.active_size(); n++) {
|
||||
for (unsigned int n = 0; n < _rghost_pool.active_size(); n++) {
|
||||
RGhost &moving = _rghost_pool.get_active(n);
|
||||
const AABB &aabb = moving.exact_aabb;
|
||||
|
||||
rghost_update(_rghost_pool.get_active_id(n) + 1, aabb, true);
|
||||
}
|
||||
|
||||
for (int n = 0; n < _occluder_pool.active_size(); n++) {
|
||||
for (unsigned int n = 0; n < _occluder_pool.active_size(); n++) {
|
||||
VSOccluder &occ = _occluder_pool.get_active(n);
|
||||
int occluder_id = _occluder_pool.get_active_id(n);
|
||||
|
||||
@ -1048,7 +1048,7 @@ void PortalRenderer::rooms_and_portals_clear() {
|
||||
moving.rooms_and_portals_clear();
|
||||
}
|
||||
|
||||
for (int n = 0; n < _rghost_pool.active_size(); n++) {
|
||||
for (unsigned int n = 0; n < _rghost_pool.active_size(); n++) {
|
||||
RGhost &moving = _rghost_pool.get_active(n);
|
||||
moving.rooms_and_portals_clear();
|
||||
}
|
||||
@ -1162,7 +1162,7 @@ int PortalRenderer::cull_convex_implementation(const Vector3 &p_point, const Vec
|
||||
}
|
||||
|
||||
String PortalRenderer::_rid_to_string(RID p_rid) {
|
||||
return _addr_to_string(p_rid.get_data());
|
||||
return itos(p_rid.get_id());
|
||||
}
|
||||
|
||||
String PortalRenderer::_addr_to_string(const void *p_addr) {
|
||||
|
@ -291,7 +291,7 @@ private:
|
||||
|
||||
// occluders
|
||||
TrackedPooledList<VSOccluder> _occluder_pool;
|
||||
TrackedPooledList<VSOccluder_Sphere> _occluder_sphere_pool;
|
||||
TrackedPooledList<VSOccluder_Sphere, uint32_t, true> _occluder_sphere_pool;
|
||||
|
||||
PVS _pvs;
|
||||
|
||||
|
@ -159,7 +159,7 @@ RID VisualServer::get_test_texture() {
|
||||
|
||||
Ref<Image> data = memnew(Image(TEST_TEXTURE_SIZE, TEST_TEXTURE_SIZE, false, Image::FORMAT_RGB8, test_data));
|
||||
|
||||
test_texture = texture_create_from_image(data);
|
||||
test_texture = RID_PRIME(texture_create_from_image(data));
|
||||
|
||||
return test_texture;
|
||||
}
|
||||
@ -325,7 +325,7 @@ RID VisualServer::get_white_texture() {
|
||||
}
|
||||
}
|
||||
Ref<Image> white = memnew(Image(4, 4, 0, Image::FORMAT_RGB8, wt));
|
||||
white_texture = texture_create();
|
||||
white_texture = RID_PRIME(texture_create());
|
||||
texture_allocate(white_texture, 4, 4, 0, Image::FORMAT_RGB8, TEXTURE_TYPE_2D);
|
||||
texture_set_data(white_texture, white);
|
||||
return white_texture;
|
||||
|
Loading…
Reference in New Issue
Block a user