3DCoat  3D-COAT 4.9.xx
3DCoat is the one application that has all the tools you need to take your 3D idea from a block of digital clay all the way to a production ready, fully textured organic or hard surface model.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
πŸŒ€ Π‘ΠΊΡ€ΠΈΠΏΡ‚ΠΈΠ½Π³

БоглашСния

ΠŸΡ€ΠΈ создании скриптинга для 3DCoat использовались соглашСния, Π·Π½Π°Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ упростит Ρ‚Π΅Π±Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

  1. Π’ скриптингС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ fluent-интСрфСйс. Π’. Π΅. моТСшь ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².
    Builder b;
    Mesh m = b.sphere().radius( 7 ).details( 0.5 ).build();
  2. Названия классов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
  3. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаём Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π³Ρ€ΡƒΠΏΠΏ. Для этого Π·Π°Π²ΠΎΠ΄ΠΈΠΌ классы-синглСтоны: Builder, UI, Coat, Debug ΠΈ Ρ‚.ΠΏ..
  4. Названия классов ΠΏΠΈΡˆΡƒΡ‚ΡΡ с прописной Π±ΡƒΠΊΠ²Ρ‹.
  5. Названия ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΈΡˆΡƒΡ‚ΡΡ со строчной Π±ΡƒΠΊΠ²Ρ‹.
  6. Π‘ΠΈΠΌΠ²ΠΎΠ» подчёркивания Π½ΠΈ Π² названиях классов, Π½ΠΈ Π² названиях ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π² camelCase-Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ.
  7. Бвойства класса - Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠΈΠΌΡ‘Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.
  8. Π“Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΈ сСттСры Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π±Π΅Π· прСфикса get ΠΈ set.
  9. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ всСгда прСдставлСно Ρ‚ΠΈΠΏΠΎΠΌ int.
  10. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ количСство, прСдставлСны ΠΊΠ°ΠΊ countΠΠ°Π·Π²Π°Π½ΠΈΠ΅Π’ΠΎΠœΠ½Π§().
  11. Рядом с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΌΠΈ количСство, Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²ΠΈΠ΄Π° hasΠΠ°Π·Π²Π°Π½ΠΈΠ΅Π’ΠΎΠœΠ½Π§().
  12. Π‘ΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² скриптС. НапримСр, topRadius( a ) ΠΈ bottomRadius( b ) эквивалСнтны ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ radius( a, b ).
  13. НСкоторыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ способны "Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ" свои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. НапримСр, вмСсто position( Vec3( 0, 120, 0 ) ) моТСшь ΠΏΠΈΡΠ°Ρ‚ΡŒ positionTop( 0, 120, 0 ).
  14. ΠŸΠΎΠ΄Ρ‡ΠΈΠ½Ρ‘Π½Π½Ρ‹Π΅ классы ΠΈ пСрСчислСния "ΡƒΡ‚ΠΎΠΏΠ»Π΅Π½Ρ‹" Π² namespac'Ρ‹, Π½ΠΎ *Π½Π΅ Π³Π»ΡƒΠ±ΠΆΠ΅*, Ρ‡Π΅ΠΌ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ. НапримСр, класс PolyMesh::FaceInfo содСрТит ΠΏΠΎΠ΄Ρ‡ΠΈΠ½Ρ‘Π½Π½Ρ‹ΠΉ enum UVEdgeMask. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ этого пСрСчислСния доступны ΠΈΠ· скриптов ΠΏΠΎ прСфиксу PolyMesh::UVEdgeMask::.
  15. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, рСгистрации классов, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ, ΠΏΠΎ возмоТности, Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС.

Π‘ΠΊΡ€ΠΈΠΏΡ‚-Π΄Π²ΠΈΠΆΠΎΠΊ 3DCoat Π±Ρ‹Π» ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСписан. Для обСспСчСния ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости, оставлСны всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ· ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° (см. Ρ„Π°ΠΉΠ» ScriptInterface.h).

Π—Π° основу оформлСния ΠΊΠΎΠ΄Π° для *Π½ΠΎΠ²ΠΎΠ³ΠΎ скриптинга* взят класс Mat3. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ этот класс ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ создании своих классов.

Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой класс

К Π΄Π΅Π»Ρƒ!)

3DCoat Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с AngelScript. Π‘ΠΌ. ΠΎ Π½Ρ‘ΠΌ Π½Π° сайтС ΠΈ Π² сСкции Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ скриптинга.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ класс Vec3 для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с 3D-Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ Π² скриптах 3DCoat.

Для этого создадим Π² ΠΏΠ°ΠΏΠΊΠ΅ Scripto Ρ„Π°ΠΉΠ» SVec3.h.

Warning
ВсСгда добавляй прСфикс S Π² названия Ρ„Π°ΠΉΠ»ΠΎΠ² скриптинга: C++Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅Π±Π΅ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½.
namespace coat {
namespace scripto {
class Vec3 {
public:
typedef comms::cVec< float, 3 > vec3_t;
struct About {
vec3_t v;
};
public:
Vec3() : a( {} ) {}
Vec3( const vec3_t& v ) : a( { v } ) {}
Vec3( float xyz ) : a( { { xyz, xyz, xyz } } ) {}
private:
const vec3_t& v() const { return a.v; }
vec3_t& v() { return a.v; }
private:
About a;
};
class RegisterVec3 : public RegisterLikeNew< Vec3 > {
public:
static void opConstructXYZ( float x, float y, float z, Vec3* in ) {
new ( in )Vec3( Vec3::vec3_t( x, y, z ) );
}
};
} } // coat scripto

ПоявлСниС RegisterVec3 ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ нашСго класса Π² C++ΠΊΠΎΠ΄Π΅ (см. Π½ΠΈΠΆΠ΅).

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° About - удобная ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠ° ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ классов скриптинга. Она позволяСт Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ наслСдуСмого C++ΠΊΠΎΠ΄Π°, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ доступным ΠΈΠ· скриптов.

ΠœΠ΅Ρ‚ΠΎΠ΄ v() прСдоставляСт доступ ΠΊ элСмСнту About::v. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… "Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°".

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΡ‘Π½ coat::scripto Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½Π΅ просто Ρ‚Π°ΠΊ: ΠΎΠ½ΠΎ обСспСчит Ρ‚Π΅Π±Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ программистам ПилгвСй Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΡ‘Π½ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ классы Π² Ρ„Π°ΠΉΠ»Π΅ Scripto.cpp.

ЗарСгистрируСм Vec3:

// рСгистрируСм Ρ‚ΠΈΠΏ
csRTypeCDA( Vec3, engine );
// рСгистрируСм конструктор
csRConstr( Vec3, XYZ, (float, float, float), engine );

csRTypeCDA ΠΈ csRConstr - это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, макросы.

Они ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. БомнСваСшься? Π§Ρ‚ΠΎ ΠΆ, Ρ‚Ρ‹ Π²ΠΏΡ€Π°Π²Π΅ вмСсто ΠΊΠΎΠ΄Π° Π²Ρ‹ΡˆΠ΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

// рСгистрируСм Ρ‚ΠΈΠΏ
rtype(engine, "Vec3",
sizeof( Vec3 ), asOBJ_VALUE | asOBJ_APP_CLASS_CDA);
rbeh(engine, "Vec3", asBEHAVE_CONSTRUCT,
"void f()", asFUNCTION( RegisterVec3::opConstruct ));
rbeh(engine, "Vec3", asBEHAVE_DESTRUCT,
"void f()", asFUNCTION( RegisterVec3::opDestruct ));
rmethod(engine, "Vec3",
"className& opAssign(const className &in)",
asFUNCTION( RegisterVec3::opAssign ));
// рСгистрируСм конструктор
rbeh(engine, "Vec3", asBEHAVE_CONSTRUCT,
"void f(float, float, float)",
asFUNCTION( RegisterVec3::opConstructXYZ ));

Π­Ρ‚ΠΈ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΊΠΎΠ΄Π° Π΄Π΅Π»Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ благодаря соглашСниям, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… придСрТиваСмся ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ *любого* класса скриптинга.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ список макросов для рСгистрации ΠΏΠΎΡ‡Ρ‚ΠΈ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ классов моТСшь Π½Π°ΠΉΡ‚ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ SMacros.h.

На этом с конструкторами ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. Но, допустим, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Тизнь скрипт-программиста приятнСй. Для этого Π΄Π°Π΄ΠΈΠΌ Π΅ΠΌΡƒ Π΅Ρ‰Ρ‘ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… конструктора для нашСго класса:

// инициализация Ρ‚Ρ€Ρ‘Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΎΠ΄Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ
csRConstr( Vec3, All, (float), engine );
// инициализация Π² Π²ΠΈΠ΄Π΅ списка Π² стилС C++11
csRListConstr( Vec3, Elements, "(int &in) { float, float, float }", engine );

Π° Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ конструкторы Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² RegisterVec3 ΠΏΠ°Ρ€Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

static void opConstructAll( float v, Vec3* in ) {
opConstructXYZ( v, v, v, in );
}
static void opConstructXYZ( float x, float y, float z, Vec3* in ) {
new ( in )Vec3( Vec3::vec3_t( x, y, z ) );
}
static void opListConstructElements( const float* l, Vec3* in ) {
opConstructXYZ( l[ 0 ], l[ 1 ], l[ 2 ], in );
}

Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π».

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сравнСния сСбя с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ

bool operator==(const Vec3& b) const {
return v() == b.v();
}

Π“Π΅Ρ‚Ρ‚Π΅Ρ€Ρ‹ ΠΈ сСттСры для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚

Vec3& x( const float& value ) { v()[ 0 ] = value; return *this; }
float x() const { return v()[ 0 ]; }
Vec3& y( const float& value ) { v()[ 1 ] = value; return *this; }
float y() const { return v()[ 1 ]; }
Vec3& z( const float& value ) { v()[ 2 ] = value; return *this; }
float z() const { return v()[ 2 ]; }

Плюс Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΊ со списком

Vec3& operator()( int i, float value ) { v()[ i ] = value; return *this; }
float operator()( int i ) const { return v()[ i ]; }

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ для измСнСния Π·Π½Π°ΠΊΠ° Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚

Vec3 operator-() const { return Vec3( -v() ); }

ΠΈ взятиС модуля ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΊΠ°ΠΊ самого Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊ ΠΈ дублируя Π΅Π³ΠΎ (см. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой класс).

Vec3& abs() { *this = absCopy(); return *this; }
Vec3 absCopy() const { return vec3_t::Abs( v() ); }

Π’Π°ΠΊΠΆΠ΅ приятным Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π²ΠΎΠΈΠΌ классом, окаТСтся функция удСрТания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, Π² срСдС программистов извСстная ΠΊΠ°ΠΊ clamp

Vec3& clamp( float min, float max ) {
this = clampCopy( min, max );
return *this;
}
Vec3 clampCopy( float min, float max ) const {
return vec3_t::Clamp( v(), min, max );
}
Vec3& clamp( const Vec3& min, const Vec3& max ) {
this = clampCopy( min, max );
return *this;
}
Vec3 clampCopy( const Vec3& min, const Vec3& max ) const {
return vec3_t::Clamp( v(), min.v(), max.v() );
}

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ арифмСтичСским опСрациям ΠΎΠ½ Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π΄

Vec3& operator+=( const Vec3& b ) { v() += b.v(); return *this; }
Vec3& operator-=( const Vec3& b ) { v() -= b.v(); return *this; }
Vec3& operator*=( const Vec3& b ) { v() *= b.v(); return *this; }
Vec3& operator*=( const float& k ) { v() *= k; return *this; }
Vec3& operator/=( const Vec3& b ) { v() /= b.v(); return *this; }
Vec3& operator/=( const float& k ) { v() /= k; return *this; }
Vec3 operator+( const Vec3& b ) const { return Vec3( v() + b.v() ); }
Vec3 operator-( const Vec3& b ) const { return Vec3( v() - b.v() ); }
Vec3 operator*( const Vec3& b ) const { return Vec3( v() * b.v() ); }
Vec3 operator*( const float& k ) const { return Vec3( v() * k ); }
Vec3 operator/( const Vec3& b ) const { return Vec3( v() / b.v() ); }
Vec3 operator/( const float& k ) const { return Vec3( v() / k ); }

Π—Π½Π°Π½ΠΈΠ΅, Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π»ΠΈ наш Π²Π΅ΠΊΡ‚ΠΎΡ€? ΠœΠΎΠΆΠ΅Ρ‚, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ нулями?

bool normalized() const { return v().IsNormalized(); }
bool zero() const { return v().IsZero(); }

ΠΈ сама нормализация

Vec3& normalize() {
this = normalizeCopy(); return *this;
}
Vec3 normalizeCopy() const {
return vec3_t::Normalize( v() );
}

ΠžΠΊΡ€ΡƒΠ³Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ ΠΈ Π½Π΅Ρ‚?

Vec3& round() { *this = roundCopy(); return *this; }
Vec3 roundCopy() const { return vec3_t::Round( v() ); }

ΠŸΡƒΡΡ‚ΡŒ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΠ³ΠΎΠ», ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌΡ‹ΠΉ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ

float angle( const Vec3& b ) const {
return vec3_t::Angle( v(), b.v() );
}

РасстояниС Π΄ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, ΠΊΠΎΠ³Π΄Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ 3D-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹

float distance( const Vec3& b ) const {
return vec3_t::Distance( v(), b.v() );
}

Π”Π»ΠΈΠ½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π°

float length() const { return v().Length(); }

ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π΄Π»ΠΈΠ½Ρ‹ для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ быстрый ΠΊΠΎΠ΄

float lengthSquared() const { return v().LengthSq(); }

dot- ΠΈ cross-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΊΡƒΠ΄Π° ΠΆΠ΅ Π±Π΅Π· Π½ΠΈΡ… Π² 3D-Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅?) ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ, cross сдСлаСм Π² Π΄Π²ΡƒΡ… Π²ΠΈΠ΄Π°Ρ…: ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ сам Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ копию Π²Π΅ΠΊΡ‚ΠΎΡ€Π° (см. Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой класс).

float dot( const Vec3& b ) const { return vec3_t::Dot( v(), b.v() ); }
Vec3& cross( const Vec3& b ) { *this = crossCopy( b.v() ); return *this; }
Vec3 crossCopy( const Vec3& b ) const { return vec3_t::Cross( v(), b.v() ); }

Вспомним ΠΈ ΠΎΠ± интСрполяции

Vec3& lerp( const Vec3& b, float s ) {
this = lerpCopy( b, s );
return *this;
}
Vec3 lerpCopy( const Vec3& b, float s ) const {
return vec3_t::Lerp( v(), b.v(), s );
}
Vec3& slerp( const Vec3& b, float s ) {
this = slerpCopy( b, s );
return *this;
}
Vec3 slerpCopy( const Vec3& b, float s ) const {
return vec3_t::Slerp( v(), b.v(), s );
}

Наш Π²Π΅ΠΊΡ‚ΠΎΡ€ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ значСния для создания эффСктивного ΠΊΠΎΠ΄Π°

static const Vec3 ONE;
static const Vec3 UNDEFINED;
static const Vec3 ZERO;

ΠΈ сумССт ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² строку

operator std::string() const;

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Π΅Π±Π΅ большС, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Vec3, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ случайным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ

static Vec3 rand( float min, float max ) {
return rand( Vec3( min ), Vec3( max ) );
}
static Vec3 rand( const Vec3& min, const Vec3& max );

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° этом, осознав, Ρ‡Ρ‚ΠΎ сСйчас наша Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ созданиС Π½Π°Π²ΠΎΡ€ΠΎΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ 3D-Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, Π° Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ создания Π½ΠΎΠ²ΠΎΠ³ΠΎ класса для скриптинга Π½Π° AngelScript.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° ΠΎΠ΄Π½ΠΈΠΌ H-Ρ„Π°ΠΉΠ»ΠΎΠΌ Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ...

ВынСсСм Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² CPP-Ρ„Π°ΠΉΠ»:

#include "stdafx.h"
#include "SVec3.h"
#include "helper/Funcs.h"
namespace coat {
namespace scripto {
const Vec3 Vec3::ONE( 1 );
const Vec3 Vec3::UNDEFINED( {
make::undefined< float >(),
make::undefined< float >(),
make::undefined< float >() } );
const Vec3 Vec3::ZERO( 0 );
Vec3 Vec3::rand( const Vec3& min, const Vec3& max ) {
return Vec3( {
comms::cMath::Rand( min.x(), max.x() ),
comms::cMath::Rand( min.y(), max.y() ),
comms::cMath::Rand( min.z(), max.z() )
} );
}
Vec3::operator std::string() const {
// просто, Π½ΠΎ Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ
std::ostringstream ss;
ss << v();
return ss.str();
}
} } // coat scripto

Помнишь, Π²Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ рСгистрировали конструкторы Vec3 Π² Ρ„Π°ΠΉΠ»Π΅ Scripto.cpp? ВозвращаСмся ΠΊ Π½Π΅ΠΌΡƒ ΠΈ дописываСм:

csRValueOf_( Vec3, rand, (float, float), engine );
csRValueOf( Vec3, rand, (const Vec3 &in, const Vec3 &in), (const Vec3&, const Vec3&), engine );
csRImplConv( Vec3, string, engine );
csREquals( Vec3, engine );
csRG_( Vec3, normalized, bool, engine );
csRG_( Vec3, zero, bool, engine );
csRSIndexFunctor_( Vec3, (int, float), engine );
csRGIndexFunctor_( Vec3, (int) const, float, engine );
csRSG_( Vec3, x, float, engine );
csRSG_( Vec3, y, float, engine );
csRSG_( Vec3, z, float, engine );
csRNeg( Vec3, engine );
csRAddAssignSame( Vec3, engine );
csRSubAssignSame( Vec3, engine );
csRMulAssignSame( Vec3, engine );
csRMulAssign_( Vec3, float, engine );
csRDivAssignSame( Vec3, engine );
csRDivAssign_( Vec3, float, engine );
csRAddSame( Vec3, engine );
csRSubSame( Vec3, engine );
csRMulSame( Vec3, engine );
csRMul_( Vec3, float, engine );
csRMulR_( Vec3, float, engine );
csRDivSame( Vec3, engine );
csRDiv_( Vec3, float, engine );
csRPOther__( Vec3, float, angle, (const Vec3 &in) const, engine );
csRPOther__( Vec3, float, distance, (const Vec3 &in) const, engine );
csRPOther__( Vec3, float, dot, (const Vec3 &in) const, engine );
csRG_( Vec3, length, float, engine );
csRG_( Vec3, lengthSquared, float, engine );
csRMPAndCopy_( Vec3, abs, (), engine );
csRMPAndCopy_( Vec3, clamp, (float, float), engine );
csRPAndCopy_( Vec3, Vec3, clamp, (const Vec3 &in, const Vec3 &in), (const Vec3&, const Vec3&), engine );
csRMPAndCopy_( Vec3, cross, (const Vec3 &in), engine );
csRPAndCopy__( Vec3, Vec3, lerp, (const Vec3 &in, float), engine );
csRMPAndCopy_( Vec3, normalize, (), engine );
csRMPAndCopy_( Vec3, round, (), engine );
csRPAndCopy__( Vec3, Vec3, slerp, (const Vec3 &in, float), engine );

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ класс Vec3 содСрТит Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… здСсь возмоТностСй, Π½ΠΎ Ρ€Π°Π·Π²Π΅ Ρ‚Π΅Π±Π΅ для понимания ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ свой класс Π² скриптинг 3DCoat этого нСдостаточно?

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ созданный Π½Π°ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ класс Π² 3DCoat.

Vec3 a( 10, 30, 90 );
Vec3 b = { 11, 33, 99 };
Vec3 plus = a + b;
Vec3 minus = a - b;
if (a == b) {
...
}
float theta = a.angle( b );
Vec3 randomA = Vec3::rand(
Vec3( -30, -20, -10 ),
Vec3( 70, 80, 90 ) );
Vec3 randomB = Vec3::rand( -30, 90 );
float distance = a.distance( b );
float length = a.length();
float lengthSq = a.lengthSquared();
string s = (string) a;
...

Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свою Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… принятых соглашСний Π½Π΅ рСкомСндуСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ *Π±Π΅Π·* класса (Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ "Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ").

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ это, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ТСлаСмая Ρ‚ΠΎΠ±ΠΎΠΉ функция ΡΡ‚Π°Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΡƒΠΆΠ΅ созданных классов?

  • Builder - здСсь собраны "строитСли" ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² 3DCoat.
  • Debug - всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈ тСкстовой ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.
  • Safety - ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚Π²ΠΎΠ΅Π³ΠΎ скрипта.
  • UI - всё, Ρ‡Ρ‚ΠΎ связано с интСрфСйсом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ 3DCoat.
  • Coat - всё, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ написании скриптов, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π½ΠΈ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· прСдставлСнных Π²Ρ‹ΡˆΠ΅ классов.

Но Ссли свою Π·Π°Π΄ΡƒΠΌΠ°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΡƒΠΆΠ΅ созданных классах Π½Π΅ видишь, рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ связывания Ρ‚Π²ΠΎΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с C++ΠΊΠΎΠ΄ΠΎΠΌ.

НапримСр, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π΄Π΅Π»Π°Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ 3DCoat.

Для этого Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ„Π°ΠΉΠ»Π΅ ScriptInterface.h. Для простоты Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ здСсь ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

void toRoom( const std::string& codeName ) {
// Наша функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹
// ΠΈ, Ссли такая ΠΊΠΎΠΌΠ½Π°Ρ‚Π° сущСствуСт, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ 3DCoat Π½Π° Π½Π΅Ρ‘.
}

Π’ RegisterScriptFunctions() дописываСм строку

regf( engine, "void toRoom( string &in )", toRoom );

3DCoat Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ RegisterScriptFunctions() Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° Π΄ΠΎ использования нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ toRoom(), поэтому ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄

toRoom( "Sculpt" );

ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ нас Π² Π‘ΠΊΡƒΠ»ΡŒΠΏΡ‚-ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ.

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, этого ΠΆΠ΅ Ρ‚Ρ‹ ΠΌΠΎΠ³ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ, ΠΈΠ·ΡƒΡ‡ΠΈΠ² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ скриптингу, ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ², Ρ‡Ρ‚ΠΎ для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Π‘ΠΊΡƒΠ»ΡŒΠΏΡ‚-ΠΊΠΎΠΌΠ½Π°Ρ‚Ρƒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ AngelScript-ΠΊΠΎΠ΄:

SculptRoom room;

Π˜Π·ΡƒΡ‡Π°ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, пиши свой ΠΊΠΎΠ΄ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Одним ΠΈΠ· ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ *ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ* ΠΈ слоТно - *Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ*.

Π“Π΄Π΅ ΠΆΠΈΠ²ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π’ Π²Π΅ΠΊ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π° ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΊΡ‚ΠΎ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ язык программирования, ΠΈΡ‰Π΅Ρ‚, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования. А ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΆΠ°ΠΆΠ΄Π΅Ρ‚ сразу Π½Π°ΠΉΡ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ **своСй** Π·Π°Π΄Π°Ρ‡ΠΈ) И, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ!

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈ описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-классов скриптинга ΠΆΠΈΠ²ΡƒΡ‚ ΠΏΠΎ этой ссылкС.

Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ скриптинга

МСня попросили Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ этот Ρ€Π°Π·Π΄Π΅Π», Π½ΠΎ, ΠΏΡ€ΠΈΠ·Π½Π°ΡŽΡΡŒ, я Π½Π΅ понимаю Π·Π°Ρ‡Π΅ΠΌ.

Π’Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΡˆΡŒ программистом C++, ΠΏΠΎΡ‡ΠΈΡ‚Π°Π» ΠΎ принятых ΡΠΎΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡΡ…, знаСшь, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой класс, свою Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… доступными для скриптов 3DCoat. Π—Π½Π°Ρ‡ΠΈΡ‚, понимаСшь, Ρ‡Ρ‚ΠΎ основная Ρ€Π°Π±ΠΎΡ‚Π° ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π° ΠΈ для "Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°" ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ стратСгии:

  1. Π£Π·Π½Π°Ρ‘ΡˆΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚ тСбя хотят.
  2. Π˜Ρ‰Π΅ΡˆΡŒ ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ класс ΠΈ Π±Π΅Ρ€Ρ‘ΡˆΡŒ Π΅Π³ΠΎ Π·Π° основу.
  3. ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΡˆΡŒ, мСняСшь, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΡˆΡŒ - ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΡˆΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Когда ΠΏΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡˆΡŒ синтаксис AngelScript, ΡƒΠ²ΠΈΠ΄ΠΈΡˆΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ большСй Ρ‡Π°ΡΡ‚ΡŒΡŽ повторяСт синтаксис C++. ΠŸΠΎΡ‡ΠΈΡ‚Π°Π² ΠΈ ΠΏΠΎΠΈΠ³Ρ€Π°Π²ΡˆΠΈΡΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ, ΡƒΠ±Π΅Π΄ΠΈΡˆΡŒΡΡ ΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эти скрипты Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ, ΠΎΡ‡Π΅Π½ΡŒ быстро (скаТу ΠΏΠΎ сСкрСту: основная ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° - строгая типизация).

Но ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ дальшС ΠΈ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΡŽ AngelScript, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ²ΡˆΠΈΡΡŒ Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ скрипт-Π΄Π²ΠΈΠΆΠΊΠΎΠΌ вмСстС с Andreas Jonsson. Andreas - ΠΎΠ΄ΠΈΠ½ ΠΈΠ· программистов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ΄Ρ‘Ρ‚ Π² Π½ΠΎΠ³Ρƒ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. НапримСр, AngelScript Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» Ρƒ сСбя списки ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΠ·Π²ΡƒΡ‡Π΅Π½Ρ‹ Π² стандартС C++11. И ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π»Π΅Ρ‚ ΠΆΠ΄ΡƒΡ‚ сишники, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² AngelScript Π΄Π°Π²Π½Ρ‹ΠΌ-Π΄Π°Π²Π½ΠΎ.

Π•ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Ρ‘ прСдстоит Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π² этом скрипт-Π΄Π²ΠΈΠΆΠΊΠ΅.

ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΠΉΡΡ!) Π­Ρ‚ΠΎ интСрСсно ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.

Π’Π°ΠΊΠΆΠ΅, Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ хотя Π±Ρ‹ Ρ€Π°Π· Π² Π³ΠΎΠ΄ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ появилось Π² AngelScript ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² 3DCoat. Помимо Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, исправлСнных ошибок, Ρ‚Ρ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΡˆΡŒ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ AngelScript принСсло 3DCoat'Ρƒ ускорСниС скрипт-ΠΊΠΎΠ΄Π° Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² 3 Ρ€Π°Π·Π°!

Π”Π°, ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ 3DCoat ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ скрипт-Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ. Π’Π΅ΠΌ ΠΆΠ΅ Python, JavaScript ΠΈ Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ Π³Ρ€ΠΎΠΌΠΊΠΈΠΌ Lua. Для этого:

  1. Найди ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ C++Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π½Π° сСгодня ΠΈΡ… Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚).
  2. УбСдись, Ρ‡Ρ‚ΠΎ лицСнзия допускаСт ΠΈΡ… использованиС Π² коммСрчСском ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.
  3. БвяТи доступныС Π² AngelScript классы ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ Π΄Π²ΠΈΠΆΠΊΠ°ΠΌΠΈ. Π›ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ "ΠΏΠΎΠ΄ ΠΊΠΎΠΏΠΈΡ€ΠΊΡƒ" классы, созданныС ΠΏΠΎΠ΄ AngelScript, Π° *Π·Π°Π²ΡΠ·Π°Ρ‚ΡŒ* Π½Π° Π½ΠΈΡ… Π½ΠΎΠ²Ρ‹Π΅ классы, пробрасывая ΠΊ Π½ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ…ΠΎΡ‡Π΅ΡˆΡŒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… скрипт-Π΄Π²ΠΈΠΆΠΊΠ°Ρ….
  4. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈ ΠΊΠΎΠ΄, созданный для AngelScript, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ синтаксис Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ скрипт-Π΄Π²ΠΈΠΆΠΊΠ°.
  5. ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠΉ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Когда Ρ‚Π΅Π±Π΅ скаТут ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅, спроси сСбя ΠΈ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΠ°: "ΠšΡ‚ΠΎ всё это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ послС?"

УспСхов!