? SIM.3D ● SmileBASIC Source

Sign In

Register
*Usernames are case-sensitive
Forgot my password

SIM.3D

Submitted
Updated
Author
Simeon
Public Key
KF5J3B3
Min. Compat.
All
Version
1.4
Size
68KB
Rating
23 votes
Description

A lightweight yet powerful 3D game engine

Instructions

What's New

_____________________

Version 1.4

  1. Added TEXT as a new object type! Check the documentation for more details! Game worlds can easily display messages as 3D objects.
  2. CHESS.3D has been worked on, the AI is more intelligent and uses alpha-beta pruning to simulate ahead in the future to find how to maximize the minimum score. In the first few lines you can set the AI_VS_AI to watch it play against itself.
  3. Every demo has been updated to make use of the new features.
  4. Fixed the randomly-appearing-flickering-lines-bug for DLC users.
  5. Fixed triangles-sometimes-not-rendering-glitch for non-DLC users.
  6. Also non-DLC users run at a fairly higher framerate due to less function calls.
  7. Perspective calculations and rendering have been worked on a lot, graphics are much smoother.
  8. Added a new demo to showcase 3D randomized fractal tree generation.
  9. Spheres now render without borders to improve the look of scenes.
  10. Changed the way object tags work, instead of saving TAG$ to every triangle it saves it in the objects themselves. Also triangles no longer carry a second color (the sphere border color). Triangles only carry the most necessary data now.
  11. FPS is more smooth/stabilized.
  12. Added the ability to change the view distance to make programs run faster for o3DS users.
  13. Added function APPLYSURFACEEQUATION to automatically set a SURFACE object to mimic a mathematical equation. This makes the code for the GRAPH_3D demo much simpler and gives users much more power to simulate terrain.
  14. Added lots of new functions!

Version 1.3

  1. Added a fully functional 3D chess game against a real AI that looks a few moves ahead to determine the best way to move.
  2. Added an first person shooter game demo.
  3. Added support for 3D lines using ADDLINE(X1,Y1,Z1,X2,Y2,Z2,COLOR).
  4. Added a surface object, which is a grid plane with multiple sections (used in the 3D grapher).
  5. Fixed a few bugs when deleting an object.
  6. Added some new functions.
  7. BUFFERing only buffers the top screen, use BUFFERBOTTOM to buffer the lower screen.
  8. Other small tweaks and optimizations.

Version 1.2

  1. Framerate has been doubled and possibly tripled, especially for DLC users. The engine runs incredibly fast for users that have purchased the SmileBASIC DLC!
  2. SIM.3D no longer needs any other program slots other than 3. So this update makes it a lot more compact and simple.
  3. Hue, saturation, and value are now optional by using HSV(H,S,V) just like RGB(R,G,B). Objects only need a single color value to be initialized. So #RED, #GREEN, #BLUE, etc... can work too.
  4. Field of view (FOV), world scale constant (WSC), and the cutoff ratio (CUTOFF_RATIO) are modifiable. Cutoff ratio is the ratio between the camera and the object of focus in which polygons will no longer be drawn. Default is 0.5.
  5. Lots of new functions that give more power to the user, such as finding the closest/furthest objects to a point, and making an object rotate to face a given point in the world.
  6. Behind the scenes optimizations for maximum performance.

Version 1.1

  1. DLC is fully implemented! The engine runs much smoother when the Advanced Sound DLC is purchased, the application now only needs to run a few ARYOP operations each frame.
  2. Performance without DLC has also been improved, but DLC gives much higher performance.
  3. Circles have been removed, and re-implemented as triangle objects. Now that there is complete consistency with objects, huge performance advancements have been made.
  4. The flickering graphics bug has been targeted and removed. Graphics feel cleaner with modified algorithms.
  5. Example programs have been modified a little bit. Please feel free to view the code for those, and use them to implement your own games. I do not require any credit. Everything is free for everybody.
  6. Triangles are now sorted by the furthest away Z point.
  7. CIRCLE functions are now called SPHERE functions.
  8. All future updates from this point forward will minimize the modifications required for a game to run on the updated engine. Any modifications required will be listed down here for you.

Version 1.0

  1. Application is stable.
Notes This application was designed specifically to teach the idea of 3D game design. While this engine was built with simplicity in mind, it was also built to maximize efficiency and minimize the computation required to display good looking graphics. With that said this is an excellent engine to make 3D games, I don't ask for any credit, and anyone can use this program for their own purposes. Use the comment section below for help, or if you have any questions, I'll be glad to help! To see the power of SIM.3D, I added some regular demos that will give a better idea on how to use SIM.3D. The files include:
  1. 3D.ENGINE - The engine in all it's glory.
  2. BOX_O_GEMS - A demo to show all the different kinds of objects, and how fast they render.
  3. CHESS.3D - A rather complex program to show what can be made with SIM.3D.
  4. FPS_DEMO - A first-person-shooter-styled simulation, on a Perlin-noise-generated map.
  5. GRAPH_3D - A powerful yet simple 3D equation grapher.
  6. SIERPINSKI - Using simple code to generate a Sierpinski pyramid.
  7. SIMPLE_CUBES - A short code demo to show how SIM.3D is used.
  8. SPIRAL_SPHERE - Generate colorful sphere-spirals of spheres.
  9. TREE_OF_WISDOM - Showcasing three dimensional fractal tree generation using simple recursion.
To use this engine, simply add this to the first line of your code PRGEDIT 3 EXEC "PRG3:3D.ENGINE" ENDDoing so will load the 3D engine into program slot 3, then insert the code from program slot 0 into program slot 3, then execute itself. The most basic application to rotate a cube in the center of the screen is as follows: PRGEDIT 3 EXEC "PRG3:3D.ENGINE" END 'S1M.3D VAR C=ADDCUBE(0,0,0,1,1,1,#GRAY) 'C CONTAINS A REFERENCE TO THE CUBE @LOOP VSYNC 'STABALIZE THE FRAMERATE BUFFER 'SWITCH GPAGES TO PREVENT FLICKERING GCLS 'CLEAR THE SCREEN ROTOBJ C,0,1,0 'ROTATE THE CUBE AROUND THE Y AXIS RENDER 'RENDER THE WORLD GOTO @LOOP 'REPEAT There are a few things to be aware of before diving into the 3D engine
  1. One in-world unit is the equivalent of 50 pixels. Adding a scale definition like this makes the game feel more realistic.
  2. When working with SIM.3D, you must work in the default program slot 0, you will need to save every time you run the code. Any errors can be traced to your code in program slot 3 where the actual engine is.
  3. Or you could work directly in the 3D engine and avoid the use of the loader. There's a spot in the beginning of the code dedicated for user programs to go.
  4. Every object is composed of triangles. If a triangle is defined clockwise then it will be visible from the outside of the object. There are preset objects to make this easier to work with.
  5. So triangles can only be seen from one side (for higher performance), using STRETCHOBJ with negative values to stretch an object inside-out will let you see the object's back faces instead of front
  6. Every object is given an index. This index will never change until the object is deleted, in which case the ID will be given to the next future object to be defined.
Engine variables:VAR CAMX,CAMY,CAMZ 'THE FOCUS POSITION OF THE CAMERA (DEFAULT: 0,0,0) VAR CAMRX,CAMRY,CAMRZ 'ROTATION OF THE CAMERA (IN DEGREES) AROUND THE CAMERA FOCUS (DEFAULT: 0,20,0) VAR CAMDIST 'DISTANCE AWAY FROM CAMERA'S FOCUS POINT (DEFAULT: 10) VAR FOV 'FIELD OF VIEW (DEFAULT: 5) VAR WSC 'WORLD SCALING CONSTANT IN PIXELS (DEFAULT: 50) VAR CUTOFF_RATIO 'THE RATIO BETWEEN CAMERA AND FOCUS IN WHICH THINGS STOP RENDERING (DEFAULT: 0.7) VAR BOUNDCAMANGLES 'TRUE/FALSE, TELL IF THE CAMERA SHOULD BE BOUNDED BETWEEN -180 AND 180 (DEFAULT: 1) VAR RENDERDIST 'HOW FAR THE PLACER CAN SEE, 0=INFINITE (DEFAULT: 0) VAR ACCELERATED_RENDERING 'TRUE/FALSE TO USE ADVANCED SOUND DLC (DEFAULT: 1 IF POSSIBLE) VAR FPS 'FRAMES PER SECOND Here are the preset object definitions:ADDCUBE(X,Y,Z,LENGTH,WIDTH,HEIGHT,COLOR) 'CREATES A RECTANGULAR PRISM, RETURNS ITS INDEX ADDSPHERE(X,Y,Z,RADIUS,COLOR) 'CREATES A SPHERE, RETURNS ITS INDEX IN THE WORLD ADDLINE(X1,Y1,Z1,X2,Y2,Z2,COLOR) 'CREATES A LINE, RETURNS ITS INDEX ADDPYRAMID(X,Y,Z,WIDTH,HEIGHT,COLOR) 'CREATES A PYRAMID, WHERE THE BASE OF THE BOTTOM IS X,Y,Z 'RETURNS THE OBJECT'S INDEX ADDDIAMOND(X,Y,Z,WIDTH,HEIGHT,COLOR) 'RETURNS THE OBJECT'S INDEX ADDCRYSTAL(X,Y,Z,WIDTH,HEIGHT,COLOR) 'RETURNS THE OBJECT'S INDEX ADDSKYBOX(X,Y,Z,LENGTH,WIDTH,HEIGHT,COLOR) '(AN INSIDE-OUT CUBE) 'RETURNS THE OBJECT'S INDEX ADDSURFACE(X,Y,Z,GRIDX,GRIDY,LENGTH,WIDTH,COLOR) 'CREATE A FLAT GRID PLANE, RETURNS ITS INDEX ADDTEXT X,Y,Z,TEXT$,COLOR 'MAKE A TEXT OBJECT IN THE WORLD 'RETURNS THE OBJECT'S INDEX You may also consider defining your own objectADDOBJ(TYPE$,X[],Y[],Z[],COLOR) 'X[],Y[],Z[] DEFINE EACH TRIANGLE. THESE ARRAYS MUST BE IN SETS OF 3, SO LENGTH=3,6,9,12,15,18,... Every object contains these variables:OBJX 'CENTER OF MASS X POSITION OBJY 'CENTER OF MASS Y POSITION OBJZ 'CENTER OF MASS Z POSITION OBJTAG$ 'A STRING ONJTYPE$ 'A STRING TELLING WHAT TYPE OF OBJECT IT IS OBJINDEX 'THE INDEX POINTING TO WHICH TRIANGLES BELONG TO THIS OBJECT OBJLENGTH 'THE LENGTH OF HOW MANY TRIANGLES BELONG TO THIS OBJECT OBJRX 'GET (NO SET) THE OBJECT'S X ROTATION OBJRY 'GET (NO SET) THE OBJECT'S Y ROTATION OBJRZ 'GET (NO SET) THE OBJECT'S Z ROTATION OBJMASK 'WHEN YOU DEFINE AN OBJECT YOU ARE GIVEN A MASK INDEX WHICH WILL NEVER 'CHANGE, SO YOU CAN ONLY ACCESS THE VARIABLES ABOVE BY GOING THROUGH THE OBJECT MASK 'FIRST: OBX[OBJMASK[MY_OBJECT_INDEX]]=FOO 'BY USING THIS MASK, WE CAN GUARANTEE THAT AN OBJECT INDEX WILL NEVER CHANGE 'EVEN IF OBJECTS BEFORE IT ARE DELETED. Here is a list of object functionsSTRETCHOBJ INDEX,SCALEX,SCALEY,SCALEZ 'SQUISHES OR STRETCHES AN OBJECT'S POINTS BY A GIVEN SCALE MOVEOBJ INDEX,DX,DY,DZ 'INCREMENT AN OBJECT'S POSITION MOVEOBJTO INDEX,X,Y,Z 'TELEPORT AN OBJECT SOMEWHERE ROTOBJ INDEX,AX,AY,AZ 'INCREMENT THE ROTATION OF AN OBJECT AROUND ITS CENTER OF MASS ROTOBJTO INDEX,AX,AY,AZ 'SET THE ROTATION OF AN OBJECT AROUND ITS CENTER OF MASS 'THIS WILL RESET THE OBJECT'S ROTATION TO ITS DEFAULT, THEN ROTATE IT AX,AY,AZ ROTOBJAROUND INDEX,X,Y,Z,AX,AY,AZ 'ROTATE AN OBJECT AROUND (X,Y,Z) ROTOBJAROUNDOBJ INDEX,INDEX2,AX,AY,AZ 'ROTATE AN OBJECT AROUND ANOTHER OBJECT ROTOBJTOPOINT INDEX,X,Y,Z 'ROTATE AN OBJECT SO THAT IT FACES THE POINT X,Y,Z DELOBJ INDEX : INDEX=-1 'DELETE AN OBJECT FROM THE WORLD CHANGEOBJCOLOR INDEX,COLOR 'SET AN OBJECT'S COLOR CHANGEOBJFACECOLOR INDEX,FACE,COLOR 'SET THE COLOR OF A SINGLE TRIANGLE ON AN OBJECT SETTAG INDEX,TAG$ 'GIVE AN OBJECT A STRING, DEFAULT="" 'THIS CAN BE STRING, IT DOESN'T AFFECT THE 3D ENGINE GETTAG$(INDEX) 'GET THE TAG$ VALUE OF AN OBJECT FINDIBJBYTAG(TAG$) 'QUICKLY FIND AN OBJECT WITH A SPECIFIC TAG$ VALUE 'RETURNS -1 IF NO OBJECT EXISTS WITH THIS TAG GETOBJTYPE$(INDEX) 'RETURNS THE STRING DEFINING WHAT TYPE OF OBJECT IT IS 'POSSIBLE RESULTS ARE: "CUBE","SPHERE","DIAMOND","CRYSTAL","PYRAMID","SKYBOX","LINE","SURFACE","TEXT" GETOBJSBYDIST(X,Y,Z) 'RETURNS A SORTED ARRAY OF OBJECT INDEXES SUCH THAT THE FIRST ITEM IS CLOSEST 'TO (X,Y,Z) AND THE LAST ITEM IS FURTHEST AWAY FROM (X,Y,Z) 'AND THE LAST ITEM IS FURTHEST AWAY FROM (X,Y,Z) APPLYSURFACEEQUATION INDEX,EQU$,MINY,MAXY,SCX,SCY,SCZ 'APPLY A MATH EXPRESSION TO A SURFACE OBJECT 'EQU$ IS AN EQUATION WITH X,Y, AND Z IN IT 'EQU$="SIN(X)+COS(Z)" MAKES A WAVY SURFACE 'MINY AND MAXY DEFINE THE OBJECT'S Y BOUNDS 'SCX,SCY,SCZ ARE THE ZOOM FACTORS, 0.1=>10X ZOOM GETUNMASKEDINDEX(MASKEDINDEX) 'SAME AS SAYING OBJMASK[MASKEDINDEX] UPDATEOBJCENTER INDEX 'UPDATES THE CENTER OF MASS OF AN OBJECT (DONE AUTOMATICALLY) And a few other functions, slightly unrelated, but implemented nonetheless:RENDER 'DRAWS THE CURRENT WORLD STATE, REQUIRED TO RUN ONCE EVERY FRAME BUFFER 'PREVENTS FLICKERING BY SWAPPING GPAGES EACH FRAME, DRAWING TO THE ONE NOT 'BEING SHOWN. THIS SHOULD BE RAN ONCE EVERY FRAME, WITH A GCLS DIRECTLY AFTER IT 'THIS ONLY AFFECTS THE TOP SCREEN BUFFERBOTTOM 'PREVENT FLICKERING ON THE LOWER SCREEN, PUT GCLS DIRECTLY AFTER IT GETCAMRAY OUT X,Y,Z 'RETURNS THE NORMALIZED DIRECTION THE CAMERA IS FACING GETCAMRAY2D OUT X,Y,Z 'RETURNS THE NORMALIZED DIRECTION THE CAMERA IS FACING EXCLUDING Y NORMALIZE X,Y,Z OUT X,Y,Z 'SET THE DISTANCE OF AN X,Y,Z DISPLACEMENT EQUAL TO 1 'WHILE MAINTAINING THE ANGLE CLEARWORLD 'DELETES EVERYTHING IN THE WORLD 'TRIANGLE OPERATION FUNCTIONS ADDTRI INDEX,TAG$,X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,COLOR SETTRI INDEX,X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3 'SET A TRIANGLES POSITION DELTRI TRIANGLEINDEX 'DELETE A TRIANGLE '3D POINT ROTATION FUNCTIONS ROT X,Y,Z,ORIGINX,ORIGINY,ORIGINZ,ANGLEX,ANGLEY,ANGLEZ OUT X,Y,Z ROTX X,Y,Z,ANGLE OUT X,Y,Z 'ROTATE A POINT JUST AROUND X AXIS ROTY X,Y,Z,ANGLE OUT X,Y,Z 'ROTATE A POINT JUST AROUND Y AXIS ROTZ X,Y,Z,ANGLE OUT X,Y,Z 'ROTATE A POINT JUST AROUND Z AXIS INSERT ARRAY[],INDEX,VALUE 'QUICKLY INSERT AN ELEMENT INTO AN ARRAY REMOVE ARRAY[],INDEX 'QUICKLY REMOVE AN ELEMENT FROM AN ARRAY TRIM$(S$) 'REMOVE SPACES AND NEW LINES FROM THE FRONT AND END OF A STRING 'HSV OPERATIONS HSV2RGB HUE,SATURATION,VALUE OUT RED,GREEN,BLUE RGB2HSV RED,GREEN,BLUE OUT HUE,SATURATION,VALUE HSV(HUE,SATURATION,VALUE) 'RETURNS THE COLOR AS A SINGLE NUMBER, JUST LIKE RGB(R,G,B) DOES FCIRCLE X,Y,RADIUS,FILLCOLOR,BORDERCOLOR 'DRAW A FILLED CIRCLE TEXT X,Y,TEXT$,COLOR 'DRAW CENTERED TEXT ON THE SCREEN PERSPECTIVE X,Y,Z OUT X,Y,Z 'CONVERT IN-WORLD COORDINATES TO SCREEN COORDINATES PERSPECTIVEZ(X,Y,Z) 'QUICKLY JUST CALCULATE THE Z VALUE AFTER PERSPECTIVE ARYOP_PERSPECTIVE X[],Y[],Z[] OUT X[],Y[],Z[] 'CALCULATE FASTER PERSPECTIVE
Categories
Keywords
  • 3D
  • game
  • engine
168 Comment(s) ToadIsTheBest ToadIsTheBest Avatar Embargo I didn't change my avatar for 90 days Website Video Games I like to play video games! Hobbies Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength How to outsmart the chess AI (as of 1.4) in 5 easy steps! ToadIsTheBest ToadIsTheBest Avatar Embargo I didn't change my avatar for 90 days Website Video Games I like to play video games! Hobbies Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Bug:if you move a sprite, the geometry disappears. I found this because I wanted to make a game with 3D geometry, but 2D characters and stuff JUST BECAUSE I WANT 3D GEOMETRY IN A GAME DOESN'T MEAN I WANT 3D CHARACTERS IN SAID GAME Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies That'd be a cool feature to add, ill look into it thanks Late response, my bad ToadIsTheBest ToadIsTheBest Avatar Embargo I didn't change my avatar for 90 days Website Video Games I like to play video games! Hobbies Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength It’s okay. Warrior Warrior Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Night Person I like the quiet night and sleep late. Express Yourself Drawing I like to draw! Hobbies Im not sure if this has to came to anybody's attention but, do notice how Spooky Maze uses Textures on its walls. It uses raycasting to get a slice of a sprite and draws it onto the screen. Its very efficient and could be be used in a situation like a 3D engine. you would need many more rays, but if you were to lower the resolution to half for New3DS's and a quarter for Old3DS's, the performance should be usable, and allow for images to be pasted onto 3D geometry. Locking the FPS to 45 or 30 using this method would yield good results as well. Its all a theory though, but ill attempt a test of this idea later, probably nearing the end of the month or mid-June. snail_ snail_ Helper Received for being very helpful around SmileBASIC Source Achievements First Day Joined on the very first day of SmileBASIC Source Website Night Person I like the quiet night and sleep late. Express Yourself You can only use that type of raycasting on regular grids or scenes where everything is parallel lines, as far as I'm aware. You could try something like the classic DOOM engine, but I think you'll have to do most of it in software and it'll end up too slow. MZ952 MZ952 Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Drawing I like to draw! Hobbies Reading I like to read books! Hobbies Well, sprites can be rotated too. Warrior is right I believe. Account for the camera & object rotations, and you should be able to transform the sprite image into the required 3d shape. dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself the VSYNC is slowing it down.(I know it will flicker without it), but how about you use this custom command: DEF WAITTIME A M = MILLISEC WHILE MILLISEC-M>A:WEND END this waits for smaller units of time(which could help with FPS barely) since the refresh rate of almost every modern device is 60FPS, we can assume that VSYNC waits ~16.667 milliseconds(1000/60) As we all know, the human eye(on average)sees at ~24 FPS Using this command, we can make a smaller wait time for refreshing, therefore higher FPS. I would recommend a wait time of...33.33ms. Seems stupid, but that should include rendering AND refresh time. Lumage Lumage Head Admin Did you actually test this before posting? MasterR3C0RD MasterR3C0RD Helper Received for being very helpful around SmileBASIC Source Achievements Second Year My account is over 2 years old Website osu! Is Awesome! I love osu! Express Yourself 33.33ms frame time is 30FPS, you know dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself (its a theory) niconii niconii Video Games I like to play video games! Hobbies Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Drawing I like to draw! Hobbies
As we all know, the human eye(on average)sees at ~24 FPS
This is a myth. The truth is more complicated, but the fastest we can perceive motion generally lies somewhere above 60 FPS. Luckily, with SmileBASIC, we don't have to rely on hearsay -- it's easy to test this for ourselves. (Hold R to switch to 60 FPS.) ACLS SPSET 0,2048 SPSCALE 0,2,2 WHILE TRUE T=MAINCNT X=80*SIN(T/8)+200 Y=80*COS(T/8)+136 SPOFS 0,X,Y CLS ?T IF BUTTON() AND #R THEN ?"60 FPS" VSYNC 1 ELSE ?"30 FPS" VSYNC 2 ENDIF WEND
dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself I'm trying to say Simeon needs to use this custom command the for *exact* amount of time to stop flickering at a minimum wait time Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Well, but VSYNC does that And simple is better If there's any flickering then BUFFER isn't working properly dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself OK, I'm just making a fool of myself. Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Nah don't worry about it man, you gave me lots of great suggestions that I'll be working on, I've just been a little bit too busy with school to put more effort into your requests. In most programming languages, simple is not better especially with 3D engine building. When there are strict computing limitations, in my opinion it seems unnecessary to put extra effort into mipmaps and texture mapping. The issue I see with decreased triangle count as objects get far away, is the issue is of actually detecting when they're far away since the slightest additions of computations dramatically change the performance. In SmileBASIC, its a little bit strange because the more code, the slower it gets since there seems to be a small portion of overhead for each line of code. It's hard to detect, but because of this limitation we're forced to use the minimum number of commands. Granted, I'm sure if 12Me21 was to look over SIM.3D, he'd be able to optimize this much more than any of us could. It seems that the biggest optimization to be made is converting floating point variables to integer variables (using %). I'll look more into all of this when I get the time. dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself I'm just saying there might be a refresh rate that will stop flickering and spend less time WAITING. I'm just visualizing frame time in a spectrum like this: ("*" means that framerate will cause a visible flicker) ("0" means that flicker is invisible) *0 I think there might be a *perfect* wait time that will wait for the least amount of time to stop flickering and not be time-consuming. I want a framerate between the "*" and "0"
dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself I just played some Fortnite(which uses Unreal Engine 4) and I noticed something: when you are far away from an object, the resolution is really low. Also, the triangle count in an object decreases. Maybe Simeon can (somehow) implement this in SIM.3D... to conserve RAM and increase FPS dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself There should be a way to make a new(object); After an object is defined, you should have the ability to add another of the same object Killias12 Killias12 Beginner Programmer I'm just starting out! I'm still trying to grasp the basics. Programming Strength Pokemon Is Awesome! I love Pokemon! Express Yourself Video Games I like to play video games! Hobbies "Also non-DLC users run at a fairly higher framerate due to less function calls." Shouldn't that say DLC users? because I got the DLC and noticed a higher framerate niconii niconii Video Games I like to play video games! Hobbies Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Drawing I like to draw! Hobbies I think they mean higher compared to the previous version, not compared to DLC users. Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Yeah, haha I probably should have worded that better Warrior Warrior Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Night Person I like the quiet night and sleep late. Express Yourself Drawing I like to draw! Hobbies I wonder if you could UV map textures to tris in a performant manner, or at least raytrace an image of a textured object. dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself you could, but it would be VERY slow. I have no clue how, but it is possible. Warrior Warrior Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Night Person I like the quiet night and sleep late. Express Yourself Drawing I like to draw! Hobbies Well right now the closest thing we can get to textures is coloring polygons on a shape, and good luck trying to render anything with any more detail than a pencil. spaceturtles spaceturtles Video Games I like to play video games! Hobbies Avatar Block I didn't change my avatar for 30 days. Website Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Doing that is possible but it would end up being very slow. dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself I am working on it. It will only use 16x16 textures, though. ToadIsTheBest ToadIsTheBest Avatar Embargo I didn't change my avatar for 90 days Website Video Games I like to play video games! Hobbies Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Minecraft uses 16x16 textures, too DUN DUN DUNNNNNNNNNNNNNNNNN dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself You could make a ToFloat function like this: COMMON DEF ToFloat(X) RETURN X+. END I also just posted a video on YouTube Imasheep Imasheep Minecraft Is Awesome! I love Minecraft! Express Yourself OSP Contest 1 Contest Participant I participated in the first SmileBASIC Source OSP Contest! Avatar Taboo I didn't change my avatar for 180 days Website what's a pasocom mini? spaceturtles spaceturtles Video Games I like to play video games! Hobbies Avatar Block I didn't change my avatar for 30 days. Website Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength It's basically a Raspberry pi modified to run sb. It's also a little expensive. I can't remember the url to get it though. Imasheep Imasheep Minecraft Is Awesome! I love Minecraft! Express Yourself OSP Contest 1 Contest Participant I participated in the first SmileBASIC Source OSP Contest! Avatar Taboo I didn't change my avatar for 180 days Website sounds cool! 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website I thought I should mention this, since it might be useful. ARYOP is a *LOT* slower when working with integer arrays, since it uses a built in feature of the 3DS to perform operations on lists of floating point numbers. So if you give it an integer array, it has to convert it first. (It's still faster than a FOR loop though). Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Hmm I didn't know that Thanks for the advice! I'll look into it 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website Another interesting ARYOP trick: You can use ARYOP #AOPCLP, OUTPUT, ARRAY1,ARRAY2,ARRAY2 to get the minimum elements. dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself how do you know? Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies I used this instead of MIN and MAX, clip a number between A and infinity, then infinity and B to get a number between A and B. 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website why not just clip between A and B directly? Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Oh, I explained that wrong I meant by clamping A to infinity, then B to infinity, you get MAX(A,B) for every item within A and B, then MIN(A,B) by swapping it. I wonder if it would be possible to make an expression parser/evaluator that converts an equation [of arrays] into a series of ARYOPs. That might actually work Guzzler Guzzler First Week Joined in the very first week of SmileBASIC Source Website Drawing I like to draw! Hobbies Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength This is wonderful, but I believe you knowledge of chess is a little off. The enemy king moved straight into check, and I captured him with a pawn. snail_ snail_ Helper Received for being very helpful around SmileBASIC Source Achievements First Day Joined on the very first day of SmileBASIC Source Website Night Person I like the quiet night and sleep late. Express Yourself You can't really blame him for the AI being too dumb unless it made an illegal move. idk how good he claims the AI really is. Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Oh, hehe Hey, the king tries hard to survive and avoid getting taken down before deciding to commit suicide I'm pretty sure I know the cause, there's a section where I make another capable piece stand in the way to save the king, but I forgot to check if the king was that piece standing in the way to protect the king lmao oops. Guzzler Guzzler First Week Joined in the very first week of SmileBASIC Source Website Drawing I like to draw! Hobbies Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength I see. Anyway, it said I won when I captured him lol. niconii niconii Video Games I like to play video games! Hobbies Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Drawing I like to draw! Hobbies Just for the record, putting your own king in check actually is an illegal move. snail_ snail_ Helper Received for being very helpful around SmileBASIC Source Achievements First Day Joined on the very first day of SmileBASIC Source Website Night Person I like the quiet night and sleep late. Express Yourself Oh. I didn't know that was against the rules. Is there some high level strategy that would actually make that advantageous? niconii niconii Video Games I like to play video games! Hobbies Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Drawing I like to draw! Hobbies Nah, if you were allowed to put yourself in check, doing so would just make you lose immediately, since the opponent would then capture your king. I think the point of it is just to keep games interesting. It would be boring to win just from your opponent making a simple mistake like that. Making it an illegal move means they don't lose from doing it, they just have to take it back and make a different move. Another consequence of it being illegal is that stalemates become possible, where if your opponent has no legal moves they can make, the game is declared a draw. This requires more strategy on your part to win a game, because it's not enough to put your opponent in a position where they'd have to move their own king into check, because that's a stalemate and results in a draw. You must put your opponent in check yourself without leaving a way for them to escape to achieve a checkmate. amihart amihart The poll lacks options. I use SmileBASIC on both an original 3DS and a new 3DS. Plus you are missing the Pasocom Mini as an option there (I guess you can just pick "Other" but still). Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Oh, so let's see, New 3DS, Original 3DS, Switch, New 2DS, Original 2DS, Wii U, Pasocom Mini, Emulator, and Other? What am I missing If someone used a Pasocom Mini I'm gonna be impressed 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website well, there are the XL versions of the 3DS/new3DS. Is there even a way to transfer programs to the pasocom mini? Lumage Lumage Head Admin If you really want to cover all possible platforms, it might be good to distinguish "3DS Emulator" e.g. Citra and "SmileBASIC Emulator" e.g. otyaSMILEBASIC 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website Well in that case we might as well include my syntax highlighter as well amihart amihart I'm sure you could run PetitModem on the Pasocom Mini, even if you couldn't you could just load programs on it with USB Rubber Ducky. snail_ snail_ Helper Received for being very helpful around SmileBASIC Source Achievements First Day Joined on the very first day of SmileBASIC Source Website Night Person I like the quiet night and sleep late. Express Yourself They didn't make a non-XL version of the new2DS by the way. random_guy random_guy Video Games I like to play video games! Hobbies Reading I like to read books! Hobbies Halloween 2017 Contest Participant I participated in the SmileBASIC Source Halloween 2017 Contest! Programming Contest new 2ds is new 2ds xl. snail_ snail_ Helper Received for being very helpful around SmileBASIC Source Achievements First Day Joined on the very first day of SmileBASIC Source Website Night Person I like the quiet night and sleep late. Express Yourself New 2DS and New 2DS XL are listed on the poll seperately. Minaboo Minaboo Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength Forum Contributor Hidden Achievements First Year My account is over 1 year old Website Love the project Simeon! I love all your projects because I know you put so much work into them! More than I could ever do haha. I'm just working on a text adventure game! :3 Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Thanks Mina! dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself He's a math demigod. Stuff I can't comprehend! dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself Simeon, since I know you made the fractal canvas, so I know you'll get this: DEF DRAWTRI I 'Triangle drawing stuff IF I<LEN(TRIS) THEN DRAWTRI I+1' Make it call itself I used this on a tree - fractal program: GCOLOR RGB(105, 83, 47); DEF Draw X, Y, ROT, L GLINE X,Y,X+SIN(RAD(ROT)),Y+COS(RAD(ROT)) VAR HOLDER = L; IF L>0 THEN DRAW X+SIN(ROT)*L,Y+COS(ROT)*L, ROT - (5,L-5 L = HOLDER IF L<5 THEN GCOLOR RGB(50, 107, 47); DRAW X+SIN(ROT)*L,Y+COS(ROT)*l,ROT + 15,l-5); ENDIF END DRAW 200,400,180,50 'I had to convert from JS Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies That's pretty cool, you should try working in three dimensions! Like, if you look at the code for SIERPINSKI in SIM.3D, you'll see a similar implementation, which can make way cooler 3D shapes too, than just a Sierpinski pyramid dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself The bad thing is I'm HORRIBLE with 3D. I don't know how to make a perspective projection program. It took me ~2 years to learn how to use trig for triangles. I'm not a trig guy(yet) dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself (I'm talking about recursion) dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself How about you use recursion conditionally? DEF DRAWTRI I 'STUFF IF I<LEN(TRIS)-2 THEN DRAWTRI I+1 That would cause recursion. Don't know if it affects speed, though Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies I could but that's way slower and risks getting a stack overflow error (unless SmileBASIC supports tail-recursion) Also I removed the DRAWTRI function and just cut and pasted the code to the one place that used it, to reduce function calls Private message me if you have any more proposals, because they are helping a lot (they just clutter the comment section a little) Thanks for all the feedback! dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself I wonder if GCLIP could make it faster... dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself (I think)this is how it goes(by speed):
  1. WHILE
  2. REPEAT
  3. FOR
  4. GOTO
dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself I might have confused WHILE && REPEAT. MasterR3C0RD MasterR3C0RD Helper Received for being very helpful around SmileBASIC Source Achievements Second Year My account is over 2 years old Website osu! Is Awesome! I love osu! Express Yourself Ummmm GOTO is 100% faster than WHILE tf are you talking about random_guy random_guy Video Games I like to play video games! Hobbies Reading I like to read books! Hobbies Halloween 2017 Contest Participant I participated in the SmileBASIC Source Halloween 2017 Contest! Programming Contest faster but less efficient. spaceturtles spaceturtles Video Games I like to play video games! Hobbies Avatar Block I didn't change my avatar for 30 days. Website Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength What do you mean about efficiency? The amount of space taken up? ToadIsTheBest ToadIsTheBest Avatar Embargo I didn't change my avatar for 90 days Website Video Games I like to play video games! Hobbies Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength true rg dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself Ill test it tomorrow 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website It depends on what you're doing for an infinite loop, I'd guess it goes GOTO REPEAT WHILE FOR but if you want to repeat code multiple times the fastest way is to just put the code more than once spaceturtles spaceturtles Video Games I like to play video games! Hobbies Avatar Block I didn't change my avatar for 30 days. Website Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength That could be viable but a little difficult maybe. One way I guess this could be done is using the prgedit commands to jump to different lines and to insert any commands or something. Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies So converting a FOR loop into a GOTO or REPEAT loop would be ideal? snail_ snail_ Helper Received for being very helpful around SmileBASIC Source Achievements First Day Joined on the very first day of SmileBASIC Source Website Night Person I like the quiet night and sleep late. Express Yourself If you want to rewrite a bunch of boilerplate logic for a millisecond more of processing time, yeah. 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website No, FOR is the fastest way to make a for loop (of course) The order I listed was just for an infinite loop like FOR I=0 TO 0 STEP 0 which would be slower than something like WHILE 1
dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself @Simeon: I am going to modify the code for: INC FPS,SOME All I'm doing is changing FOR loops to WHILE loops. Never mind. Simeon's code + me = headache *that's a compliment* dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself Not to mention changing from a FOR loop to a WHILE loop will increase FPS, too dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself I noticed something: I have thought of this: in many 3D engines, there is only one instruction to draw being called at a time. Some examples of this: Raycaster: it only draws one sprite at a time. One "guy" to do all the work. Mode7: one drawing instruction is called in a loop. Only one "guy" to render the whole screen. To fix this, make it render 2 times in a loop or more.One renders the left, the other doing the right for better performance: FOR I = 0 TO LEN(TRIS) STEP 2 DRAWTRI I IF LEN(TRIS) - 1 > 1 THEN DRAWTRI I + 1 NEXT instead of FOR I = 0 TO LEN(TRIS) DRAWTRI I NEXT here is how I know it will improve: First, run this program: ACLS M = MILLISEC FOR I = 0 TO 10000 GLINE RND(400),RND(240),RND(400,RND(240) NEXT GCLS PRINT MILLISEC - M Then, run this: ACLS FOR I = 0 TO 10000 STEP 2 GLINE RND(400),RND(240),RND(400),RND(240) GLINE RND(400),RND(240),RND(400),RND(240) NEXT GCLS PRINT MILLISEC - M Notice the change in FPS... spaceturtles spaceturtles Video Games I like to play video games! Hobbies Avatar Block I didn't change my avatar for 30 days. Website Intermediate Programmer I can make programs, but I still have trouble here and there. Programming Strength So that "doubles" the fps? dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself No, just increases. The increase is small but the more polygons drawn increases the saved FPS. Run it and post the results, please.(I'm sneaking on my school com) Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies Hmm Simeon Simeon Scholar Received for knowing a great deal about programming topics Achievements Amazing Page Hidden Achievements Drawing I like to draw! Hobbies That's a really strange improvement I was not aware of, I'll see what I can do... Lumage Lumage Head Admin Be skeptical. dfrost2 dfrost2 Expert Programmer Programming no longer gives me any trouble. Come to me for help, if you like! Programming Strength Minecraft Is Awesome! I love Minecraft! Express Yourself The reason why it is to loop 10001 times is so you can see there is a massive change 12Me21 12Me21 Admin Syntax Highlighter Received for creating the code syntax highlighter on SBS Night Person I like the quiet night and sleep late. Express Yourself Second Year My account is over 2 years old Website Reversing the loop probably has a decent effect on speed. FOR I=LEN(whatever)-1 TO 0 STEP -1only has to check the length once rather than every time. snail_ snail_ Helper Received for being very helpful around SmileBASIC Source Achievements First Day Joined on the very first day of SmileBASIC Source Website Night Person I like the quiet night and sleep late. Express Yourself Don't bother with this, you're only "saving time" by eliminating half the FOR interations, which are only worth nanoseconds at best, while the quality and maintainability of your code plummets significantly. You should ONLY consider code repetition a valid optimization in extreme cases, such as embedded applications and compilers (compilers might even do this for you with function inlining and related, they're smarter than you.) There are far greater optimization targets to look at.
1 2