Développement pour OpenBVE
0 - Tutoriel Route
1 - L'Objet b3d
2 - L'Objet csv
3 - L'Objet X
4 - L'Objet Animated
5 - La Route csv
6 - La Route rw
7 - Le Fichier train.dat
8 - Le Fichier extensions.cfg
9 - Le Fichier panel.cfg
10 - Le Fichier panel2.cfg
11 - Le Fichier panel.animated

Contenus

1. Aperçu général
2. Syntaxe
3. Commandes disponibles
    ↷ CreateMeshBuilder
    ↷ AddVertex
    ↷ AddFace
    ↷ AddFace2
    ↷ Cube
    ↷ Cylinder
    ↷ Translate, TranslateAll
    ↷ Scale, ScaleAll
    ↷ Rotate, RotateAll
    ↷ Shear, ShearAll
    ↷ SetColor
    ↷ SetEmissiveColor
    ↷ SetBlendMode
    ↷ LoadTexture
    ↷ SetDecalTransparentColor
    ↷ SetCoordinates


1. Aperçu général

Un objet CSV permet de créer un seul objet par l'utilisation d'instructions textuelles. L'objet peut être utilisé pour les routes ou pour les trains. L'objet décrit par le fichier peut contenir n'importe quel nombre de polygones individuels. Le format de fichier permet de regrouper des polygones multiples dans les sections CreateMeshBuilder dans lesquels on attribue des informations de couleur ou de texture assigné à tous les polygones créés dans chaque section. Ceci tient compte de la création de beaucoup de polygones dans la même section CreateMeshBuilder qui partageront des attributs communs. Un polygone est appelé face (surface) dans ce format de fichier.

Le fichier est un fichier de texte simple codé dans un codage arbitraire, cependant, UTF-8 avec une marque d'ordre d'octet est le choix préféré. Le modèle d'analyse des nombres est libre, cependant, vous êtes encouragé à avoir une production néanmoins Stricte . Le nom de fichier est arbitraire, mais doit avoir l'extension .csv. Le fichier est interprété sur une base de ligne par ligne, du début à la fin.


2. Syntaxe

Chaque ligne dans le fichier est composée par un nom d'une commande et ses arguments. La syntaxe pour toute les commandes est la même :

NameOfTheCommand, Argument1, Argument2, Argument3, ..., Argumentn

NameOfTheCommand est casse insensible. S'il y a des arguments, NameOfTheCommand et Argument1 sont séparé par une virgule (U+002C). De la même manière, les arguments sont aussi séparés par une virgule (U+002C). Les espaces blancs autour des arguments et autour de NameOfTheCommand, et ainsi qu'au début et fin de ligne, seront ignorés. Les lignes vides ou les lignes consistant seulement en des espaces blancs seront aussi ignorés.

Les arguments pourraient être ignorés en fonction du texte de chaque Argumenti vide. Une valeur par défaut s'appliquera d'ordinaire dans ce cas, qui sera spécifique à la commande utilisé. Toutes les valeurs par défaut sont spécifiées dans la section des commandes disponibles.

Vous pouvez utiliser des commentaires n'importe où à la fin d'une ligne. Un commentaire commence par un point virgule (U+003B). Les commentaires, s'ils sont présent, sont supprimés de toutes les lignes avant que celle-ci ne soit traité.


3. Commandes disponibles

CreateMeshBuilder
Cette commande indique le début d'une nouvelle section de surfaces. Elle doit précéder n'importe quelles commandes suivantes. Il peut y avoir autant de sections CreateMeshBuilder que l'on désire dans un fichier objet. Toutes les commandes suivantes seront reliées à la dernière section CreateMeshBuilder ouverte.


AddVertex, vX, vY, vZ, nX, nY, nZ
vX: Coordonnée X pour le sommet en mètres. Valeurs négatives pour la gauche, positive pour la droite. La valeur par défaut est 0.
vY: Coordonnée Y pour le sommet en mètres. Valeur négative vers le bas, positive vers le haut. La valeur par défaut est 0.
vZ: Coordonnée Z pour le sommet en mètres. Valeur négative vers l'arrière, positive vers l'avant. La valeur par défaut est 0.
nX: Coordonnée X pour la normale de ce sommet. La valeur par défaut est 0.
nY: Coordonnée Y pour la normale de ce sommet. La valeur par défaut est 0.
nZ: Coordonnée Z pour la normale de ce sommet. La valeur par défaut est 0.

Cette commande crée un nouveau sommet qui peut être utilisé pour créer des surfaces via la commande AddFace ou AddFace2. Il peut y avoir autant de commande AddVertex que désiré dans une section CreateMeshBuilder. Toutefois, l'ordre donnés des sommets est important pour les autres commandes. Le premier sommet donné a l'indice 0, et les sommets suivants ont l'index 1, 2, 3 et ainsi de suite.

La normale est la direction perpendiculaire à la surface en un point particulier. Si tous les sommets dans une surface ont la même normale, la surface paraîtra plate. Si utilisé avec à-propos, vous pouvez donner l'illusion d'une surface courbe en spécifiant différente normale pour les sommets, mais en utilisant la même normale pour tous les sommets qui partagent la même coordonnée spatiale - à travers de multiples surfaces. Si elles ne sont pas indiqués, la normale sera automatiquement calculé.


AddFace, v1, v2, v3, ..., vmax
vi: L'indice du sommet inclus dans la surface. Les valeurs permises sont de 0 à n-1, où n est le nombre de commandes AddVertex utilisé.

Cette commande crée une surface donné par une longue liste arbitraire d'index de sommet. L'indexation correspond à l'ordre dans lequel les sommets ont été créés par la commande AddVertex, ainsi la commande AddFace doit être déclaré après la commande AddVertex. La première commande AddVertex utilisé crée l'index 0, et les commandes AddVertex suivantes créent les index 1, 2, 3 et ainsi de suite. L'ordre dans lequel l'index de sommet apparaît est important. Ils doivent être donné dans le sens des aiguilles d'une montre en regardant le devant de la surface. L'arrière de la surface ne sera pas visible. Toutefois, la commande AddFace2 peut être utilisé pour créer une surface qui sera visible des deux côtés. Seul les polygones convexes sont supportés.


AddFace2, v1, v2, v3, ..., vmax
vi: L'indice du sommet inclus dans la surface. Les valeurs permises sont de 0 à n-1, où n est le nombre de commandes AddVertex utilisé.

Cette commande crée une surface donné par une longue liste arbitraire d'index de sommet. L'indexation correspond à l'ordre dans lequel les sommets ont été créés par la commande AddVertex, ainsi la commande AddFace2 doit être déclaré après la commande AddVertex. La première commande AddVertex utilisé crée l'index 0, et les commandes AddVertex suivantes créent les indices 1, 2, 3 et ainsi de suite. L'ordre dans lequel l'index de sommet apparaît est important. Ils doivent être donné dans le sens des aiguilles d'une montre en regardant le devant de la surface. L'arrière de la surface sera elle aussi visible, cependant, la luminosité sur la surface arrière pourrait être la même que sur la surface avant. Seul les polygones convexes sont supportés.


Cube, HalfWidth, HalfHeight, HalfDepth
HalfWidth: Un nombre (à point flottant) représentant la demi largeur du cube en mètres.
HalfHeight: Un nombre (à point flottant) représentant la demi hauteur du cube en mètres.
HalfDepth: Un nombre (à point flottant) représentant la demi longueur du cube en mètres.

Cette commande crée un cube qui a les dimensions spécifié par HalfWidth, HalfHeight et HalfDepth. Le cube sera centré sur l'origine (0,0,0). Ainsi, sur l'axe X, le cube s'étend de -HalfWidth à HalfWidth, sur l'axe Y de -HalfHeight à HalfHeight et sur l'axe Z de -HalfDepth à HalfDepth. Le cube a toujours 8 sommets et 6 surfaces.

ⓘ Représentation de Cube
La commande Cube est l’équivalent d'une série de commande AddVertex et AddFace, que vous auriez besoin pour le représenter en utilisant d'autres commandes dans la même section CreateMeshBuilder. Les détails sur ce que la commande Cube fait est disponible ici.


Cylinder, n, UpperRadius, LowerRadius, Height
n : Un nombre entier qui représente le nombre de sommets utilisé pour la base du frustum.
UpperRadius : Un nombre (à point flottant) représentant le rayon de la base supérieure du frustum en metres. Peut être négatif pour indiquer que le bouchon supérieure doit être omis.
LowerRadius : Un nombre (à point flottant) représentant le rayon de la base inférieure du frustum en metres. Peut être négatif pour indiquer que le bouchon inférieure doit être omis.
Height : Un nombre (à point flottant) représentant la hauteur du prisme en meters. Peut être négatif, qui inversera le volume et l'affichera verticalement vers le bas.

Cette commande crée un frustum (volume). Si LowerRadius et UpperRadius sont égaux, l'objet généré sera réduit à un prisme, qui peut être utilisé comme une approximation de cylindre. si LowerRadius ou UpperRadius sont à zéro, l'objet généré sera réduit à une pyramide. le frustum est centré sur l'origine (0,0,0). Sur l'axe des x et l'axe des z, le frustum s'étend de -LowerRadius à LowerRadius pour la base de dessous et de -UpperRadius à UpperRadius pour la base de dessus. Sur l'axe des y, le frustum s'étend de -½*Height a ½*Height.

Le nombre n de sommets a 6 ou 8 suffira d'ordinaire quand seulement de petits rayons sont utilisés, par exemple pour créer un pôle. Sans tenir compte des valeurs de UpperRadius, LowerRadius and n, le frustum aura toujours 2*n de sommets, et ordinairement n+2 faces à moins que n'importe quel bouchon soit omis. Si UpperRadius ou LowerRadius sont négatifs, la valeur absolue est prise, mais les bouchons respectifs ne sont pas créés. Si Height est négatif, le rôles du dessus et du dessous sont inversé et les surfaces seront visible de l’intérieur, alors qu'autrement, ils seront visibles de l'extérieur.

ⓘ Représentation de Cylinder
La commande Cylinder est l’équivalent d'une série de commande AddVertex and AddFace, que vous auriez besoin pour le représenter en utilisant d'autres commandes dans la même section CreateMeshBuilder. Les détails sur ce que fait la commande Cylinder sont disponible ici.


GenerateNormals
Cette entrée n'est pas utilisée par openBVE.


Translate, X, Y, Z
TranslateAll, X, Y, Z
X: Un nombre (à point flottant) qui représente la translation sur la coordonnée X en metres. Les valeurs négatives correspondent à une translation vers la gauche, positive vers la droite. La valeur par défaut est 0 0.
Y: Un nombre (à point flottant) qui représente la translation sur la coordonnée Y en metres. Les valeurs négatives correspondent à une translation vers le bas, positive vers le haut. La valeur par défaut est 0.
Z: Un nombre (à point flottant) qui représente la translation sur la coordonnée Z en metres. Les valeurs négatives correspondent à une translation vers l’arrière, positive vers l'avant. La valeur par défaut est 0.

La commande Translate déplace tous les sommets qui ont été créés, dans la section CreateMeshBuilder, via les commandes AddVertex, Cube ou Cylindre. Les sommets subséquents ne sont pas affectés. Vous pouvez utiliser autant de commande Translate que vous désiré dans une section CreateMeshBuilder. La commande TranslateAll affecte non seulement les sommets produits dans la section CreateMeshBuilder actuelle, mais aussi celles créé dans les sections CreateMeshBuilder précédentes. Utile à insérer à la fin du dossier pour déplacer l'objet entier.


Scale, X, Y, Z
ScaleAll, X, Y, Z
X : Un nombre différent de zéro (à point flottant) représentant le facteur d'échelle sur la coordonnée X. La valeur par défaut est 1.
Y : Un nombre différent de zéro (à point flottant) représentant le facteur d'échelle sur la coordonnée Y. La valeur par défaut est 1.
Z : Un nombre différent de zéro (à point flottant) représentant le facteur d'échelle sur la coordonnée Z. La valeur par défaut est 1.

La commande Scale met à l’échelle tous les sommets qui ont été créés dans la section CreateMeshBuilder via la commande AddVertex, Cube ou Cylinder. Les sommets subséquents ne sont pas affectés. Vous pouvez utiliser autant de commande Scale que vous désiré dans une section CreateMeshBuilder. La commande ScaleAll affecte non seulement les sommets générés dans la section CreateMeshBuilder, mais aussi celles créé dans les sections CreateMeshBuilder précédentes. Utile à insérer à la fin du dossier pour mettre à l'échelle l'objet entier.


Rotate, X, Y, Z, Angle
RotateAll, X, Y, Z, Angle
X : la direction X de l'axe de rotation. Les valeurs négatives indiquent vers la gauche, positives vers la droite. La valeur par défaut est 0.
Y : la direction Y de l'axe de rotation. Les valeurs négatives indiquent vers le bas, positives vers le haut. La valeur par défaut est 0.
Z : la direction Z de l'axe de rotation. Les valeurs négatives indiquent vers l'arrière, positives vers l'avant. La valeur par défaut est 0.
Angle : L'angle de rotation en degrés. Les valeurs négatives dans le sens inverse des aiguilles d'une montre, positive dans le sens des aiguilles d'une montre. La valeur par défaut est 0.

La commande Rotate tourne tous les sommets qui ont été créés dans la section courante CreateMeshBuilder via la commande AddVertex, Cube ou Cylinder. Les sommets subséquents ne sont pas affectés. L'axe de rotation est spécifié via les valeurs de X, de Y et de Z. La rotation will occur dans le plan perpendiculaire à cette direction. Le vecteur zéro pour cet axis est traité par (1,0,0). Toutes les autres directions sont normalisées.
Vous pouvez utiliser autant de commande Rotate que vous désiré dans une section CreateMeshBuilder. La commande RotateAll affecte non seulement les sommets générés dans la section CreateMeshBuilder, mais aussi celles créé dans les sections CreateMeshBuilder précédentes. Utile à insérer à la fin du dossier pour tourner l'objet entier.


Shear, dX, dY, dZ, sX, sY, sZ, r
ShearAll, dX, dY, dZ, sX, sY, sZ, r
dX : La coordonée X pour le vecteur D. La valeur par défaut est 0.
dY : La coordonée Y pour le vecteur D. La valeur par défaut est 0.
dZ : La coordonée Z pour le vecteur D. La valeur par défaut est 0.
sX : La coordonée X pour le vecteur S. La valeur par défaut est 0.
sY : La coordonée Y pour le vecteur S. La valeur par défaut est 0.
sZ : La coordonée Z pour le vecteur S. La valeur par défaut est 0.
r : Le ratio qui indique de combien on déplacer les vecteurs. La valeur par défaut est 0.

La commande Shear execute une transvection pour tous les sommets qui on été créé dans la section CreateMeshBuilder courrante. La commande ShearAll affecte non seulement les sommets généré dans la section CreateMeshBuilder courante, mais aussi ceux créé dans les précédentes sections CreateMeshBuilder. Utile à insérer à la fin du fichier pour l’appliquer à l'objet entier.

La transvection est exécuté autour de l'origine. Pour parler crûment, l'objet est coupé en plans le long de la direction D et alors déplacé le long de la direction S. Typiquement, D et S sont perpendiculaires. D et S sont toujours normalisés. Si Ratio est égal à 0, aucune transformation n'est exécutée. si D et S sont perpendiculaires, le Ratio de 1 corresponds à une pente de 45 degrés.


SetColor, Red, Green, Blue, Alpha
Red : Le composant rouge de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 255.
Green : Le composant vert de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 255.
Blue : Le composant bleu de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 255.
Alpha : Le composant d'alpha de la couleur. Mesuré de 0 (transparent) à 255 (opaque). La valeur par défaut est 255.

La commande règle la couleur pour tous les surfaces qui ont été déjà créés dans la section CreateMeshBuilder actuelle. Si aucune texture n'est utilisée, les surfaces seront colorés en utilisant les données de couleur comme spécifié par Red, Green et Blue. Si une texture est utilisée, les pixels dans la texture seront multipliés par la couleur, en multipliant avec le noir a pour résultat du noir et en multipliant avec du blanc ne change pas la couleur des pixels de la texture. Les valeurs intermédiaire rendent plus sombres les pixels de la texture. Quand une lumière est utilisé dans la route, la véritable couleur peut changer dépendament des conditions d'éclairage, mais d'ordinaire deviendra plus sombre.


SetEmissiveColor, Red, Green, Blue
Red : Le composant rouge de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 0.
Green : Le composant vert de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 0.
Blue : Le composant bleu de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 0.

Cette commande règle la couleur émise pour toutes les faces qui ont été déjà créés dans la section CreateMeshBuilder actuelle. La différence entre la commande SetColor et la commande SetEmissiveColor estque la commande SetColor est affectée par l'éclairage, alors que la commande SetEmissiveColor ne l'est pas. Ainsi, la commande SetEmissiveColor devrait être utilisé pour les faces qui émettraient la lumière elle même, y compris les signaux, les lampes, les fenêtres et the like. La véritable contribution de la couleur sur les faces sera la somme des données des couleurs affectés par la lumière et les données d’émission de couleur statiques.


SetBlendMode, BlendMode, GlowHalfDistance, GlowAttenuationMode
BlendMode : Le mode de mélange qui est utiliser. Le défaut est Normal.
GlowHalfDistance : La distance à laquelle la lueur est à 50% de son intensité, mesurée en mètres. La valeur doit être un nombre entier dans les valeurs de 1 à 4095, ou 0 rend hors service l’atténuation de la lueur. La valeur par défaut est 0.
GlowAttenuationMode : Le mode d'atténuation de la lueur est utiliser. La valeur par défaut est DivideExponent4.

Options disponibles pour BlendMode :
Normal : Les surfaces sont rendus normalement.
Additive : Les surfaces sont rendus additivement.

Options disponibles pour GlowAttenuationMode :
DivideExponent2 : L'intensité de la lueur est déterminée via la fonction x2 / (x2 + GlowHalfDistance2), où x Est la distance de la camera à l'objet en metres.
DivideExponent4 : L'intensité de la lueur est déterminée via la fonction x4 / (x4 + GlowHalfDistance4), où x Est la distance de la camera à l'objet en metres.

Cette commande règle le mode de mélange pour toutes les faces dans la section CreateMeshBuilder actuelle. Le mode Normal remplace les pixels d'écran avec les pixels de texture. Le mode Additive ajoute la couleur de pixels de la texture à la couleur de pixels d'écran, où en ajoutant du noir on ne change pas le pixel d'écran, en ajoutant du blanc on a pour résultat du blanc. Si GlowHalfDistance est à 0, L'atténuation de lueur est hors service, c'est par défaut. Si L'atténuation de lueur est utilisée, GlowHalfDistance représente la distance en metres à lesquels la lueur est exactement à 50% de son intensité. Quand la camera approche de la surface, la surface s'estompera graduellement (devient transparent). La fonction qui est utilisée pour déterminer l'intensité exacte à une distance donnée peut être influencée avec le paramètre de GlowAttenuationMode. DivideExponent2 crée une transition plus lisse, mais convergera à l'intensité maximum très lentement, alors que DivideExponent4 crée une transition plus tranchante qui converge plus rapidement.

OpenBVE 2 note de compatibilité :
Dans openBVE 2, seule la lueur additivesera supportéeet le paramètre de GlowAttenuationMode sera probablement ignoré. S'il vous plaît éviter d'utiliser le rendu normal conjointement avec l'utilisation de lueur.


LoadTexture, DaytimeTexture, NighttimeTexture
DaytimeTexture : Le nom du fichier de la version de jour de la texture à charger, relatif au dossier ou le fichier de l'objet est rangé.
NighttimeTexture : TLe nom du fichier de la version de nuit de la texture à charger, relatif au dossier ou le fichier de l'objet est rangé.

Cette commande charge une texture et l'utilise pour toutes les surfaces de la section CreateMeshBuilder actuelle. Le nom du fichier est relatif tau dossier dans lequel le fichier de l'objet est rangé. Vous pouvez utiliser PNG, avec le support du canal alpha plein, mais n'utiliser le canal alpha seulement si c'est absolument exigé car cela réduit les performances. Préférez utilisé une texture sans canal alpha conjointement avec la commande SetDecalTransparentColor pour utiliser la transparence des couleurs clé.

Si NighttimeTexture est utilisé, Il spécifie que la texture doit être utilisée dans les conditions d'éclairage de nuit, alors que DaytimeTexture spécifie que la texture doit être utilisée dans les conditions d'éclairage de jour. Les textures pouvant se mélanger l'une l'autre devrait être désigné en conséquence. Si NighttimeTexture est utilisé, DaytimeTexture doit être aussi spécifié. Si NighttimeTexture n'est pas utilisé, les conditions d'éclairage de niveau bas feront que la version de jour sera plus sombre. Les textures de nuit sont destinées à l’utilisation des objets extérieurs du train.


SetDecalTransparentColor, Red, Green, Blue
Red : Le composant rouge de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 0.
Green : Le composant vert de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 0.
Blue : Le composant bleu de la couleur. Mesuré de 0 (noir) à 255 (rouge). La valeur par défaut est 0.

Cette commande règle la couleur utilisée pour la transparence à l'écran pour toutes les surfaces déjà créés. La texture chargée via la commande Loadtexture sera transparente pour tous les pixels qui seront exactement égaux avec la couleur spécifiée via les paramètres Red, Green et Blue. L'utilisation de la transparence à l'écran est beaucoup plus efficace que d'utiliser un canal alpha plein, donc préférez utiliser une texture sans canal alpha et utilisez cette commande plutôt que de créer des parties transparente sur la texture. Vous devrez spécifier dans l'ordre les coordonnées de texture via la commande Coordinate pour que la texture apparaisse correctement sur les surfaces.


SetTextureCoordinates, VertexIndex, X, Y
VertexIndex : L'index du sommet auquel se réfère la coordonnée. Les valeurs permises sont 0 jusqu'à n-1, où n est le nombre de commande AddVertex utilisé. X : La coordonnée x de la texture. Un nombre entier correspondant au bord gauche/droit de la texture. Seule les valeurs 0 et 1 sont considérées, 0 corresponds à la gauche and 1 tà la droite. Y : La coordonnée y de la texture. Un nombre entier correspondant au bord haut/bas de la texture. Seule les valeurs 0 et 1 sont considérées, 0 corresponds bord haut et 1 au bas.

Cette commande associe une coordonnée à la texture au sommet spécifié par VertexIndex. L'indice correspond à l'ordre dans lequel les sommets ont été créés par la commande AddVertex, ainsi la commande Coordinates a besoin d'être déclaré après la commande AddVertex. Les valeurs de X et Y n'ont pas nécessairement besoin d'être entre 0 (gauche ou haut) à 1 (droite ou bas), mais peut avoir aussi une autre valeur. Il est supposé que dans ce cas la texture est répétée sur une grille infinie ou la valeurs du nombre entier pour X et Y corresponds aux coins de la texture.


mise à jour 14 Juin 2022 - Webmaster : Hervé Duliscouët -