|
|
(194 intermediate revisions by 8 users not shown) |
Line 1: |
Line 1: |
| {{XML_File_Header | type=ONLV | prev=ONLD | next=ONSK | name=Oni Game Level}} | | {{XML_File_Header | prev=ONLD | type=ONLV | next=ONSK | name=Oni Game Level}} |
| {{finish}}{{update}}
| |
| ;Todo list
| |
| | |
| * tips with cutscene charas: sync pelvis OBAN and partner TRAM
| |
| * examine low doors/openings: atm sliding under low objects don't seem to work
| |
| * more notes on BNV, linked xml, and exported xml files
| |
| * do FURN and object setup flags like InUse work? and if, what do they do?
| |
|
| |
|
| __TOC__ | | __TOC__ |
|
| |
|
|
| |
|
| ==Level releases, forum threads and wiki pages==
| | ONLV and AKEV should not be extracted as XML unless it is for the purpose of trouble shooting or research. The extracted XMLs cannot be used for level creation. |
| Custom levels that have been created so far:
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=2357 Old China]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=1506 Maze]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=1736 Arena]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=1957 Hexagon]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=1938 Junkyard]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=2001 Mini-Partenon]
| |
| | |
| OCF threads about level creation:
| |
| * '''[http://oni.bungie.org/community/forum/viewtopic.php?id=2087 "Creating the Lair - A level tutorial"]'''
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=1515 "Creating new levels"]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?pid=33838 "Create levels with pathfinding grids"]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=2000 "More questions about levels"]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?id=2003 "Sketchup tutorials for making levels"]
| |
| * [http://oni.bungie.org/community/forum/viewtopic.php?pid=37252#p37252 "Modding Existing levels - Beta" ("Moveable furniture" post)]
| |
| | |
| Wiki pages about levels:
| |
| * [[AE:Levels]]
| |
| * [[AE:Lightmapping_levels]]
| |
| * [[SketchUp_tutorials_and_tips|SketchUp tutorials and tips]]
| |
| | |
| Free texture resources
| |
| * [http://www.tutorialsforblender3d.com/Textures/Textures_index.html various game textures]
| |
| * [http://forums.epicgames.com/threads/603122-Remus-high-resolution-skydome-texture-pack skies and objects of the solar system]
| |
| * [http://blenderartists.org/forum/showthread.php?224065-New-High-resolution-sky-pack-for-Blender skies] <!-- (http://www.wuala.com/Olson/Photos/Optikz_360_Skies/) -->
| |
| * [http://blenderartists.org/forum/showthread.php?24038-Free-high-res-skymaps-%28Massive-07-update!%29 skies]
| |
| * [http://www.cgtextures.com/ CG Textures for 3D]
| |
| | |
| | |
| ==Level import with onisplit [http://mods.oni2.net/node/38 0.9.82.0]==
| |
| '''General information'''
| |
| * triangle limit: ca. 520.000 (500.000 to be on save side)
| |
| * actually this is not about the import but when the triangles are packed too tight then the cam will look at too many of them and glitches appear: the visible GQs limit is ca. 16.000, sooner or later higher numbers will cause render bugs and call BSL message "Exceeded max visible GQs ''number''" (you can decrease the gs_farclipplane_set value to avoid that problem)
| |
| * also, keep in mind that characters are visible ''only'' within 4099|4099|4099 and -4099|-4099|-4099 world units
| |
| * geometry stops at ca. X=4228|Z=4228 and -4228|-4228 (height not tested)
| |
| | |
| | |
| '''Demo files'''
| |
| | |
| Demo files can be downloaded [http://dl.dropbox.com/u/1869/lab.zip here].
| |
| | |
| First put the new "OniSplit.exe" into the second "lab" folder alongside the xml files.
| |
| | |
| There's a "build.cmd" file. Those two are the important lines:
| |
| | |
| onisplit -create:level out lab.xml
| |
| onisplit -import:pc out level3_Final.dat
| |
| | |
| The first line create the *.oni files from a master.xml file, in this case "lab.xml". If final, the oni files can be put into a new AE package. | |
| | |
| The second line creates level archives which can be used '''for fast tests'''. They don't require you to install a package.
| |
| | |
| Instead of "nosep" you can now also use "pc" for the import. Mac does still use "sep".
| |
| | |
| If the game crashes while loading (at ca. 5-10% progress), check if all textures were inside the "out" folder.
| |
| | |
| You can extract the AKEV file to xml, then search for "TXMP".
| |
| | |
| "TXMP_marker_door" and "TXMP_marker_ghost" will be missing in the demo's "out" folder.
| |
| | |
| You can add this between the other two lines in the build.cmd to prevent a crash.
| |
| onisplit -create:txmp out env/markers/*.tga
| |
| | |
| | |
| ===The master xml file===
| |
| File paths can be either absolute or relative.
| |
| | |
| The '''master xml file name''' determine the '''bsl folder name''' and the '''AKEV and ONLV file name''' in the output folder.
| |
| | |
| | |
| '''Mandatory files''' for level import:
| |
| * ''level_environment''.dae
| |
| * ''level_bnv''.dae
| |
| * ''level_textures.tga/jpg/dds
| |
| * Character.xml or AISA with player
| |
| * ONSK name in <Sky> (can be fake name)
| |
|
| |
|
| | If you want to create a new level check out the '''[[Creating a level|corresponding tutorial]]'''. |
|
| |
|
| | ==ONLV== |
| {| class="wikitable" width="100%" | | {| class="wikitable" width="100%" |
| !width=150px| XML tag | | !width=150px| XML tag |
| !width=120px| content type | | !width=120px| Content type |
| ! description | | ! Description |
| | |- |
| | |valign="top"| <ONLV id="..."> |
| | |valign="top"| integer |
| | | ONLV's instance number. Should be 0. |
| |- | | |- |
| | <?xml version="1.0" encoding="utf-8"?> | | |valign="top"| <Name> |
| |valign="top"| float, flag | | |valign="top"| char[64] |
| |valign="top"| Ignore this. | | | Name of BSL '''folder'''. |
| | : Save game slot and level number are defined inside [[XML:ONLD|ONLD]]. |
| |- | | |- |
| | <Oni> | | |valign="top"| <Environment> |
| | - | | |valign="top"| link |
| | | | | Link to [[XML:AKEV|AKEV]] via '''file''' name (AKEV''name'', don't use file suffix .oni) |
| | : Level geometry. |
| | |- |
| | |valign="top"| <Objects> |
| | |valign="top"| link |
| | | Link to [[#OBOA|OBOA]] via '''instance''' number (#''N''). |
| | : The OBOA instance holds doors, animated objects (usually for cutscenes) and pushable objects (which are not used the original game due to unfinished physics code). |
| | |- |
| | |valign="top"| <SkyBox> |
| | |valign="top"| link |
| | | Link to [[XML:ONSK|ONSK]] via '''file''' name (ONSK''name'', don't use file suffix .oni) |
| | : This is the skybox. |
| | |- |
| | |valign="top"| <Characters> |
| | |valign="top"| link |
| | | Link to [[XML:AISA|AISA]] via '''file''' name (AISA''name'', don't use file suffix .oni) |
| | : This "AI Setup Array" is an alternative character list. [[XML:BINA/OBJC/CHAR|BINACHAR]] is more powerful. |
| | |- |
| | |valign="top"| <ObjectQuadMap> |
| | |valign="top"| link |
| | | Link to [[#ONOA|ONOA]] via '''instance''' number (#''N''). |
| | : This "Object Array" holds functional objects – doors, furniture, turrets, triggers and consoles. In addition, it appears that the engine only searches for door-type objects. |
| | |- |
| | |valign="top"| <Particles> |
| | |valign="top"| link |
| | | Link to [[#ENVP|ENVP]] via '''instance''' number (#''N''). |
| | : These "Environment Particle" are traditionally only used for door lock lights and particles used by [[XML:OFGA|OFGAs]]. |
| |- | | |- |
| |valign="top"| <Level SharedPath="..."> | | |valign="top"| <Corpses> |
| |valign="top"| link | | |valign="top"| link |
| | The master xml file can link to other xml files, most of them are [[OBD:BINA/OBJC#OBJC_types|BINACJBO]] files. The file type gets declared inside the file, so the file name itself doesn't have to contain the type. Ergo, "BINACJBOCharacter.xml" can be given a simpler name like "Character.xml". | | | Link to [[#CRSA|CRSA]] via '''instance''' number (#''N''). |
| | : This is a "Corpse Array". It's used to spawn dead characters such as Chung in Chapter 1. |
| | |} |
|
| |
|
| Some resources used by those xml files can be found in a "shared" folder. OniSplit copies textures and "physics" objects into the output folder; furniture objects will be integrate into the AKEV. Unused resources in the shared folder will be ignored. That way the final level archive / AE package contains only necessary files which saves the end-user space.
| | ==OBOA== |
| | Used for movable/moving objects. |
|
| |
|
| In the demo are various subfolders in shared folder: consoles, doors, furniture, triggers and turrets.
| | {| class="wikitable" width="100%" |
| Following file types comes there without their file prefixes: CONS, DOOR, TRIG, OFGA. OniSplit recognize them nonetheless.
| | !width=150px| XML tag |
| | !width=120px| Content type |
| | ! Description |
| | |- |
| | | <OBOA id="..."> |
| | | integer |
| | | Instance ID. Should be 1. |
| |- | | |- |
| | <Environment> | | | <Objects> |
| | - | | | - |
| | | | | Array of <OBOAObject> tags. |
| |- | | |- |
| | <Model> | | | <OBOAObject> |
| | - | | | - |
| | See [[#<Model>|HERE]] for detailed information. | | | There are always 32 empty objects plus those that are actually used |
| |- | | |- |
| | <Import Path="..."/> | | | <Geometry> |
| | | "#" + integer |
| | | Link to M3GA instance. Doors have two separate models: an animated and a static one. If this <Geometry> links to a door, it will be the animated model. |
| | |- |
| | | <Animation> |
| | link | | | link |
| | | | | OBAN''name''. |
| |- | | |- |
| | <Node Id="..."> | | | <Particle> |
| | string | | | # + integer |
| | informative (space for notes so to say) | | | Link to ENVP instance. There can be multiple ENVP instances – one for a lock light and others for additional particles. |
| |- | | |- |
| |valign="top"| <ScriptId> | | |valign="top"| <Flags> |
| |valign="top"| integer | | |valign="top"| flags |
| | Tested with BSL command ...
| |
| : [[#<Model>|env_show Id 1]] (use 0 to hide)
| |
| : [[#Breakable objects with BSL recognition|env_broken Id [Id]]] (if also second Id is used then objects in that range get counted e.g. 3001, 3018 = 18)
| |
| : [[#Texture exchange|env_texswap Id texture]] (no file prefix/suffix allowed)
| |
| |-
| |
| |valign="top"| <GunkFlags>
| |
| |valign="top"| flag
| |
| | | | | |
| ;AGQG (Gunk) flags (trimmed list)
| | : None |
| see ''onisplit -help enums'' for more flags
| | : InUse |
| :None | | : NoCollision (any effect? no collision is default behavior) |
| :NoCollision | | : NoGravity |
| :NoObjectCollision | | : FaceCollision (for doors) |
| :NoCharacterCollision | |
| :NoDecal | |
| :TwoSided
| |
| :Invisible
| |
| |- | | |- |
| |valign="top"| <Rooms>
| | | <DoorGunkId> |
| |valign="top"| - | | | int32 |
| | For detailed information see [[#<Rooms>|HERE]]. | | | The index of the door frame GQ (only used for door objects) |
| | |
| For Google Sketchup BNV tutorial see [http://oni.bungie.org/community/forum/viewtopic.php?pid=36760#p36760 HERE].
| |
| |- | | |- |
| | <Import Path="..."/> | | | <DoorId> |
| | link | | | int32 |
| | File path to *.dae file. BNV data, used to create pathfinding. | | | Only used for doors; in the case of double doors, both doors have the same ID and they are flagged as "InUse FaceCollision" |
| |- | | |- |
| | <Textures> | | |valign="top"| <PhysicsType> |
| | - | | |valign="top"| flags |
| | | | | |
| | : None |
| | : Static |
| | : Linear (pushable object) |
| | : Animated (animated via OBAN) |
| | : Newton (same as Linear) |
| | |- |
| | | <ScriptId> |
| | | int32 |
| | | Scripting ID; used by BSL function '''obj_create'''; "65535" means not used. |
| |- | | |- |
| | <Texture Name="..."> | | | <Position> |
| | string | | | vector |
| | TXMP file name to generate. | | | Float x3. Not used for animated objects. |
| |- | | |- |
| |valign="top"| <Format>
| | | <Rotation> |
| |valign="top"| flag | | | quaternion |
| | | | | Float x4. Not used for animated objects. |
| :BGR
| |
| :RGBA
| |
| :BGR555
| |
| :BGRA5551
| |
| :BGRA4444
| |
| |- | | |- |
| |valign="top"| <GunkFlags>
| | | <Scale> |
| |valign="top"| flag | | | float |
| | | | | Not used for animated objects. |
| ;AGQG (Gunk) flags (trimmed list)
| |
| see ''onisplit -help enums'' for more flags
| |
| :None
| |
| :NoCollision
| |
| :NoObjectCollision
| |
| :NoCharacterCollision
| |
| :NoDecal
| |
| :TwoSided
| |
| :Invisible
| |
| |- | | |- |
| | <Image> | | | <Transform> |
| | link | | | matrix |
| | File path to *.tga/jpg/dds file. | | | Float 3*3 + 3 more floats for the X Y Z position of the object. For more information on the matrix, see [[OBD:CRSA]]. Used for animated objects. |
| |- | | |- |
| |valign="top"| <Sky>
| | | <Name> |
| |valign="top"| string | | | char[64] |
| | ONSKfile.oni (without file pre- and suffix) | | | Name of the object; informational only. |
| | |} |
|
| |
|
| The import doesn't work with an empty tag. <Sky>clear</Sky> helps here; any other fictional name will also do.
| | ==ONOA== |
| | Used by static objects (imported by object list). |
|
| |
|
| For detailed information see [[XML:ONSK|HERE]].
| | {| class="wikitable" width="100%" |
| | !width=150px| XML tag |
| | !width=120px| Content type |
| | ! Description |
| |- | | |- |
| | <Objects> | | | <ONOA id="..."> |
| | -
| | | integer |
| |
| | | Instance ID. |
| |-
| |
| |valign="top"| <Import>
| |
| |valign="top"| link
| |
| | File path. Supported files:
| |
| : [[#Character.xml|Character.xml]] (has to contain player character if there's no AISA file with it)
| |
| : Console.xml
| |
| : Door.xml
| |
| : Flag.xml
| |
| : [[#Furniture.xml|Furniture.xml]]
| |
| : Neutral.xml
| |
| : Particle.xml
| |
| : PatrolPath.xml
| |
| : [[#Physics.xml|Physics.xml]]
| |
| : PowerUp.xml
| |
| : Sound.xml
| |
| : Trigger.xml
| |
| : TriggerVolume.xml
| |
| : Weapon.xml
| |
| |- | | |- |
| | <Films> | | | <Elements> |
| | - | | | - |
| | | | | This is an int32 array for the <ONOAElement> tags. |
| |- | | |- |
| | <Import> | | | <ONOAElement> |
| | link
| |
| | File path to *.xml file. OniSplit creates a FILM file from it.
| |
| |-
| |
| | <Cameras>
| |
| | - | | | - |
| | | | | |
| |- | | |- |
| | <Camera Path="..."> | | |valign="top"| <ObjectId> |
| | link | | |valign="top"| integer |
| | File path to *.dae file. OniSplit creates an OBAN file from it. | | | Object ID and type to which this quad belongs (see AKEV's [[XML:AKEV#AGQG|AGQG]] for details). |
| | : Actual object IDs can also be found in BINA/OBJC/####. |
| |- | | |- |
| | <Animation Name="..."/> | | | <QuadList> |
| | string
| | | "#" + integer |
| | Name for the OBAN file.
| | | Link to IDXA instance. Each object has its own IDXA instance. |
| |}
| |
| | |
| | |
| This is a '''trimmed''' version of the master file "lab.xml" from the demo. It's meant to give you a first impression. -- We might upload a smaller demo someday with all features nonetheless.
| |
| | |
| <?xml version="1.0" encoding="utf-8" ?>
| |
| <Oni>
| |
| <Level SharedPath="../shared">
| |
| <Environment>
| |
| <Model>
| |
| <Import Path="env/lab_env.dae"/>
| |
| <Import Path="env/lab_bomber_window.dae"/>
| |
| <Import Path="env/lab_motorcycle.dae">
| |
| <Node Id="motorcycle">
| |
| <ScriptId>9</ScriptId>
| |
| <GunkFlags>NoCollision</GunkFlags>
| |
| </Node>
| |
| </Import>
| |
| </Model>
| |
| <Rooms>
| |
| <Import Path="env/lab_bnv.dae"/>
| |
| </Rooms>
| |
| <Textures>
| |
| <Texture Name="GOO">
| |
| <Format>bgra4444</Format>
| |
| <GunkFlags>NoCollision</GunkFlags>
| |
| <Image>env/images/GOO.tga</Image>
| |
| </Texture>
| |
| </Textures>
| |
| </Environment>
| |
| <Sky>sunset</Sky>
| |
| <Objects>
| |
| <Import>Character.xml</Import>
| |
| <Import>Furniture.xml</Import>
| |
| <Import>TriggerVolume.xml</Import>
| |
| <Import>Physics.xml</Import>
| |
| </Objects>
| |
| <Films>
| |
| <Import>films/BomberKonRun01.xml</Import>
| |
| <Import>films/BomberKonRun02.xml</Import>
| |
| </Films>
| |
| <Cameras>
| |
| <Camera Path="cameras/BomberCam01.dae">
| |
| <Animation Name="BomberCam01"/>
| |
| </Camera>
| |
| <Camera Path="cameras/BomberCam02.dae">
| |
| <Animation Name="BomberCam02"/>
| |
| </Camera>
| |
| </Cameras>
| |
| </Level>
| |
| </Oni>
| |
| | |
| | |
| ====<Model>====
| |
| This tag is mandatory (it must be present to avoid errors); the model section contains one import path to the AKEV (level) geometry (*.dae) and can contain additional import paths for exceptions (*.dae).
| |
| | |
| Data from the demo:
| |
| | |
| <Import Path="env/lab_env.dae"/>
| |
| <Import Path="env/lab_motorcycle.dae">
| |
| <Node Id="motorcycle">
| |
| <ScriptId>9</ScriptId>
| |
| <GunkFlags>NoCollision</GunkFlags>
| |
| </Node>
| |
| </Import>
| |
| | |
| The motorcycle has here script id 9. You can show and hide the object with bsl command env_show whereby the second parameter means true or false.
| |
| | |
| env_show 9 1
| |
| env_show 9 0
| |
| | |
| | |
| EdT demonstrates [http://youtu.be/Em6wa5JTQNM here] env_show. The objects have collision.
| |
| | |
| | |
| The last original level (syndicate mountain compound) has a big satellite dish platform that can be made hidden. Obviously, such objects/areas can be made to have pathfinding too.
| |
| | |
| | |
| ;More possible applications of env_show:
| |
| * grids in front of ventilation shafts (a little door object could be an alternative)
| |
| * ground/ceiling/objects for cutscenes that become partially destroyed
| |
| * destrucable walls [http://www.youtube.com/watch?v=qgJUbPWX5yE like in Deus Ex 3] (trigger volume, replacing punch anim with punch-through-wall anim)
| |
| | |
| | |
| =====Breakable objects with BSL recognition=====
| |
| Broken env objects can be recognized by bsl command ''env_broken (ID_1, ID_N)''. However, this whole thing requires additional code to work.
| |
| | |
| An example is the training level. Let's determine how we can set up such a thing.
| |
| | |
| First we need a [[XML:BINA/OBJC/TRGV|trigger volume]] like in level 1.
| |
| | |
| <TRGV Id="11495">
| |
| <Header>
| |
| <Flags>Locked</Flags>
| |
| <Position>-714.6615 -298 -555.2073</Position>
| |
| <Rotation>0 0 0</Rotation>
| |
| </Header>
| |
| <OSD>
| |
| <Name>tv75</Name>
| |
| <Scripts>
| |
| <Entry></Entry>
| |
| <Inside>targets_gone</Inside>
| |
| <Exit></Exit>
| |
| </Scripts>
| |
| <Teams>255</Teams>
| |
| <Size>400 31 270</Size>
| |
| <TriggerVolumeId>75</TriggerVolumeId>
| |
| <ParentId>0</ParentId>
| |
| <Notes></Notes>
| |
| <Flags>PlayerOnly</Flags>
| |
| </OSD>
| |
| </TRGV>
| |
| | |
| Now we need some BSL code.
| |
| | |
| var int inside_target_function;
| |
|
| |
| func void enter_target_function(void)
| |
| {
| |
| dprint enter_target_function
| |
| inside_target_function = 1;
| |
| }
| |
|
| |
| func void exit_target_function(void)
| |
| {
| |
| dprint exit_target_function
| |
| inside_target_function = 0;
| |
| }
| |
|
| |
| func void targets_are_not_gone(void)
| |
| {
| |
| # CB: turn off the trigger volume and sleep for a second
| |
| # so as not to cause hideous performance loss
| |
| trigvolume_enable tv75 0
| |
| sleep 60
| |
| trigvolume_enable tv75 1
| |
| }
| |
|
| |
| func void targets_gone(string ai_name)
| |
| {
| |
| if(inside_target_function eq 0)
| |
| {
| |
| enter_target_function() # catch other "targets_gone" functions to let them do nothing
| |
|
| |
| var int num_broken = env_broken(3001, 3018);
| |
| # if you only one target use scheme: env_broke(3001, 3001)
| |
|
| |
| if (num_broken eq 18)
| |
| {
| |
| targets_are_gone();
| |
| }
| |
|
| |
| if (num_broken < 18)
| |
| {
| |
| targets_are_not_gone(); # to set check interval to one second
| |
| }
| |
|
| |
| exit_target_function
| |
| }
| |
| }
| |
|
| |
| func targets_are_gone
| |
| {
| |
| trigvolume_enable tv75 0
| |
| # [...]
| |
| }
| |
| | |
| ;Explanation:
| |
| | |
| Player enters the TV, "targets_gone" gets triggered. The variable "inside_target_function" should be 0 be default, so we are entering now the first if statement. Next, we can assume that the player didn't destroy all glass objects, so "num_broken" will be less than 18: "targets_are_not_gone" gets called.
| |
| | |
| The TV function "targets_gone" would be triggered every frame but "targets_are_not_gone" increases the pause between checks: The TV gets deactivated for 60 frames. Then the TV becomes enabled again and will start anew until all glass objects got destroyed or player left the TV.
| |
| | |
| Unnecessary "targets_gone" functions will do nothing because "inside_target_function" was set to 1 by the first one.
| |
| | |
| "targets_are_gone" eventually disables the TV to prevent memory overflow, the function contains also all things "[...]" that you want to happen after the glass target broke.
| |
| | |
| | |
| =====Texture exchange=====
| |
| BSL command [[BSL:PC_vs._Mac_Comparison_(table)|supported]] for PC and Mac:
| |
| : env_texswap ID texture
| |
| | |
| Might be useful to switch on/off static and animated textures. (News screen: running or off or smashed. Lava stream: flowing or stagnating or cooled down. Etc.)
| |
| | |
| | |
| =====Vertex shading?=====
| |
| Observation: The sniper tower from level 19 Syndicate Mountain Compound can be isolated and re-imported as it is. It will appear quite dark.
| |
| | |
| If we remove "_color" from the object the shadows will be gone next time we import the tower.
| |
| | |
| Mod Tool: Explorer [8]
| |
| | |
| Object
| |
| |
| |
| +-- Polygon Mesh
| |
| |
| |
| +-- Cluster
| |
| |
| |
| +-- Polygon
| |
| | |
| |
| | +-- [...]
| |
| |
| |
| +-- NodeProperties
| |
| |
| |
| +-- '''_color'''
| |
| +-- texcoord (Explicit UVWs)
| |
| |
| |
| +-- Vertex_Color_Def
| |
| | |
| So, how do we modify that data?
| |
| | |
| Some [http://download.autodesk.com/global/docs/softimage2013/en_us/userguide/index.html?url=files/scel_vertexcolor.htm,topicNumber=d30e45698 reading material], maybe it contains something useful for us.
| |
| | |
| Something [http://oni.bungie.org/community/forum/viewtopic.php?pid=29089#p29089 better at ocf?]
| |
| | |
|
| |
| ====<Rooms>====
| |
| This tag is mandatory. It contains a link to BNV data (*.dae) which is used to create pathfinding grids.
| |
| | |
| For example:
| |
| <Import Path="env/lab_bnv.dae"/>
| |
| | |
| Making BNV consist of 2 parts: rooms and ghost quads. Every ghost has to be parallel to 2 room quads.
| |
| | |
| (What again does BNV stand for?)
| |
| | |
| | |
| ;In Mod Tool
| |
| * those objects are named "ghost_''N''" and "room_''N''"; whereby room is an area for pathfinding and ghost connect those areas
| |
| * ghosts are vertical planes with a transparent texture named "_marker_ghost.tga"
| |
| * rooms are horizontal planes with textures named "bnv_grid_''N''.tga"
| |
| | |
| | |
| ;Tolerance values
| |
| * horizontal distance from room to ghost: 1
| |
| * vertical distance from room to ghost: 18
| |
| * ghost horizontal dimension must be bigger than 0
| |
| * under optimal circumstances pathfinding works on a plane that is +4 world units above or -0,5 beneath the pathfinding grid
| |
| * characters can step on a plane that is 4 world units above pathfinding grid; higher planes need a ramp
| |
| * max degree of ramp you can go on is 70°; bigger degrees make characters slide down a bit and then fall through to death
| |
| | |
| | |
| ;BSL commands
| |
| * chr_show_bnv = 1
| |
| :: shows number of bnv the player is standing on
| |
| * ai2_showgrids = 1
| |
| :: shows pathfinding grids
| |
| * ai2_chump
| |
| :: spawns a friendly striker that follows the player if possible, makes also pathfinding grids visible
| |
| | |
| | |
| ====<Textures>====
| |
| This tag is mandatory. Textures become imported as they are; in the texture section you declare exceptions.
| |
| | |
| <Texture Name="GOO">
| |
| <Format>bgra4444</Format>
| |
| <GunkFlags>NoCollision</GunkFlags>
| |
| <Image>env/images/GOO.tga</Image>
| |
| </Texture>
| |
| | |
| * There you can give a texture a special format, for example "bgra4444", to make it transparent.
| |
| * Use gunkflag "TwoSided" to make surfaces visible from both sides.
| |
| * If the texture comes with gunkflag "NoCollision" then all objects with that texture will have no collision. Characters would fall through it.
| |
| | |
| Both makes sense, let's say, for a water-like substance. The biolab use this for an area with green acid.
| |
| | |
| {| style="float:right"
| |
| |[http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/3D_modding/making_a_surface_transparent_and_twosided_zpsa8950d1f.png http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/3D_modding/making_a_surface_transparent_and_twosided_tn_zpsae6709f0.png]
| |
| |} | | |} |
|
| |
|
| | Where do the links go to again? |
|
| |
|
| ;TwoSided objects
| | ONOA <ObjectId> -> AKEV AGQG -> BINA/OBJC/#### by type and ID |
| It's also possible to set this in Mod Tool. Use one image source for diffuse and transparency.
| | ONOA <QuadList> -> ONOA IDXA -> AKEV AGQG by order |
| | |
| It won't work with two image sources even if both sources use the same image. See screenshot if you are still unsure about this.
| |
| | |
| | |
| ====<Objects>====
| |
| =====Character.xml=====
| |
| This file is mandatory. It has to contain a player character or else Oni crashes when ca. 60% of the level got loaded.
| |
| | |
| | |
| =====Furniture.xml=====
| |
| The AKEV core geometry is more or less unique while this furniture file adds standard objects (e.g. crates and desks) to it.
| |
|
| |
|
| | ==ENVP== |
| {| class="wikitable" width="100%" | | {| class="wikitable" width="100%" |
| !width=150px| XML tag | | !width=150px| XML tag |
| !width=120px| content type | | !width=120px| Content type |
| ! description | | ! Description |
| |- | | |- |
| | <?xml version="1.0" encoding="utf-8"?> | | | <ENVP id="..."> |
| |valign="top"| float, flag | | | integer |
| |valign="top"| Ignore this. | | | Instance ID. |
| |- | | |- |
| | <Oni> | | | <Particles> |
| | | - |
| | | This is an int16 array for the <ENVPParticle> tags. If there's not going to be any contents, you put <Particles /> here. |
| | |- |
| | | <ENVPParticle> |
| | - | | | - |
| | | | | |
| |- | | |- |
| | <Objects> | | | <Class> |
| | - | | | char[64] |
| | This tags marks the file as BINACJBO. | | | <font color="#777777">BINA3RAP</font>file<font color="#777777">.oni</font> <font color="#777777">(don't use file prefix/suffix)</font>. |
| | |- |
| | | <Tag> |
| | | char[48] |
| | | Particle's scripting name for BSL commands; see [[XML:OFGA#XML_tags|OFGA]] for more information on name composition. |
| |- | | |- |
| | <Furniture> | | | <Transform> |
| | - | | | matrix |
| | This tags marks the file as FURN. | | | Float 3*3 + 3 more floats for the X Y Z position of the particle. For more information on the matrix, see [[OBD:CRSA]]. |
| |- | | |- |
| | <Header> | | | <DecalScale> |
| | | | | int32, int32 |
| | | | | X Y |
| |- | | |- |
| |valign="top"| <Flags> | | |valign="top"| <Flags> |
| |valign="top"| flag | | |valign="top"| flag |
| | Optional tag. (Do those flags even work?) | | | |
| :None | | : None |
| :Locked
| | : NotInitiallyCreated |
| :PlacedInGame
| | |} |
| :Temporary
| | |
| :Gunk
| | ==CRSA== |
| | {| class="wikitable" width="100%" |
| | !width=150px| XML tag |
| | !width=120px| Content type |
| | ! Description |
| | |- |
| | | <CRSA id="..."> |
| | | integer |
| | | Instance ID. |
| | |- |
| | |valign="top"| <FixedCount> |
| | |valign="top"| integer |
| | | The array capacity of <Corpses> is larger than the number of "fixed"/"used" corpses in order to allow the engine to store new corpses at runtime. "Fixed" means that those corpses are never overwritten/deleted at runtime – all new corpses are stored after the "fixed" ones. This means that "fixed" <= "used" <= "capacity". |
| | |- |
| | | <UsedCount> |
| | | integer |
| | | |
| | |- |
| | |valign="top"| <Corpses> |
| | |valign="top"| - |
| | | This is an int32 array for the <CRSACorpse> tags. By default, Oni wants 20 slots for corpses. Unused corpses have their matrix and bounding box filled with zeroes. |
| | |- |
| | |valign="top"| <CRSACorpse> |
| | |valign="top"| - |
| | | [[Authoring_custom_camera_animations|New corpses]] can be made with the BSL command '''make_corpse filename''' and some hex-editing. The pose of the corpse is taken from the player character. The contents of the files thus created can then be inserted as elements in a level's CRSA. |
| | |- |
| | | <CharacterClass> |
| | | link |
| | | [[XML:ONCC|ONCC]]''name'' |
| | |- |
| | | <Transforms> |
| | | - |
| | | There are 19 <Matrix4x3> for each <Transforms> (which represents a body part). |
| |- | | |- |
| | <Position> | | | <Matrix4x3> |
| | | matrix |
| | | Float 3x3 + float x3 for the last 3 values (X Y Z position). For more information about the matrix, see [[OBD:CRSA]]. |
| | |- |
| | | <BoundingBox> |
| | | - |
| | | Bounding box of the whole corpse. |
| | |- |
| | | <Min> |
| | float x3 | | | float x3 |
| | Optional tag. X Y Z position. | | | |
| |- | | |- |
| | <Rotation> | | | <Max> |
| | float x3 | | | float x3 |
| | Optional tag. X Y Z rotation. | | | |
| | |} |
| | |
| | ==M3GA== |
| | There can be one M3GA instance per animated object. Animated meshes of doors are embedded in ONLV. All other animated meshes are stored outside it as M3GM files. |
| | |
| | {| class="wikitable" width="100%" |
| | !width=150px| XML tag |
| | !width=120px| Content type |
| | ! Description |
| |- | | |- |
| | <OSD> | | | <M3GA id="..."> |
| | | integer |
| | | Instance ID. |
| | |- |
| | | <Geometries> |
| | - | | | - |
| | | | | This is an int32 array for the <Link> tags. |
| |- | | |- |
| |valign="top"| <Class> | | |valign="top"| <Link> |
| |valign="top"| link | | |valign="top"| link |
| | File path to an [[XML:OFGA|OFGA]] (*.oni) file. Make sure that the OFGA comes also with the files it needs: M3GM and TXMP. | | | |
| | | : #''N'' (instance number) (for non-door) |
| OFGA can hold multiple M3GM. That 3d content will be integrate into the AKEV.
| | : M3GM''name'' (for door) |
| |-
| | It can happen that you see here references to DAE files. This happens when the ONLV was created with some older OniSplit version (like 0.9.86.0) and if the ONLV was converted to xml in absence of the resources used by M3GA. |
| |valign="top"| <Particle>
| |
| |valign="top"| string
| |
| | This name gets written into <Tag> inside ONLV (ENVP section) and can be used with BSL commands.
| |
| | |
| E.g. you can take control over a particle via "particle BSL_name start". For more commands see [[XML:BINA/OBJC/PART#BSL_support|HERE]].
| |
| | |
| Caution with new OFGA files. The particle name will be composed of 2 parts and always includes an "_" underscore. '''Examples:'''
| |
| | |
| : FURN <Particle>test</Particle> + OFGA <Tag>streetlight</Tag> = '''test_streetlight'''
| |
| : FURN <Particle></Particle> + OFGA <Tag>streetlight</Tag> = '''_streetlight'''
| |
| : FURN <Particle>test</Particle> + OFGA <Tag></Tag> = '''test_'''
| |
| |} | | |} |
|
| |
|
| | ==M3GM== |
| | Read about them here [[XML:M3GM|HERE]]. Note that M3GMs have their own component instances: PNTA, VCRA (x2), TXCA, IDXA (x2). Doors store their animated model in ONLV, while the static model comes from BINACJBODOOR.oni, which also links to M3GM files. |
|
| |
|
| ;Example
| | ==IDXA== |
| | |
| <?xml version="1.0" encoding="utf-8"?>
| |
| <Oni>
| |
| <Objects>
| |
| | |
| <Furniture>
| |
| <Header>
| |
| <Flags>Gunk</Flags>
| |
| <Position>-62.692 -29 108.35</Position>
| |
| <Rotation>181.522 356.021 178.114</Rotation>
| |
| </Header>
| |
| <OSD>
| |
| <Class>furniture/V_tctf_bigvan.oni</Class>
| |
| </OSD>
| |
| </Furniture>
| |
| | |
| </Objects>
| |
| </Oni>
| |
| | |
| | |
| =====Physics.xml===== | |
| This file is for objects with "physics". Unlike AKEV core geometry or furniture, those objects can be animated.
| |
| | |
| {| class="wikitable" width="100%" | | {| class="wikitable" width="100%" |
| !width=150px| XML tag | | !width=150px| XML tag |
| !width=120px| content type | | !width=120px| Content type |
| ! description | | ! Description |
| |- | | |- |
| | <?xml version="1.0" encoding="utf-8"?> | | | <IDXA id="..."> |
| |valign="top"| float, flag | | | integer |
| |valign="top"| Ignore this. | | | Instance ID. |
| |- | | |- |
| | <Oni> | | | <Indices> |
| | - | | | - |
| | | This is an Int32 array for the <Int32> tags. |
| | |- |
| | |valign="top"| <Int32> |
| | |valign="top"| int32 |
| | | | | |
| | ; From ONOA to AGQG elements |
| | : Link to <AGQGQuad>s in [[XML:AKEV#AGQG|AGQG]] by order. (The array in AGQG starts with 0, so for example <Int32>6</Int32> would link to the 7th <AGQGQuad>.) |
| | ; From M3GM to PNTA elements |
| | : Read more [[XML:M3GM#PNTA|HERE]]. |
| | ; From M3GM to VCRA elements |
| | : Read more [[XML:M3GM#VCRA|HERE]]. |
| | |} |
| | |
| | ==Level files hierarchy== |
| | {| width="100%" style="text-align:center; empty-cells: hide" |
| | |width="20%" style="background-color:#CCFFCC;"| (un)colored cell = file |
| | |width="20%" style="background-color:#CCFFCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| striped cell = embedded instance |
| | |width="20%"| |
| | |width="20%"| |
| | |width="20%"| |
| | |} |
| | |
| | {|class="wikitable" width="100%" style="text-align:center" |
| | |style="background-color:#DDDDDD;"| ONLV |
| | |width="20%"| |
| | |width="20%"| |
| | |width="20%"| |
| | |width="20%"| |
| |- | | |- |
| | <Physics> | | | [[Image:Chart fork right.gif]] |
| | - | | |style="background-color:#CCCCFF;"| AKEV |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PNTA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PLEA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXCA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQG |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQR |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQC |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQC |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGDB |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXMA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart turn right.gif]] |
| | | TXMP |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKVA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKBA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKBP |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ABNA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKOT |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| OTIT |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"|OTLF |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| QTNA |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart turn right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKAA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart turn right.gif]] |
| | |style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKDA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| OBOA |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| M3GA |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart turn right.gif]] |
| | |style="background-color:#FFCCCC;"| M3GM |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PNTA |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| VCRA |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXCA |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart descend.gif]] |
| | | |
| | | [[Image:Chart turn right.gif]] |
| | | TXMP |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | | OBAN |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart turn right.gif]] |
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ENVP |
| | | |
| | | |
| | |- |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONMA |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONFA |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONTA |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart turn right.gif]] |
| | | ONSK |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | | TXMP |
| | | |
| | | |
| | |- |
| | | [[Image:Chart fork right.gif]] |
| | | AISA |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart fork right.gif]] |
| | | ONCC |
| | | |
| | | |
| | |- |
| | | [[Image:Chart descend.gif]] |
| | | [[Image:Chart turn right.gif]] |
| | | ONWC |
| | | |
| | | |
| | |- |
| | | [[Image:Chart fork right.gif]] |
| | | AITR |
| | | |
| | | |
| | | |
| | |- |
| | | [[Image:Chart fork right.gif]] |
| | | ONSA |
| | | |
| | | |
| | | | | |
| |- | | |- |
| | <Object Name="..."> | | | [[Image:Chart fork right.gif]] |
| | string | | | OBDC |
| | Use an unique name for each object. | | | |
| | | |
| | | |
| |- | | |- |
| |valign="top"| <ScriptId> | | | [[Image:Chart descend.gif]] |
| |valign="top"| integer | | | [[Image:Chart turn right.gif]] |
| | Tested with BSL command ... | | |style="background-color:#FFFFAA;"| M3GM |
| :obj_create Id [Id]
| | | |
| :obj_kill Id [Id]
| | | |
| :env_anim Id [Id]
| |
| :env_setanim Id [Id]
| |
| |- | | |- |
| |valign="top"| <Flags> | | | [[Image:Chart descend.gif]] |
| |valign="top"| flag | | | |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PNTA |
| | | | | |
| ;Object setup flags
| |
| :None
| |
| :InUse
| |
| :NoCollision
| |
| :NoGravity
| |
| :FaceCollision
| |
| |- | | |- |
| |valign="top"| <Physics> | | | [[Image:Chart descend.gif]] |
| |valign="top"| flag | | | |
| | Optional tag of Object. | | | [[Image:Chart fork right.gif]] |
| :None | | |style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| VCRA |
| :Static | | | |
| :Linear
| |
| :Animated
| |
| :Newton (used with <Flags> FaceCollision to [http://www.youtube.com/watch?v=YICB7qugrtc make object pushable])
| |
| |- | | |- |
| | <Position> | | | [[Image:Chart descend.gif]] |
| | float x3 | | | |
| | Optional tag of Object. Only used for non-animated objects. X Y Z position. | | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXCA |
| | | |
| |- | | |- |
| | <Rotation> | | | [[Image:Chart descend.gif]] |
| | float x3 | | | |
| | Optional tag of Object. Only used for non-animated objects. X Y Z rotation. | | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA |
| | | |
| |- | | |- |
| | <Scale> | | | [[Image:Chart descend.gif]] |
| | float | | | |
| | Optional tag of Object. Only used for non-animated objects. | | | [[Image:Chart turn right.gif]] |
| | | TXMP |
| | | |
| |- | | |- |
| | | [[Image:Chart fork right.gif]] |
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONOA |
| | | |
| | | |
| | | | | |
| <Import Path="...">
| |
|
| |
| <Import Url="...">
| |
| |valign="top"| link
| |
| |valign="top"| This tag comes in two variants. It doesn't matter what variant you use.
| |
| |- | | |- |
| | <Animation Name="..."> | | | [[Image:Chart descend.gif]] |
| | link | | | [[Image:Chart turn right.gif]] |
| | File path to *.dae file. | | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA |
| | | |
| | | |
| |- | | |- |
| |valign="top"| <Flags> | | | [[Image:Chart fork right.gif]] |
| |valign="top"| flag
| | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ENVP |
| | Optional tag of Animation. For more information on those flags look [[XML:OBAN|OBAN]] page.
| | | |
| | | | |
| ;Object animation flags | | | |
| :None | |
| :Loop
| |
| :PingPong
| |
| :RandomStart
| |
| :AutoStart
| |
| :Local
| |
| |- | | |- |
| | <End> | | | [[Image:Chart turn right.gif]] |
| | integer | | |style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| CRSA |
| | Optional tag of Animation. Frame number. Used to define the end of an OBAN from an *.dae file. | | | |
| | | |
| | | |
| |- | | |- |
| | <Start> | | | |
| | integer | | | [[Image:Chart turn right.gif]] |
| | Optional tag of Animation. Frame number. Used to define the start of an OBAN from an *.dae file. | | | ONCC |
| | | |
| | | |
| |} | | |} |
|
| |
|
| | | {{XML}} |
| ;Example
| |
| | |
| For documentation purpose the file here has been trimmed down.
| |
| <?xml version="1.0" encoding="utf-8"?>
| |
| <Oni>
| |
| <Physics>
| |
| | |
| <Object Name="motorcycle">
| |
| <ScriptId>8</ScriptId>
| |
| <Flags>FaceCollision</Flags>
| |
| <Import Url="motorcycle/export.dae">
| |
| <Animation Name="motorcycle02">
| |
| <Flags>AutoStart</Flags>
| |
| <End>880</End>
| |
| </Animation>
| |
| <Animation Name="motorcycle02_stop">
| |
| <Start>881</Start>
| |
| </Animation>
| |
| </Import>
| |
| </Object>
| |
| | |
| </Physics>
| |
| </Oni>
| |
| | |
| In this example OniSplit takes the "export.dae" file, looks what parts it contains and creates geometry files from it.
| |
| * M3GMhubs_rear.oni
| |
| * M3GMhubs.oni
| |
| * M3GMmotocycle.oni
| |
| It's a nice feature that hierarchies are supported here.
| |
| | |
| The motorcycle is made of 3 parts so 3 object animations ([[XML:OBAN|OBAN]]) will be created up to frame 880. Then OniSplit creates 3 more OBANs starting from frame 881.
| |
| | |
| The reason for the interruption at frame 880 is probably to give barabas a few more frames of glory in the cutscene.
| |
| * OBANmotorcycle0200.oni
| |
| * OBANmotorcycle0201.oni
| |
| * OBANmotorcycle0202.oni
| |
| * OBANmotorcycle02_stop00.oni
| |
| * OBANmotorcycle02_stop01.oni
| |
| * OBANmotorcycle02_stop02.oni
| |
| | |
| | |
| | |
| ;Notes about BSL usage:
| |
| | |
| The bio lab script file use the motorcycle objects and animations like this:
| |
| env_show 9 0 # hide solid motorcycle parts (because they get visible at level start)
| |
| # in the original game the motorcycle is separated in object 8, 9 and 10
| |
| # also the OBAN files have a bit different names
| |
|
| |
| # obj and env objects are totally independent from each other
| |
| # so their script ids might not be the same
| |
|
| |
| obj_create 8 10 # create animation-ready non-collision motorcycle parts
| |
| env_anim 8 10 # animate those parts (not necessary if OBAN flag is "AutoStart")
| |
|
| |
| # the first animations would loop because of "AutoStart"
| |
| # so get the right timing to apply the other animations
| |
| # "motorcycle02_stop00" and the others will not loop because they don't have "AutoStart"
| |
| env_setanim 8 motorcycle02_stop00 # motorcycle
| |
| env_setanim 9 motorcycle02_stop01 # hubs
| |
| env_setanim 10 motorcycle02_stop02 # hubs_rear
| |
|
| |
| obj_kill 8 10 # delete animated parts
| |
| env_show 9 1 # show solid motorcycle parts
| |
| | |
| | |
| | |
| ==Exported Oni Level (ONLV*.xml)==
| |
| {| border=0 cellspacing=20 cellpadding=0 style="float:right" | |
| | skybox file ONSKafternoon<br>[http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/3D_modding/ONSKafternoon.png http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/3D_modding/ONSKafternoon_tn.png]
| |
| |}
| |
| | |
| File structure
| |
| | |
| * ONLV instance
| |
| : <Name> - this is your BSL folder (save game slot and level number are defined inside [[OBD_talk:ONLD|ONLD]])
| |
| : <Environment> - link to AKEV file (solid level geometry)
| |
| : <Objects> - link to OBOA instance (animated level geometry, sometimes particles)
| |
| : <SkyBox> - link to ONSK file, originally there are 4 files in level 0: crapsky, night, sunset, afternoon
| |
| : <Characters> - link to AISA file (pendant of [[OBD_talk:BINA/OBJC/CHAR#XML|BINACJBOCharacter file]]), holds character spawn collection
| |
| : <ObjectQuadMap> - link to ONOA instance (maybe spawnable / function holding objects ?)
| |
| : <Particles> - link to ENVP instance (pendant of [[OBD_talk:BINA/OBJC/PART|BINACJBOParticle]]), holds particle spawn collection, door lock lights are typically stored inside ENVP
| |
| : <Corpses> - link to CRSA instance (corpses consist of 19 body parts)
| |
| * OBOA instance
| |
| : ...
| |
| * ONOA instance
| |
| : ...
| |
| * ENVP instance
| |
| : ...
| |
| * CRSA instance
| |
| : ...
| |
| * M3GA
| |
| : ...
| |
| * IDXA
| |
| : ...
| |
| | |
| | |
| | |
| '''Flags in the <OBOAObject> section'''
| |
| | |
| These are also used for the physics.xml file
| |
| : '''<Flags>'''
| |
| :: <!-- None -->
| |
| :: InUse
| |
| :: NoCollision
| |
| :: NoGravity
| |
| :: FaceCollision
| |
| : '''<PhysicsType>'''
| |
| :: None
| |
| :: Static
| |
| :: Linear
| |
| :: Animated
| |
| :: Newton
| |
| | |
| | |
| | |
| Sample code from a trimmed warehouse level.
| |
| | |
| <font color="#FF0000">'''''[...]'''''</font> mean another Corpse code block. There are usually 20 in total. They are somehow needed to prevent bugs.
| |
| | |
| <?xml version="1.0" encoding="utf-8"?>
| |
| <Oni>
| |
| <ONLV id="0">
| |
| <Name>EnvWarehouse</Name>
| |
| <Environment>AKEVEnvWarehouse</Environment>
| |
| <Objects>#1</Objects>
| |
| <SkyBox>ONSKafternoon</SkyBox>
| |
| <Characters>AISAlevel1_scripts</Characters>
| |
| <ObjectQuadMap>#2</ObjectQuadMap>
| |
| <Particles>#3</Particles>
| |
| <Corpses>#4</Corpses>
| |
| </ONLV>
| |
| <OBOA id="1">
| |
| <Objects />
| |
| </OBOA>
| |
| <ONOA id="2">
| |
| <Elements />
| |
| </ONOA>
| |
| <ENVP id="3">
| |
| <Particles />
| |
| </ENVP>
| |
| <CRSA id="4">
| |
| <FixedCount>0</FixedCount>
| |
| <UsedCount>0</UsedCount>
| |
| <Corpses>
| |
| <CRSACorpse>
| |
| <CharacterClass></CharacterClass>
| |
| <Transforms>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| <Matrix4x3>0 0 0 0 0 0 0 0 0 0 0 0</Matrix4x3>
| |
| </Transforms>
| |
| <BoundingBox>
| |
| <Min>0 0 0</Min>
| |
| <Max>0 0 0</Max>
| |
| </BoundingBox>
| |
| </CRSACorpse>
| |
| <font color="#FF0000">'''''[...]'''''</font>
| |
| </Corpses>
| |
| </CRSA>
| |
| </Oni>
| |
| | |
| '''not empty OBOA - example from level 19'''
| |
| | |
| (exported ONLV files seem to contain 32 empty <OBOAObject> sections)
| |
| | |
| If I remember correctly this one is only an object for the cutscene. Maybe the real floor(s) (those with collision) can be tracked down with the id used by bsl.
| |
| | |
| | |
| | |
| <OBOAObject>
| |
| <Geometry>#347</Geometry>
| |
| <Animation>OBANDishFloor01</Animation>
| |
| <Particle></Particle>
| |
| <Flags>InUse</Flags>
| |
| <DoorGunkId>0</DoorGunkId>
| |
| <DoorId>0</DoorId>
| |
| <PhysicsType>Animated</PhysicsType>
| |
| <ScriptId>204</ScriptId>
| |
| <Position>-183 99.59154 -2501.25</Position>
| |
| <Rotation>0.7071067 -1.545431E-08 1.545431E-08 0.7071068</Rotation>
| |
| <Scale>1</Scale>
| |
| <Transform>1 -4.371139E-08 -5.21253064E-16 0 1.19248806E-08 -1 4.371139E-08 1 1.19248806E-08 -183 99.5815353 -2501.25</Transform>
| |
| <Name>object_DishFloor01</Name>
| |
| </OBOAObject>
| |
| | |
| | |
| '''not empty ENVP - example from level 19'''
| |
| <ENVPParticle>
| |
| <Class>locklight</Class>
| |
| <Tag>mainchamber_locklight01</Tag>
| |
| <Transform>1 -4.559326E-08 1.35404189E-05 -1.354042E-05 -2.03512554E-05 1 -4.53176945E-08 -1 -2.03512554E-05 -391.790527 58.0480423 -1364.412</Transform>
| |
| <DecalScale>1 1</DecalScale>
| |
| <Flags></Flags>
| |
| </ENVPParticle>
| |
| | |
| <Transform> - the last 3 values are the position (x, y, z)
| |
| | |
| <Flags>
| |
| : <!-- None -->
| |
| : NotInitiallyCreated
| |
| | |
| | |
| ==Exported Akira Environment (AKEV*.xml)==
| |
| Somehow I would like to have the AKEV and ONLV information on one page (like the sound stuff on SNDD). Let's see how this turns out.
| |
| | |
| | |
| '''AGQG flags''' - appears to be used by '''textures.xml <GunkFlags>''' (just some or all of them ?)
| |
| <!-- : None -->
| |
| : DoorFrame (invisible quad that uses the TXMP_DOOR_FRAME texture)
| |
| : Ghost (pathfinding volume separator, see [[OBD:AKVA|AKVA]] etc)
| |
| : StairsUp
| |
| : StairsDown
| |
| : Stairs
| |
| : Triangle
| |
| : Transparent
| |
| : TwoSided
| |
| : NoCollision
| |
| : Invisible
| |
| : NoObjectCollision
| |
| : NoCharacterCollision
| |
| : NoOcclusion
| |
| : Danger
| |
| : Horizontal (slope > 70°)
| |
| : Vertical (slope < 70°)
| |
| : GridIgnore
| |
| : NoDecals
| |
| : Furniture
| |
| : ProjectionBit0
| |
| : ProjectionBit1
| |
| : SoundTransparent
| |
| : Impassable
| |
| | |
| | |
| '''(Copied from hex page. Is this still up to date ?)'''
| |
| | |
| ;Triangles
| |
| :Many quads are in fact triangles: the last two vertices have the same [[OBD:PNTA|PNTA]] and [[OBD:TXCA|TXCA]] entries, and the ARGB color is (255, 205, 205, 205) (80% gray, 100% opaque). There is also a flag specifying that.
| |
| | |
| ;Ghost, StairsUp, StairsDown
| |
| :These flags are used for BNV adjacencies, see [[AKAA]]. Stairs up/down are used instead of Ghost when the quad is placed at the bottom/top of the stairs. These quads are not visibile. The script variable env_show_ghostgqs is intended to control the visibility of such quads but it requires "debug" level files.
| |
| | |
| :There are a couple of ghost quads that aren't referenced from [[AKAA]]. It's likely that those quads are useless.
| |
| | |
| ;DoorFrame
| |
| :This appears to be another type of "ghost" quad (its visibility is controlled by the same env_show_ghostgqs variable). Sometimes it is used together with the Ghost flag but not always. Only the door frames that also have the Ghost flag are used as adjacencies so it's unclear if the rest of the door frames serve any purpose. In fact it appears that this flag has no effect other than making the quad invisible.
| |
| | |
| ;Stairs
| |
| :This is applied to the invisible ramp quad that covers the stairs. In general this flag is also applied to the visible stairs geometry but there are some exceptions (errors? see level 19 stairs).
| |
| | |
| ;NoOcclusion
| |
| :This flag tells the octtree raycaster to ignore the quad when doing ray/quad intersections. This is tipically used for small quads that are unlikely to affect the overall environment visibility.
| |
| | |
| ;ProjectionBit
| |
| :These 2 flags can be 00, 01, 10 and 11. That means the values 0,1,2 and 3 which have the following meanings:
| |
| :*0 - No projection plane specified. One can be computed if needed. Never used in files, may slow down the game if used.
| |
| :*1 - Project quad on XY plane.
| |
| :*2 - Project quad on XZ plane.
| |
| :*3 - Project quad on YZ plane.
| |
| :The projection plane is used to determine if a point is in a quad (this point is usually the result of an intersection between a ray and the quad plane).
| |
| | |
| ;GridIgnore
| |
| :Appears to be unused. Its likely purpose is to mark quads that don't count as obstacles in the pathfinding grid.
| |
| | |
| ;Danger
| |
| :Appears to be unused. Its likely purpose is to create danger areas in the pathfinding grids. Usually there's a trigger volume nearby that hurts/kills the character. This quads are always invisible.
| |
| | |
| ;Invisible
| |
| :Invisible quads have a couple of different uses:
| |
| :* block player access to some parts of the environment
| |
| :* stairs ramp
| |
| :* collision geometry (used by some "complex" furniture)
| |
| :* danger quads (see above)
| |
| :* some other apparently useless quads
| |
| | |
| ;Furniture
| |
| :Set for all quads that belong to a furniture object. It doesn't appear to be used. It is also redundant since all the furniture quads have an object id.
| |
| | |
| ;NoDecals
| |
| :Prevents the creation of decals on the quad. Set for door quads because the decals would disappear when the door opens. That's why shooting a door doesn't leave a mark.
| |
| | |
| ;Impassable
| |
| :Probably used by forcefields and end of level boundaries (like in state archive level).
| |
| | |
| | |
| ==Ideas to test out==
| |
| None ATM.
| |
| | |
| | |
| ==Ideas that has been tested==
| |
| ===Sky dome - it's a fail===
| |
| {| border=0 cellspacing=20 cellpadding=0 align=right
| |
| | sky box<br>[http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XML_modding/ugly_skybox_lines.jpg http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/XML_modding/ugly_skybox_lines_tn.jpg]
| |
| | sky dome<br>[http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/3D_modding/sky_dome_512x512.jpg http://i305.photobucket.com/albums/nn207/unknownfuture/Oni_Galore_Images/3D_modding/sky_dome_512x512_tn.jpg]
| |
| |}
| |
| | |
| Maybe it's possible to create a very big sphere or dome that covers the entire level (and let Oni's skybox unused). If it's doable it could avoid ugly lines of the skybox coming from OpenGL rendering.
| |
| | |
| | |
| '''Update:''' 12 June 2012
| |
| | |
| New issues appeared that need to take care about:
| |
| | |
| * brightness:
| |
| : The brightness can be somewhat influenced by BSL commands like with gl_fog_..., gs_farclipplane and must be set adequately.
| |
| | |
| * texture size:
| |
| : The dome seen in the screenshot has a texture size of 512x512 and hence looks quite ''pixelated''.
| |
| : The problem might be solved by splitting the dome into sectors and giving each sector its own texture.
| |
| | |
| | |
| {| border=0 cellspacing=20 cellpadding=0 align=right
| |
| | gl_fog_start=.99999<br>[http://i305.photobucket.com/albums/nn207/unknownfuture/OCF_Images/sky4sectors_b.jpg http://i305.photobucket.com/albums/nn207/unknownfuture/OCF_Images/sky4sectors_b_tn.jpg]
| |
| | test level over [http://mods.oni2.net/node/202 HERE]<br>[http://i305.photobucket.com/albums/nn207/unknownfuture/OCF_Images/sky4sectors_a.jpg http://i305.photobucket.com/albums/nn207/unknownfuture/OCF_Images/sky4sectors_a_tn.jpg]
| |
| |}
| |
| | |
| '''Update:''' 14 June 2012
| |
| | |
| * texture boarder and distortions:
| |
| : Texture boarders have darker pixels so the UV must not reach them. Also after splitting the textures inside the editor there will be little distortions but they are still noticeable enough to make the sky look odd. Fine-tuning the UVs didn't really help.
| |
| | |
| * The gs_farclipplane max value makes the size of the dome quite limited: I think that the max radius here is somewhere between 2500 and 5000 world units.
| |
| | |
| I consider this as a ''fail''. Oni would need bigger view range and a texture support of 2096x2096.
| |
| | |
| | |
| ==Ideas for onisplit==
| |
| Neo might update OniSplit so that it is searching specific strings in object names of a dae level file.
| |
| | |
| | |
| '''Cutscene cams'''
| |
| * string "cutscene''N''" (e.g. cutscene231) -> OBAN
| |
| | |
| | |
| '''Doors'''
| |
| * string "door*" (e.g. doorBlastDoorMX2000) -> DOOR + BINACJBODoor + OBAN
| |
| ** but if the string is "door*clone''N''" then the DOOR and OBAN creation gets skipped (e.g. doorBlastDoorMX2000clone3), only class name, rotation and position get written into BINACJBODoor
| |
| | |
| | |
| '''Animated objects'''
| |
| * string "*_BeforeAnim": that's first static object with collision data (e.g. BlueCar1_BeforeAnim)
| |
| * string "*_InAnim": that's the animated cutscene object (e.g. BlueCar1_InAnim)
| |
| * string "*_AfterAnim": that's the second static object with collision data (e.g BlueCar1_AfterAnim)
| |
| | |
| | |
| '''Fake-destructible objects'''
| |
| * string "*_BeforeAnim": that's first static object with collision data (e.g. ConcreteWall2_BeforeAnim)
| |
| * string "*_Fragment''N''": that's the group of animated cutscene objects (fragments of the static object) (e.g. ConcreteWall2_Frag5)
| |
| * string "*_ColFrag''N''": that's the group of static objects with collision data (e.g. ConcreteWall2_ColFrag5)
| |
| * string "*_NoColFrag''N''": that's the group of static objects without character collision (e.g. ConcreteWall2_NoColFrag5)<br>NoColFrag would be useful if the fragments are quite numerous and small and hence would pose a problem to the pathfinding
| |