Add option to use handles to RID

Adds an option to compile an alternative implementation for RIDs, which allows checks for erroneous usage patterns as well as providing leak tests.
This commit is contained in:
lawnjelly 2021-11-09 12:00:07 +00:00
parent 4c8cc2ab7c
commit 3d981b8265
82 changed files with 874 additions and 245 deletions

View File

@ -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)

View File

@ -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.

View File

@ -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;
};

View File

@ -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

View File

@ -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
View 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
View 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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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);

View File

@ -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();

View File

@ -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));

View File

@ -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);

View File

@ -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];

View File

@ -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
}

View File

@ -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);

View File

@ -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);

View File

@ -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));

View File

@ -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());

View File

@ -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()) {

View File

@ -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());
}

View File

@ -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();
}

View File

@ -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));

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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());

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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")) {

View File

@ -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;

View File

@ -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);

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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: {
};

View File

@ -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);

View File

@ -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);

View File

@ -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]);
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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() {

View File

@ -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() {

View File

@ -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;

View File

@ -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),

View File

@ -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;

View File

@ -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()) {

View File

@ -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);

View File

@ -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);
}

View File

@ -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;

View File

@ -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;

View File

@ -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));
}

View File

@ -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();

View File

@ -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));
}

View File

@ -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))) {
}

View File

@ -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();

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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())) {
}

View File

@ -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));
}

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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);
}

View File

@ -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();

View File

@ -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));

View File

@ -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);

View File

@ -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() {

View File

@ -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);

View File

@ -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);

View File

@ -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) {

View File

@ -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;

View File

@ -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;