mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-10-22 21:41:37 +00:00
update rules
This commit is contained in:
parent
31350cd701
commit
cc2c828757
156 changed files with 4981 additions and 1497 deletions
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
globs: **/*.project.json5,**/*.project.json,**/*.meta.json5,**/*.meta.json,**/*.model.json5,**/*.model.json
|
||||
alwaysApply: false
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
# Atlas Project File Format
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
description: "Essential Atlas context: architecture, contribution workflow, and code conventions for this project."
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
description: Luau language syntax, type system, single-threaded model, and common gotchas
|
||||
alwaysApply: true
|
||||
---
|
||||
# Luau Language Rules
|
||||
|
|
|
|||
56
.cursor/rules/luau/math-constants.md
Normal file
56
.cursor/rules/luau/math-constants.md
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
# Math constants
|
||||
|
||||
## Summary
|
||||
|
||||
Expand the constants provided in the `math` library.
|
||||
|
||||
## Motivation
|
||||
|
||||
With the introduction of [`math.isnan`](https://rfcs.luau.org/math-isnan-isfinite-isinf.html), Luau has the opportunity to add a new constant representing `NaN` (Not a Number).
|
||||
As linting support for Luau continues becoming more robust, we can discourage patterns like `0/0` to generate `NaN` and instead provide the constant directly through the math library.
|
||||
|
||||
Without the `math.isnan` API, this could have created confusion in the past:
|
||||
```luau
|
||||
if maybeNan == math.nan do
|
||||
print("This line will never be hit: comparing to NaN always returns false.")
|
||||
end
|
||||
```
|
||||
|
||||
With the new API, however, this is now easier to use:
|
||||
```luau
|
||||
local maybeNan = math.nan
|
||||
if math.isnan(maybeNan) do
|
||||
print("This line will be hit!")
|
||||
end
|
||||
```
|
||||
|
||||
While adding `NaN`, we also have an opportunity to modernize the set of constants available through the `math` library.
|
||||
Some history:
|
||||
- Lua 5.0 (2003) introduced `math.pi`, representing the mathematical constant $\pi$.
|
||||
- Lua 5.1 (2006) introduced `math.huge`, mapping directly to infinity as defined by the [IEEE 754 standard](https://en.wikipedia.org/wiki/IEEE_754).
|
||||
- Lua 5.3 (2015) introduced integers and the `math.maxinteger` and `math.mininteger` constants alongside them.
|
||||
|
||||
Luau currently only supports `math.pi` and `math.huge`.
|
||||
Integer types are not supported in Luau, so `math.maxinteger` and `math.mininteger` wouldn't make much sense, but adding other commonly used constants would be an easy value-add for users of the language.
|
||||
|
||||
## Design
|
||||
|
||||
In addition to `math.pi` and `math.huge`, we propose adding the following constants.
|
||||
|
||||
- `math.nan`: some `NaN` value as defined by IEEE 754.
|
||||
- The exact representation (payload and sign) is unspecified.
|
||||
- Comparing to `math.nan` will always return `false`; lint rules recommend using `math.isnan`.
|
||||
- `math.e`: the mathematical constant $e = 2.71828182845904523536$.
|
||||
- `math.phi`: the golden ratio, defined as $\phi = 1.61803398874989484820$.
|
||||
- `math.sqrt2`: the square root of `2`, defined as equal to `math.sqrt(2)`.
|
||||
- `math.tau`: the mathematical constant $\tau$, defined as equal to `2 * math.pi`.
|
||||
## Drawbacks
|
||||
|
||||
- The semantics of `math.nan` are unique and somewhat unexpected for users not already familiar with IEEE 754's floating-point arithmetic rules.
|
||||
- Adding new constants increases the API surface of the `math` library and diverges further from Lua 5.1.
|
||||
|
||||
## Alternatives
|
||||
|
||||
- Do nothing: continue requiring users to define their own constants (e.g., `local nan = 0/0`, `local e = math.exp(1)`).
|
||||
- Only add `math.nan` without the additional constants, deferring modernization for a future RFC.
|
||||
- Rely on these constants being provided through external libraries.
|
||||
339
.cursor/rules/luau/type-long-integer.md
Normal file
339
.cursor/rules/luau/type-long-integer.md
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
# 64-bit Integer Type
|
||||
|
||||
## Summary
|
||||
|
||||
A builtin 'integer' type to represent 64 bit integer numbers.
|
||||
|
||||
## Motivation
|
||||
|
||||
Current methods of representing 64-bit integers in Luau with default environment are done with high-low pairs or by splitting them among vectors which leads to poor ergonomics and may not be sufficient for cases where performance is important.
|
||||
|
||||
In the case of a high-low pair implementation, each individual number takes 16 bytes (or 24) and needs to be be handled together which can be confusing.
|
||||
|
||||
In the case of vector implementations, ergonomics are improved by storing the entire integer in one value however you have the same issues of implementation complexity and lack of integration with the type system.
|
||||
|
||||
In both cases, performance is lacking compared to what could be provided by a native implementation.
|
||||
|
||||
As Luau grows, the restriction to doubles will be an increasing pain point for any use case which involves a 64-bit integer.
|
||||
System support for 64-bit integers is ubiquitous and their use is widespread.
|
||||
|
||||
Besides the above solutions in userland, runtimes are also able to define their own userdata for 64-bit integers. However, this requires each runtime to reimplement 64-bit integer support themselves, and carries with it the potential of significant differences in their semantics. Such an outcome would harm the ecosystem as a whole, requiring libraries to find a common API across all of their supported runtimes, or otherwise program around differences in their APIs.
|
||||
|
||||
Further, representing 64-bit numbers as heap-allocated userdata is sufficient for correctness, but also adds a layer of indirection for something that could fit within the existing value size. In domains where the use of these numbers is more common, the performance characteristics of these varying implementation techniques could be problematic or even prohibitive.
|
||||
|
||||
Userdata remain the right mechanism for complex or embedder-specific numeric types, but 64-bit integers have a sufficiently large problem domain to justify their inclusion as a core value type, and bring significant benefits for performance and interoperability in the overall Luau ecosystem.
|
||||
|
||||
## Design
|
||||
|
||||
This will be implemented a with new type called `integer`.
|
||||
|
||||
An additional character may be specified at the end of numeric literals `i` which will signify an 64 bit integer literal.
|
||||
64 bit integer literals will support separators, hex, and binary values:
|
||||
|
||||
```luau
|
||||
local a = 123i
|
||||
local b = 1_000i
|
||||
local c = 0xABABi
|
||||
local d = 0b1000_1000i
|
||||
```
|
||||
|
||||
Integer literal numbers have to be exactly representable, overflow is a parsing error.
|
||||
|
||||
Operations performing a string formatting of an integer should format the number as signed by default.
|
||||
|
||||
Integer values will have a built-in equality comparison, but will not have any other operators or metamethods defined.
|
||||
|
||||
Functions for creating and manipulating this type will exist in a new library called 'integer`.
|
||||
|
||||
### Library
|
||||
|
||||
`function integer.create(n: number): integer?`
|
||||
|
||||
Converts a number to an integer.
|
||||
|
||||
Returns `nil` If the double number cannot be represented as an integer exactly, i.e. it has a fractional part, is out of range or is NaN.
|
||||
|
||||
This behavior is chosen to closely match `math.tointeger` from Lua 5.4 and can have a relatively efficient implementation.
|
||||
|
||||
`function integer.fromstring(str: string, base: number?): integer?`
|
||||
|
||||
Converts a string representation of a number into an integer.
|
||||
|
||||
Number inside the string has to be an integer.
|
||||
String is allowed to have leading and trailing spaces and number can be preceded by a sign.
|
||||
If base is not specified, number can have a `0x` or `0X` prefix to be converted in base 16, otherwise base 10 is used.
|
||||
|
||||
When base is specified, it has to be in range between 2 and 36 inclusive.
|
||||
In base 10 and base 16, number is allowed to have a `0x` or `0X` prefix.
|
||||
|
||||
Returns `nil` if the string doesn't contain a number.
|
||||
|
||||
This behavior is chosen to match `tonumber`, but excludes floating-point numbers.
|
||||
|
||||
`function integer.tostring(n: integer): string`
|
||||
|
||||
Converts an integer to a string representation.
|
||||
|
||||
`function integer.tonumber(n: integer): number`
|
||||
|
||||
Converts an integer to a double.
|
||||
|
||||
If the value cannot be represented as a double exactly, round to nearest, tie to even rounding mode is used.
|
||||
|
||||
`function integer.neg(a: integer): integer`
|
||||
|
||||
Negates the value.
|
||||
Overflow wraps around according to rules of two-complement arithmetic.
|
||||
|
||||
`function integer.add(a: integer, b: integer): integer`
|
||||
|
||||
Adds `a` to `b`.
|
||||
Overflow wraps around according to rules of two-complement arithmetic.
|
||||
|
||||
`function integer.sub(a: integer, b: integer): integer`
|
||||
|
||||
Subtracts `b` from `a`.
|
||||
Overflow wraps around according to rules of two-complement arithmetic.
|
||||
|
||||
`function integer.mul(a: integer, b: integer): integer`
|
||||
|
||||
Multiplies `a` and `b`.
|
||||
Overflow wraps around according to rules of two-complement arithmetic.
|
||||
|
||||
`function integer.div(a: integer, b: integer): integer`
|
||||
|
||||
Performes signed truncated division of `a` by `b`.
|
||||
|
||||
If `b` is 0, throws a division by zero error.
|
||||
|
||||
If `a` is -2^63 and `b` is -1, throws an overflow error.
|
||||
|
||||
`function integer.rem(a: integer, b: integer): integer`
|
||||
|
||||
Computes remainder of the signed truncated division of `a` by `b`.
|
||||
|
||||
If `b` is 0, throws a division by zero error.
|
||||
|
||||
If `a` is -2^63 and `b` is -1, result is 0.
|
||||
|
||||
`function integer.idiv(a: integer, b: integer): integer`
|
||||
|
||||
Performes signed floored division of `a` by `b`.
|
||||
|
||||
If `b` is 0, throws a division by zero error.
|
||||
|
||||
If `a` is -2^63 and `b` is -1, throws an overflow error.
|
||||
|
||||
`function integer.mod(a: integer, b: integer): integer`
|
||||
|
||||
Performes signed floored modulus division of `a` by `b`.
|
||||
|
||||
If `b` is 0, throws a division by zero error.
|
||||
|
||||
If `a` is -2^63 and `b` is -1, result is 0.
|
||||
|
||||
`function integer.udiv(a: integer, b: integer): integer`
|
||||
|
||||
Performs unsigned division of `a` by `b`.
|
||||
|
||||
If `b` is 0, throws an error.
|
||||
|
||||
`function integer.urem(a: integer, b: integer): integer`
|
||||
|
||||
Computes remainder of the unsigned division of `a` by `b`.
|
||||
|
||||
If `b` is 0, throws an error.
|
||||
|
||||
`function integer.min(a: integer, b: integer): integer`
|
||||
|
||||
Returns the smallest of two integer numbers.
|
||||
|
||||
`function integer.max(a: integer, b: integer): integer`
|
||||
|
||||
Returns the largest of two integer numbers.
|
||||
|
||||
`function integer.clamp(a: integer, min: integer, max: integer): integer`
|
||||
|
||||
Returns `a` if the number is in `[min, max]` range; otherwise, returns `min` when `a < min`, and `max` otherwise.
|
||||
|
||||
The function errors if `min > max`, consistent with `math.clamp`.
|
||||
|
||||
`function integer.band(a: integer, b: integer): integer`
|
||||
|
||||
Performs a bitwise and of `a` and `b`.
|
||||
|
||||
`function integer.bor(a: integer, b: integer): integer`
|
||||
|
||||
Performs a bitwise or of `a` and `b`.
|
||||
|
||||
`function integer.bnot(a: integer): integer`
|
||||
|
||||
Returns a bitwise negation of the input number.
|
||||
|
||||
`function integer.bxor(a: integer, b: integer): integer`
|
||||
|
||||
Performs a bitwise xor (exclusive or) of `a` and `b`.
|
||||
|
||||
`function integer.lt(a: integer, b: integer): boolean`
|
||||
|
||||
Compares signed less than (<) comparison of `a` and `b`.
|
||||
|
||||
`function integer.le(a: integer, b: integer): boolean`
|
||||
|
||||
Compares signed less than or equal (<=) comparison of `a` and `b`.
|
||||
|
||||
`function integer.ult(a: integer, b: integer): boolean`
|
||||
|
||||
Compares unsigned less than (<) comparison of `a` and `b`.
|
||||
|
||||
`function integer.ule(a: integer, b: integer): boolean`
|
||||
|
||||
Compares unsigned less than or equal (<=) comparison of `a` and `b`.
|
||||
|
||||
`function integer.lshift(n: integer, i: integer): integer`
|
||||
|
||||
Shifts `n` to the left by `i` bits (if `i` is negative, a right shift is performed instead).
|
||||
|
||||
When `i` is outside of `[-63..63]` range, returns 0.
|
||||
|
||||
`function integer.rshift(n: integer, i: integer): integer`
|
||||
|
||||
Shifts `n` to the right by `i` bits (if `i` is negative, a left shift is performed instead).
|
||||
|
||||
When `i` is outside of `[-63..63]` range, returns 0.
|
||||
|
||||
`function integer.arshift(n: integer, i: integer): integer`
|
||||
|
||||
Shifts `n` by `i` bits to the right (if `i` is negative, a left shift is performed instead).
|
||||
|
||||
The most significant bit of `n` is propagated during the shift.
|
||||
|
||||
When `i` is larger than 63, returns an integer with all bits set to the sign bit of `n`.
|
||||
|
||||
When `i` is smaller than -63, 0 is returned.
|
||||
|
||||
`function integer.lrotate(n: integer, i: integer): integer`
|
||||
|
||||
Rotates `n` to the left by `i` bits (if `i` is negative, a right rotate is performed instead); the bits that are shifted past the bit width are shifted back from the right.
|
||||
|
||||
`i` is interpreted modulo 64.
|
||||
|
||||
`function integer.rrotate(n: integer, i: integer): integer`
|
||||
|
||||
Rotates `n` to the right by `i` bits (if `i` is negative, a left rotate is performed instead); the bits that are shifted past the bit width are shifted back from the left.
|
||||
|
||||
`i` is interpreted modulo 64.
|
||||
|
||||
`function integer.extract(n: integer, f: integer, w: integer?): integer`
|
||||
|
||||
Extracts bits of `n` at position `f` with a width of `w`.
|
||||
|
||||
`w` defaults to 1, so a two-argument version of extract returns the bit value at position `f`.
|
||||
|
||||
Bits are indexed starting at 0.
|
||||
`f` cannot be negative.
|
||||
`w` has to be positive (> 0).
|
||||
`f + w` must be less than or equal to 64.
|
||||
|
||||
`function integer.replace(n: integer, r: integer, f: integer, w: integer?): integer`
|
||||
|
||||
Replaces bits of `n` at position `f` and width `w` with `w` least significant bits of `r`.
|
||||
|
||||
`w` defaults to 1, so a three-argument version of replace changes one bit at position `f` to `r` and returns the result.
|
||||
|
||||
Bits are indexed starting at 0.
|
||||
`f` cannot be negative.
|
||||
`w` has to be positive (> 0).
|
||||
`f + w` must be less than or equal to 64.
|
||||
|
||||
`function integer.btest(a: integer, b: integer): boolean`
|
||||
|
||||
Perform a bitwise and `a` and `b` and returns true iff the result is not 0.
|
||||
|
||||
`function integer.countrz(n: integer): integer`
|
||||
|
||||
Returns the number of consecutive zero bits starting from the right-most (least significant) bit.
|
||||
Returns 64 if `n` is zero.
|
||||
|
||||
`function integer.countlz(n: integer): integer`
|
||||
|
||||
Returns the number of consecutive zero bits starting from the left-most (most significant) bit.
|
||||
Returns 64 if `n` is zero.
|
||||
|
||||
`function integer.bswap(n: integer): integer`
|
||||
|
||||
Returns `n` with the order of the bytes swapped.
|
||||
|
||||
### Extensions to the buffer library
|
||||
|
||||
Functions to read and write integer values are added.
|
||||
Functions use `integer` in the name as opposed to `i64` to signify the difference of the result/argument type from that of `number`.
|
||||
|
||||
`function buffer.readinteger(b: buffer, offset: number): integer`
|
||||
|
||||
Reads an integer out of a buffer at the given offset.
|
||||
|
||||
`function buffer.writeinteger(b: buffer, offset: number, value: integer): ()`
|
||||
|
||||
Writes an integer to a buffer at the given offset.
|
||||
|
||||
### Extensions to the math library
|
||||
|
||||
For parity with Lua 5.3+, two additional constants are added to the math library.
|
||||
|
||||
`math.maxinteger`
|
||||
|
||||
Integer value representing 2^63-1 (`9_223_372_036_854_775_807i`)
|
||||
|
||||
`math.mininteger`
|
||||
|
||||
Integer value representing -2^63 (`-9_223_372_036_854_775_808i`)
|
||||
|
||||
### Extensions to the string library
|
||||
|
||||
`string.format` function is updated to support integer arguments.
|
||||
|
||||
'd', 'i' and '*' format specifiers will format integer as a signed 64 bit integer number.
|
||||
|
||||
'o', 'u', 'x' and 'X' format specifiers will format integer as an unsigned 64 bit integer number.
|
||||
|
||||
### C API
|
||||
|
||||
`int64_t lua_tointeger64(lua_State *L, int idx, int* isinteger)`
|
||||
|
||||
Returns a value of an integer at `idx` or 0 on failure.
|
||||
|
||||
If `isinteger` is not a null pointer, writes 1 if the value at `idx` was an integer value and 0 on failure.
|
||||
|
||||
`void lua_pushinteger64(lua_State *L, int64_t n)`
|
||||
|
||||
Pushes a integer value on top of the stack.
|
||||
|
||||
`int lua_isinteger64(lua_State *L, int idx)`
|
||||
|
||||
Determines if a value at `idx` is an integer.
|
||||
|
||||
This function is implemented as a C macro.
|
||||
|
||||
`int64_t luaL_checkinteger64(lua_State *L, int narg)`
|
||||
|
||||
Returns a value of an integer at `narg` or throws an error on failure.
|
||||
|
||||
`int64_t luaL_optinteger64(lua_State *L, int narg, int64_t def)`
|
||||
|
||||
Returns a value of an integer at `narg` or `def` if there is no value.
|
||||
|
||||
Throws an error if there is a value but it is not an integer.
|
||||
|
||||
`luaopen_integer(lua_State *L)`
|
||||
|
||||
Registers the `integer` library.
|
||||
Included in `luaL_openlibs`.
|
||||
|
||||
## Drawbacks
|
||||
|
||||
This increases the complexity of the VM as it may need to implement separate paths for mathematical operations.
|
||||
|
||||
## Alternatives
|
||||
|
||||
Do nothing, the workarounds exist and are in use but this will restrict the areas Luau can be used without implementation burden or reliance on an externally maintained implementation of 64-bit integers.
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
description: Agent behavior constraints and communication style
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
---
|
||||
description: Index for Roblox API documentation in .cursor/rules/roblox/
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ columns:
|
|||
path: /production/analytics/
|
||||
navigation: analytics.yaml
|
||||
- title: Platform
|
||||
path: /platform
|
||||
path: /get-started/
|
||||
navigation: /platform.yaml
|
||||
- title: Tutorials
|
||||
navigation: /engine/tutorials.yaml
|
||||
|
|
|
|||
|
|
@ -144,6 +144,8 @@ navigation:
|
|||
path: /physics/constraints/torque
|
||||
- title: LineForce
|
||||
path: /physics/constraints/line-force
|
||||
- title: Animation
|
||||
path: /physics/constraints/animation
|
||||
- title: Sleep system
|
||||
path: /physics/sleep-system
|
||||
- title: Adaptive timestepping
|
||||
|
|
|
|||
|
|
@ -1,17 +1,28 @@
|
|||
navigation:
|
||||
- heading: Platform
|
||||
|
||||
- title: Get started
|
||||
path: /get-started
|
||||
- title: Get Started
|
||||
path: /get-started/
|
||||
section:
|
||||
- title: Why should I develop on Roblox?
|
||||
path: /get-started/why-build-on-roblox
|
||||
- title: How is Roblox different from other platforms?
|
||||
path: /get-started/how-is-roblox-different
|
||||
- title: What tools does Roblox provide?
|
||||
path: /get-started/tools
|
||||
- title: How do I make money?
|
||||
path: /get-started/monetization
|
||||
- title: Recommended strategies
|
||||
path: /get-started/strategies
|
||||
- title: Start creating
|
||||
path: /get-started/creating
|
||||
- title: Resources
|
||||
path: /get-started/resources
|
||||
- title: Create
|
||||
path: /platform
|
||||
- title: Scale
|
||||
path: /scale
|
||||
- title: Monetize
|
||||
path: /monetize
|
||||
section:
|
||||
- title: Earn on Roblox
|
||||
path: /production/earn-on-roblox
|
||||
- title: Guidelines and policies
|
||||
section:
|
||||
- title: Safety on Roblox
|
||||
|
|
|
|||
|
|
@ -142,7 +142,8 @@ Face accessories, such as hair, eyebrows, and eyelashes are unique accessories t
|
|||
|
||||
## Textures
|
||||
|
||||
Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md). Keep in mind that smaller assets, such as accessories, can use smaller texture map sizes, such as **256×256px**, to optimize performance with virtually no loss in detail.
|
||||
- Textures for Marketplace assets can't exceed 2048x2048 resolution.
|
||||
- Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md). High resolution textures are automatically converted to lower-resolution textures to optimize performance.
|
||||
|
||||
## Layerable Properties
|
||||
|
||||
|
|
|
|||
|
|
@ -277,9 +277,8 @@ You can use tools like the [Accessory Fitting Tool](../../art/accessories/access
|
|||
|
||||
## Textures
|
||||
|
||||
Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md).
|
||||
|
||||
- Non-albedo maps (RGH, MTL, NOR) for rigid accessories cannot exceed 256x256.
|
||||
- Textures for Marketplace assets cannot exceed 2048x2048 resolution.
|
||||
- Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md).
|
||||
|
||||
## Attachment points
|
||||
|
||||
|
|
|
|||
|
|
@ -652,7 +652,9 @@ For information on required facial animation support, see [head specifications](
|
|||
|
||||
## Textures
|
||||
|
||||
Avatar characters must follow Roblox's [texture specifications](../../art/modeling/texture-specifications.md). Characters created for the Marketplace can take advantage of [custom skin tones](#custom-skin-tone) which use alpha layers allow users to select their own base color.
|
||||
- Textures for Marketplace assets can't exceed 2048x2048 resolution.
|
||||
- Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md). High resolution textures are automatically converted to lower-resolution textures to optimize performance.
|
||||
- Avatar characters must follow Roblox's [texture specifications](../../art/modeling/texture-specifications.md). Characters created for the Marketplace can take advantage of [custom skin tones](#custom-skin-tone) which use alpha layers allow users to select their own base color.
|
||||
|
||||
### Custom skin tone
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ title: PBR textures
|
|||
description: PBR textures are advanced textures using multiple texture maps.
|
||||
---
|
||||
|
||||
import BetaAlert from '../../includes/beta-features/beta-alert.md'
|
||||
|
||||
**Physically-Based Rendering** (PBR) textures allow you to represent realistic shading and lighting by using multiple types of texture images, or **maps**, on a single object. Combining multiple texture maps can more accurately simulate color, roughness, and reflectivity in any lighting environment and can enhance the visual elements of your assets and environment.
|
||||
|
||||
<Tabs>
|
||||
|
|
@ -140,15 +142,39 @@ For objects that require partial or complete sections of transparency, such as g
|
|||
|
||||
You can apply transparency in two different behaviors by setting the following `Class.SurfaceAppearance.AlphaMode|AlphaMode` values:
|
||||
|
||||
- [Overlay](#overlay) — Overlays the `Class.SurfaceAppearance.ColorMap|ColorMap` over the underlying mesh's `Class.MeshPart.Color`. Color maps using **Overlay** reveal the base color of the mesh anywhere transparency is present. This is the default setting.
|
||||
- [Opaque](#opaque) — Ignores the alpha channel of the `Class.SurfaceAppearance.ColorMap|ColorMap` and uses the color value directly from the color map.
|
||||
- [Overlay](#overlay) — Overlays the `Class.SurfaceAppearance.ColorMap|ColorMap` over the underlying mesh's `Class.MeshPart.Color`. Color maps using overlay mode reveal the base color of the mesh anywhere transparency is present. This is the default setting.
|
||||
- [Transparency](#alpha-modes) — Removes the visible mesh based on transparency in the `ColorMap`. This renders the mesh see-through and does not reveal the original mesh color whenever transparency is present.
|
||||
- [TintMask](#tintmask) — Blends the tinted `Class.SurfaceAppearance.ColorMap|ColorMap` over the un-tinted `Class.SurfaceAppearance.ColorMap|ColorMap`.
|
||||
|
||||
##### Opaque
|
||||
|
||||
<BetaAlert betaName="MaterialVariant Alpha Mode" leadIn="This mode is currently in beta. Enable it through " leadOut="." components={props.components} />
|
||||
|
||||
You can use `Enum.AlphaMode.Opaque` mode to ignore the alpha channel of the `Class.SurfaceAppearance.ColorMap|ColorMap` altogether. In this case the alpha value is assumed to be 1 (fully opaque).
|
||||
|
||||
The following example demonstrates how the `Enum.AlphaMode.Opaque|Opaque` mode works using a white object as reference:
|
||||
|
||||
<GridContainer numColumns="3">
|
||||
<figure>
|
||||
<img src="../../assets/modeling/surface-appearance/SurfaceAppearance-Opaque-ColorMap.jpg" alt="A polkadot texture with transparency. The background is completely transparent."/>
|
||||
<figcaption>Example color/albedo map with transparency</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<img src="../../assets/modeling/surface-appearance/SurfaceAppearance-Opaque-Before.jpg" alt="A white torus on a plane."/>
|
||||
<figcaption>Example mesh object (white)</figcaption>
|
||||
</figure>
|
||||
<figure>
|
||||
<img src="../../assets/modeling/surface-appearance/SurfaceAppearance-Opaque-After.jpg" alt="The torus has the polkadot patterns scattered over its surface. Transparency value is ignored."/>
|
||||
<figcaption>`Class.SurfaceAppearance.AlphaMode|AlphaMode` set to `Enum.AlphaMode.Opaque|Opaque` using reference map and material</figcaption>
|
||||
</figure>
|
||||
</GridContainer>
|
||||
|
||||
##### Overlay
|
||||
|
||||
You can use **Overlay** to reveal sections of the mesh's original color. Since the transparent areas of the color map expose the underlying color, you can design a unique texture map that partially or fully reveals the mesh's `Class.MeshPart.Color|Color` property for custom skin tones or other situations with unique colors.
|
||||
You can use `Enum.AlphaMode.Overlay` to reveal sections of the mesh's original color. Since the transparent areas of the color map expose the underlying color, you can design a unique texture map that partially or fully reveals the mesh's `Class.MeshPart.Color|Color` property for custom skin tones or other situations with unique colors.
|
||||
|
||||
The following example demonstrates how the **Overlay** mode works using a white sphere reference:
|
||||
The following example demonstrates how the `Enum.AlphaMode.Overlay|Overlay` mode works using a white sphere reference:
|
||||
|
||||
<GridContainer numColumns="3">
|
||||
<figure>
|
||||
|
|
@ -161,11 +187,11 @@ The following example demonstrates how the **Overlay** mode works using a white
|
|||
</figure>
|
||||
<figure>
|
||||
<img src="../../assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Overlay.jpg" alt="A white sphere with small blue squares scattered over the surface."/>
|
||||
<figcaption>`Class.SurfaceAppearance.AlphaMode|AlphaMode` set to **Overlay** using reference map and material</figcaption>
|
||||
<figcaption>`Class.SurfaceAppearance.AlphaMode|AlphaMode` set to `Enum.AlphaMode.Overlay|Overlay` using reference map and material</figcaption>
|
||||
</figure>
|
||||
</GridContainer>
|
||||
|
||||
The following example uses the **Overlay** mode for custom characters, revealing the character's original skin-tone:
|
||||
The following example uses the `Enum.AlphaMode.Overlay|Overlay` mode for custom characters, revealing the character's original skin-tone:
|
||||
|
||||
<GridContainer numColumns="2">
|
||||
<figure>
|
||||
|
|
@ -174,7 +200,7 @@ The following example uses the **Overlay** mode for custom characters, revealing
|
|||
</figure>
|
||||
<figure>
|
||||
<img src="../../assets/modeling/surface-appearance/Custom-Skin-Tone-Example.png" alt="Four of the same humanoid models with different skin tones: light brown, black, white, dark green."/>
|
||||
<figcaption>Several variations of characters with a single color map using **Overlay** mode</figcaption>
|
||||
<figcaption>Several variations of characters with a single color map using `Enum.AlphaMode.Overlay|Overlay` mode</figcaption>
|
||||
</figure>
|
||||
</GridContainer>
|
||||
|
||||
|
|
@ -182,7 +208,7 @@ See [custom skin tone](../../art/characters/specifications.md#custom-skin-tone)
|
|||
|
||||
##### Transparency
|
||||
|
||||
You can use the **Transparency** mode to create complex or extremely fine objects, such as lace or netting, by removing visible parts of the mesh as an alternative to sculpting the mesh geometry. Since this does not affect the geometry of the mesh object, this can allow you to create detailed objects without the performance impact of an intricate mesh model.
|
||||
You can use the `Enum.AlphaMode.Transparency` mode to create complex or extremely fine objects, such as lace or netting, by removing visible parts of the mesh as an alternative to sculpting the mesh geometry. Since this does not affect the geometry of the mesh object, this can allow you to create detailed objects without the performance impact of an intricate mesh model.
|
||||
|
||||
The following example demonstrates how a partial and full transparency in this mode visually removes sections of the mesh:
|
||||
|
||||
|
|
@ -221,7 +247,7 @@ The following example demonstrates how a partial and full transparency in this m
|
|||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
There are two outcomes of `Enum.AlphaMode|Transparency` mode, depending on whether the `Class.MeshPart.Transparency` is set to `0` or **at least** `0.02`, although numerical precision may result in small values such as `0.01` triggering the opaque transparency.
|
||||
There are two outcomes of `Enum.AlphaMode.Transparency|Transparency` mode, depending on whether the `Class.MeshPart.Transparency` is set to `0` or **at least** `0.02`, although numerical precision may result in small values such as `0.01` triggering the opaque transparency.
|
||||
|
||||
- When alpha is used to cut out the shape of mostly opaque objects with hard edges such as foliage, lace fabric, and netting, set the `Class.MeshPart.Transparency` to `0`. When parts of the surface are fully opaque, the Roblox engine can render them with proper depth‑based occlusion. Opaque surfaces also generally work better with depth‑based effects like `Class.DepthOfFieldEffect`, glass and water refraction, and water reflection.
|
||||
- When alpha is used to add detail to semi‑transparent objects or objects with smooth gradients of transparency, set the `Class.MeshPart.Transparency` to **at least** `0.02`. This improves the quality of blending for objects such as dirty windows and soft‑edged feathers, but it will not work with all effects.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5e744bcca5cdbd072dcd60d7ac7ea57f5120535b8e0dc6c61a340bc8a48dd5f4
|
||||
size 353059568
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:76c9082a4d6c2a018367281b9d334921db46ea941b169f13ac2bc11abf0dc797
|
||||
size 2750997
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:70810ab723611ddfaa3e5eb4c083957305705fe0a3bccf0172e6ff74b4a61317
|
||||
size 145292
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ad871abf054b942f18d6b9706a5809538379cc7cfe510644d1f68d3fe3425633
|
||||
size 129402
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:30cf0564de491feab8d562b24a16591965cfa97b59e3a132c113aa6b3eb7d319
|
||||
size 70941
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a81ba2a1a2e2ae0fc885058c915e331893ceed912cac1254c4915826b436028f
|
||||
size 46340
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7117ccf49dc072e89b0e69a90ef1e2d83ea22ace7d7ae65ae436bab6ee13a966
|
||||
size 1117027
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:918668cbcd41fbc173b2e35aaccd399ec033c00d30d074e8bf891a645d136376
|
||||
size 265039
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:955470e94499f57a24c36af154443329edcb2bf8f71f0c761866a4c21911b3dd
|
||||
size 240939
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:eb8622fb891b867d642ba45e843a643e43653ebdd8cd2ea36b3402c98a048a51
|
||||
size 315796
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8a3e9bc7a72e6e9a1cc62fbd4c1709b3af9360eb9688d7490638dc5d247019d5
|
||||
size 2013316
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:bccbd83910720f1a5152a02b0d4441782df19453430a0345f71d1f658404de3d
|
||||
size 187780
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:41e4e5f7450f9e1be7500a2d7a8f14c6856fad50ef59d71e7ca572b58e135490
|
||||
size 1077476
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:98057fe1a1cc8175a7f052267a3638d48a3e0f42270ed98ddf8e836c73e0d744
|
||||
size 267557
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a0786316db482ee25364af853eed51876bfb81ab4786db17323ef265af5d56eb
|
||||
size 173660
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c16bd7f4c9bc37a637ad009313c0c5a751f2fd29561408db9aba40845a7b57c5
|
||||
size 844696
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:85e1fd035de78a8ffc2bdc305c34b88bb3deebb4239f6c0f021d4d5750e92f60
|
||||
size 18031730
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:aeb52ab29ae4c9a793a197451da5884dc2cb2a0baa9a31c971398c1b50b8ba38
|
||||
size 109093
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5188fc9bcaedd345b0fbbe4e183c55f6bac3e72262a28d6b1ac14dbfb50f3c6c
|
||||
size 216460
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f1198144379ee88204a500159dfb499b3ccee6a8e68f5cee5a9defa99286b20
|
||||
size 54884
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:36d924b74162a2e6421db3cc0c4223da87a5a99a4f119e80cf18b97eb17d65d7
|
||||
size 1066242
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e0b6f5c9d068ee3122a35c67c7628f0b1ab4493e23f6b68a0606150fc2b6c3cd
|
||||
size 4925536
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1bf17a0b5e3ca1b7fa73def2a9bfd85df21708757cda49ce98c3ff860673f8d0
|
||||
size 40765240
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e36b717e5562c5c9a66b2f00eaa9750b397e28959f7f505ec8324f96159a5e39
|
||||
size 178534
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7150cf017752c682801bfdef709bf5e6638cee34e859f4cb4b36c9628c64ac38
|
||||
size 236647
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d52a00914cfdce2fc0442eba7a54ded193247f2626a46a6bee5230d2bfbe585b
|
||||
size 69756
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fefd29af09fa54e9209f0ae93f8797892b15ba9819fac43e337f8496076ce1de
|
||||
size 53332
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:85374f4c89ae4ebfe67614c0f8c230db1cf8c372bd72ae4d7ed5ce4caee14f8e
|
||||
size 18755456
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:bd88fe5badff1d52f8028fe644b5f89176f4f67d0c375d0239835355c67a7ffb
|
||||
size 262639
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d5581bfe016052d6e52c601022394d7a10e80682a14e6b8dc7e5c51c826f4525
|
||||
size 44798
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:98e6bc16697cc21c923c0b35e213482eed92f47f7cd6325d4b87921cf1d4ee63
|
||||
size 167126
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e480949344eb622abf5ce522690c9628f2a580e1797d33a83a5be0415dc13bf9
|
||||
size 3029750
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1fa29deefd40bd2d9483815031f5538cf703fe2648aff8834bcd680de78d633b
|
||||
size 126616
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b795366ded7792a4964e5c59645662031a48318954d63e2612e1fa0f964ef936
|
||||
size 450824
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c8c27305fada5e8a1aa1733246a5b87b8ea2acd866180f7dac34a1e61c3f0523
|
||||
size 165418
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:765565deb33074ea5f93660873936db067a762630332e6d1bd392ea90be20b02
|
||||
size 109376
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1a0ad3f6b427d71bab4256847590b2e692af1e035e332de9ae030254894262e0
|
||||
size 589826
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:dfd9f13a0f2ee429276c7455ce8d5dca41c328c1ca5b11fab9e2ee2243accb06
|
||||
size 3676154
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d1b005bc03997530b3aceaeb3df017e8d0869bba7e697e67e5c5702feee9ab88
|
||||
size 57886
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:af9f634df41ce54f01123fb11dd1af2b5e3e8093d4c7fb986255fbe5a0b99cd9
|
||||
size 5249243
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c1309d258d20fd2dcad61a0b612be42a856c036ed54bd27d6b75c05fb3853bfe
|
||||
size 187533
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:021edfda621770d17c7f861efbf5b4ad4ac1c51182dc3edc8b4a40c933c20420
|
||||
size 93610
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5f9bb8633adb5593d6bd33111eb8ca7972b60b01851dac73e1ba82b6defa3f86
|
||||
size 1241629
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c3779cfcb818207d45783f5431026138fdfe2e5617bbf139e3a272ce460e2e9b
|
||||
size 189270
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ff2210aa55c0f7ad127ba18efb26995eeed0376dadf08420a1c81e94f132adcf
|
||||
size 3877158
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:14c12a3464c1c970c31912f0444cf59b3a574d5ab97df815feee6ba60d06c9c7
|
||||
size 441294
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:df4f13605002ceb2702ee7fa6dcc31412746866f7c521b2b8dab808e28780cac
|
||||
size 1360643
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:557c74590d011bf49a046f1061dc5155a2399766a02a21fcfd1b83632fddcb6a
|
||||
size 89372
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b4d943dff04c4dce79616390951e8793ff2a857c00779b530be51b9684192b33
|
||||
size 390456
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:961d4deca1a44e6a48a263f7b1618b676d9f0e3e9c2944063f428dcf5a7b08a0
|
||||
size 816454
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:af0eddb5a616851447e16211881c8c184da7104cfd39a45b4d628d33afefbd51
|
||||
size 2293973
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d63ea8c9322f391075b3730c8989bde2dc9f835c26c06d6cacf9565034f433ff
|
||||
size 163176
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ff2210aa55c0f7ad127ba18efb26995eeed0376dadf08420a1c81e94f132adcf
|
||||
size 3877158
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8fd2373256bbfdc236ed4223cb47e524a74df36a422802a0574649c390575bcd
|
||||
size 967928
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b9acf01a291a3cece8ea76493c539c25fea1a52a0051d374836aa15b5c9e4d34
|
||||
size 6343420
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:dbea877a77568ddb929d83f3319ab4c01dc5604456402395215551e062a70b99
|
||||
size 401951
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a79478787194f8a64dc7752c13dee1e2090c59fa5a06b26a54c3fa7096a27974
|
||||
size 5267580
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:38d66b8622b26a10f3165b6376cede8bef4d642e295ab39e1317ba4fd1555e8f
|
||||
size 207939
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9c47b9a886f16e9a2fab955c09b162a9b834132ea51d539764b83545bd99a029
|
||||
size 176093
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e9084b7c51326b59ea314aa6a7d05b1081f2cb3bd3a8bf146956e08af5e8ae19
|
||||
size 120982
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7b18ede5dcd31e8940590903ea63d41eb9a488bf7dfd25c019a706c5856e5db6
|
||||
size 3107410
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:817a09c90efeb87129dd7ef5f244bf0af24cb60c9fa7d080f515e9906009fc6e
|
||||
size 3164377
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e513e39d96822e66c3fe244e007598748f93c97935be7e52042991fc08cccbee
|
||||
size 2611787
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cb424364a43fe2221737def0da9f369563a83721b6dd87a2514f5208246d0e5c
|
||||
size 2207883
|
||||
oid sha256:330bd3b467d10e3e34d15f39d5998eac18b33c503dcaa4aa44ab259706129e35
|
||||
size 2182967
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ab84f5f35233337f7197e4880b8f27248144dbe202c7dde0f3ea1cfbb7dbb21c
|
||||
size 1787417
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ce8d7cdaba541e2184176e4fec21313a8a81f58a0656c1785e2a2c15acfcbe7f
|
||||
size 1808094
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:174e9f04557d08cf029a1e37ef0458e299bb733aef2d9feb590a0b0ffa64d0be
|
||||
size 2420977
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e03d8b657e4b522e87abd70286de2b8b55708425b34bcacc9d47646b9df5b187
|
||||
size 2576298
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7ae52275fa02a9f488a570a9e67e4639e60087288d09ce93d49cd9e00550f12c
|
||||
size 2375207
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:211fac7fb009995450a0a4b619face50489d13221349ab329b93d6220c4dc54e
|
||||
size 2162434
|
||||
oid sha256:4b1dd6cd61d3235363abd42e675341e5b42f2bfa5fff22edffdbf4fa0052facf
|
||||
size 2203263
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:825e29647b74e80d23d72932a2f487369b5545f2cd1fdd1e4f4a595c4e53666c
|
||||
size 1986224
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:667504455207cf83b81bfd20fe3185b0bb819f27a74a73c2b10385820bf6a716
|
||||
size 2023964
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9ef0359b130a8526cd3cf392e26160afa2be69a2206f7238313ab90fa9b72f89
|
||||
size 2621444
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f3eb2fe7964c8b5d07d055a4dcbf777c153020787623d604a00d96d578b9831f
|
||||
size 2023529
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:088dcca05844079c82a2166f27138659b6bc9059e3f227ee994936706ac7fef3
|
||||
size 1662204
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3439a9b306fe3baba52e6271f657273a7faaaf7b32d98a6a8f369a78ddc13bb6
|
||||
size 2993628
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d49c29ad0f6685e8f34591928ecf0681fb4664d5b483a6f74d3addcbd552c9d7
|
||||
size 2344763
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b466865f8b9e39310fe413f721cef3df389f650a5aa404dca734c2a59e48deb3
|
||||
size 1384988
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c8d8026eab69003f0c77ee09bc64fb0f346ce400b30663e6c0bba468ddca2ce5
|
||||
size 2386795
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7c27938037a8804590118d1e7702b0de9b0ecff322c23e7eb99bb3b5adcf0895
|
||||
size 2477896
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:48eb94241539bce1f9a9c1ccfd5b2f3b8ea6e297573aa25f48dd69797dffffd0
|
||||
size 2584327
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b9fad20a7b321d98119fbb9ef7e1d026993d861274788407220f1e1ed33af345
|
||||
size 107640
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:03509d1ddf8ae09e3aec8edfd5b385a09e1d5c5908f81da26582a1f2a1cedcfc
|
||||
size 32339
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a284a2d6ef727f788cc258ce965b09f3923a165cb74d5992267524551999847c
|
||||
size 107638
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:46b4962e6aa9e61129fd9e5cad812d3165e23825063c5b38d493d70b55bf5203
|
||||
size 137385
|
||||
|
|
@ -91,98 +91,109 @@ For a detailed breakdown of your current pending balance costs, click **View Det
|
|||
|
||||
## Service pricing
|
||||
|
||||
See the following table for Extended Services pricing.
|
||||
See the following table for Extended Services pricing:
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<th>**Service**</th>
|
||||
<th>**Default**</th>
|
||||
<th>**Extended**</th>
|
||||
<tr>
|
||||
<th>**Service**</th>
|
||||
<th></th>
|
||||
<th>**Default**</th>
|
||||
<th>**Extended**</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}><a href="https://create.roblox.com/docs/cloud-services/memory-stores" style={{color: 'inherit', textDecoration: 'underline'}}><strong>Memory stores</strong></a></td>
|
||||
<td><a href="https://create.roblox.com/docs/cloud-services/memory-stores" style={{color: 'inherit', textDecoration: 'underline'}}>Memory stores</a></td>
|
||||
<td>Requests</td>
|
||||
<td>1000 + (CCU x 120) requests per minute</td>
|
||||
<td>$0.003 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>Request units</td>
|
||||
<td style={{border: 'none'}}>1000 + (CCU x 120) request units per minute</td>
|
||||
<td style={{border: 'none'}}>$0.003 / 1M request units</td>
|
||||
<td></td>
|
||||
<td>Storage</td>
|
||||
<td>64KB + (CCU x 1.2KB)</td>
|
||||
<td>$0.10 / GB per hour¹</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a href="https://create.roblox.com/docs/audio/objects#text-to-speech" style={{color: 'inherit', textDecoration: 'underline'}}>Text-to-speech</a></td>
|
||||
<td>Requests</td>
|
||||
<td>1 + (CCU x 6) requests per minute</td>
|
||||
<td>$5.00 / 1M requests</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a href="https://create.roblox.com/docs/audio/objects#speech-to-text" style={{color: 'inherit', textDecoration: 'underline'}}>Speech-to-text</a></td>
|
||||
<td>Requests</td>
|
||||
<td>1 + (CCU x 5) requests per minute</td>
|
||||
<td>$1 / 1M requests</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a href="https://create.roblox.com/docs/cloud-services/data-stores" style={{color: 'inherit', textDecoration: 'underline'}}>Standard data stores (coming soon)</a></td>
|
||||
<td>Get</td>
|
||||
<td>250 + (CCU * 40) requests per minute</td>
|
||||
<td>$0.08 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{paddingBottom: '24px'}}>Storage</td>
|
||||
<td style={{paddingBottom: '24px'}}>64KB + (CCU x 1.2KB)</td>
|
||||
<td style={{paddingBottom: '24px'}}>$0.10 / GB per Hour¹</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}><a href="https://create.roblox.com/docs/audio/objects#text-to-speech" style={{color: 'inherit', textDecoration: 'underline'}}><strong>Text-to-speech</strong></a></td>
|
||||
<td></td>
|
||||
<td>Set</td>
|
||||
<td>250 + (CCU * 20) requests per minute</td>
|
||||
<td>$0.80 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{paddingBottom: '24px'}}>Requests</td>
|
||||
<td style={{paddingBottom: '24px'}}>1 + (CCU x 6) requests per minute</td>
|
||||
<td style={{paddingBottom: '24px'}}>$5.00 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}><a href="https://create.roblox.com/docs/cloud-services/data-stores" style={{color: 'inherit', textDecoration: 'underline'}}><strong>Access to standard data stores</strong> (coming soon)</a></td>
|
||||
<td></td>
|
||||
<td>List</td>
|
||||
<td>10 + (CCU * 2) requests per minute</td>
|
||||
<td>$0.60 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>Get</td>
|
||||
<td style={{border: 'none'}}>250 + (CCU * 40) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.08 / 1M requests</td>
|
||||
<td></td>
|
||||
<td>Remove</td>
|
||||
<td>100 + (CCU * 40) requests per minute</td>
|
||||
<td>$0.80 / 1M requests</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><a href="https://create.roblox.com/docs/cloud-services/data-stores" style={{color: 'inherit', textDecoration: 'underline'}}>Ordered data stores (coming soon)</a></td>
|
||||
<td>Get</td>
|
||||
<td>250 + (CCU * 40) requests per minute</td>
|
||||
<td>$0.08 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>Set</td>
|
||||
<td style={{border: 'none'}}>250 + (CCU * 20) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.80 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>List</td>
|
||||
<td style={{border: 'none'}}>10 + (CCU * 2) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.60 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>Remove</td>
|
||||
<td style={{border: 'none'}}>100 + (CCU * 40) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.80 / 1M requests</td>
|
||||
<td></td>
|
||||
<td>Set</td>
|
||||
<td>250 + (CCU * 20) requests per minute</td>
|
||||
<td>$0.25 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}><a href="https://create.roblox.com/docs/cloud-services/data-stores" style={{color: 'inherit', textDecoration: 'underline'}}><strong>Access to ordered data stores</strong> (coming soon)</a></td>
|
||||
<td></td>
|
||||
<td>GetSorted</td>
|
||||
<td>100 + (CCU * 2) requests per minute</td>
|
||||
<td>$0.32 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>Get</td>
|
||||
<td style={{border: 'none'}}>250 + (CCU * 40) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.08 / 1M requests</td>
|
||||
<td></td>
|
||||
<td>Remove</td>
|
||||
<td>100 + (CCU * 40) requests per minute</td>
|
||||
<td>$0.25 / 1M requests</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>Set</td>
|
||||
<td style={{border: 'none'}}>250 + (CCU * 20) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.25 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>GetSorted</td>
|
||||
<td style={{border: 'none'}}>100 + (CCU * 2) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.32 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}>Remove</td>
|
||||
<td style={{border: 'none'}}>100 + (CCU * 40) requests per minute</td>
|
||||
<td style={{border: 'none'}}>$0.25 / 1M requests</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{border: 'none'}}><a href="https://create.roblox.com/docs/cloud-services/data-stores" style={{color: 'inherit', textDecoration: 'underline'}}><strong>Data store storage</strong> (coming soon)</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style={{paddingBottom: '24px'}}>Storage</td>
|
||||
<td style={{paddingBottom: '24px'}}>100 MB + (1MB * Lifetime Players) GB per Month</td>
|
||||
<td style={{paddingBottom: '24px'}}>$0.12 / GB per Month</td>
|
||||
<td><a href="https://create.roblox.com/docs/cloud-services/data-stores" style={{color: 'inherit', textDecoration: 'underline'}}>Data store storage (coming soon)</a></td>
|
||||
<td>Storage</td>
|
||||
<td>100 MB + (1MB * Lifetime Players) GB per month</td>
|
||||
<td>$0.12 / GB per month</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<figcaption>¹ GB per Hour = the storage consumption multiplied by the amount of time. For example, 100GB Hours might equate to "100GB x 1 hour" or "200GB x 0.5 hours".</figcaption>
|
||||
<figcaption>¹ GB per hour = the storage consumption multiplied by the amount of time. For example, 100GB hours might equate to "100GB x 1 hour" or "200GB x 0.5 hours".</figcaption>
|
||||
|
||||
## Supported countries
|
||||
|
||||
Extended Services is available in the following countries.
|
||||
Extended Services is available in the following countries:
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue