2 registered members (AndrewAMD, alibaba),
1,184
guests, and 3
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Snippet: Using c# to make an engine EXE
[Re: 3Dski]
#111528
02/21/07 02:43
02/21/07 02:43
|
Joined: Mar 2001
Posts: 3,298 Beverly, Massachusetts
Rhuarc
OP
Expert
|
OP
Expert
Joined: Mar 2001
Posts: 3,298
Beverly, Massachusetts
|
Quote:
On this topic in general, though I'm an C veterin, I like simple and C# seems a lot more straight forward. I tried the simple case scenario of loading a level and it works just fine.
However, the true usage seems to require C# defs of the C structs; i.e., ENGINE_VARS* is not acceptable in C# without some work. There are also a large number of preprocessor macros that would have to be modelled on the C# side. I'm trying to decide whether its worth the time. The main thing that gripes me about the CScript is its seeming strange rules concerning functions, what can be passed in, and what you can do with them once they're pased in. On one hand, you want to avoid globals when possible, yet CScript cries for them! Lite-C will remove a good number of these odd restrictions and include latitude for user defined types (structs). Still, C# as an attractive alternative.
Have any of you been successful in your deeper investigations of its usage?
I've had pretty decent success in reading the ENGINE_VARS struct by modelling the structure in C#. It was a bitch, not gonna lie. I did so by creating several classes from a base class consisting of an IntPtr variable only for all of the pointers to various structs (ENGINE_BMAP, ENGINE_VIEW, etc), and then in the subclasses, I added methods to retrieve a marshalled instance of the data that that IntPtr points to. This way I could marshal all of the data directly into classes that would handle it from there for user access.
It really was a pain...
Here's the code for my classes that works, my more recent code is presently [censored] up: Code:
using System; using System.Collections.Generic; using System.Text;
using System.Threading; using System.Runtime.InteropServices;
namespace GameStudio { [StructLayout(LayoutKind.Sequential)] public struct Event { public byte mPtr; } [StructLayout(LayoutKind.Sequential)] public struct Var { public int mValue; public void SetValue(float value) { mValue = (int)(value * (1 << 10)); } public void SetValue(int value) { mValue = (value << 10); } public float ValueFloat { get { return ((float)mValue) / (1 << 10); } } public int ValueInt { get { return (mValue >> 10); } } } [StructLayout(LayoutKind.Sequential)] public struct Vector { public Var mX, mY, mZ;
public Var X { get { return mX; } set { mX = value; } } public Var Y { get { return mY; } set { mY = value; } } public Var Z { get { return mZ; } set { mZ = value; } } } [StructLayout(LayoutKind.Sequential)] public struct ColorRGB { public Var mBlue, mGreen, mRed;
public Var Blue { get { return mBlue; } set { mBlue = value; } } public Var Green { get { return mGreen; } set { mGreen = value; } } public Var Red { get { return mRed; } set { mRed = value; } } } [StructLayout(LayoutKind.Sequential)] public struct Angle { public Var mPan, mTilt, mRoll;
public Var Pan { get { return mPan; } set { mPan = value; } } public Var Tilt { get { return mTilt; } set { mTilt = value; } } public Var Roll { get { return mRoll; } set { mRoll = value; } } } [StructLayout(LayoutKind.Sequential)] public struct CLink { public int mIndex; public IntPtr mNext; public String mName;
public int Index { get { return mIndex; } set { mIndex = value; } } public CLink Next { get { return (CLink)Marshal.PtrToStructure(mNext, typeof(CLink)); } /** set { Next = (IntPtr)value; }/**/ } public String Name { get { return mName; } set { mName = value; } } } [StructLayout(LayoutKind.Sequential)] public class Viewport { public CLink mLink; // clink public int mType; // internal use only public Var mLayer; // layer number (read only) public Var mScreenX, mScreenY; // screen position in pixels public int mFlags; // flags public Var mScreenWidth, mScreenHeight; // screen size in pixels public Vector mPosition; // position of the camera public Angle mAngle; // camera angles public Var mOffsetX, mOffsetY; // eye offsets public Var mArc; // camera FOV, used for zooming public Var mAspect; // width to height ratio public Var mAmbient; // brightness public Var mFog; // fog strength (only used when fog_end == 0) public Var mAlpha; // transparency public Vector mPortalVertex; // portal plane vertex public Vector mPortalNormal; // portal plane normal public Var mFogStart, mFogEnd; // fog start/end range in D3D mode public Var mUnused0; // Unused public EngineEntity mGenius; // calculates valid BSP tree leaf for the view public EngineView mPortal; // portal view public EngineBmap mBmap; // render target public Var mNearZ, mFarZ; // Near and Far clipping Z ranges } [StructLayout(LayoutKind.Sequential)] public struct Entity { public CLink mLink; // clink public String mType; // entity file name public Vector mPosition; // position of the entity public Angle mAngle; // euler angles public Vector mScale; // scale factors, 0..255 public int mFlags; // entity flags public Var mFrame; // frame number for sprites & models public Var mNextFrame; // public Var mSkin; // public Var mAmbient; // -100..+100 public Var mAlbedo; // 0..100, light reflectivity public Var mAlpha; // 0..100, transparency, default 50 public Var mLightRange; // dynamic light range in quants public ColorRGB mColor; // dynamic light color, 0..255 public int mEMask; // event enable flags, EVF... public int mEFlags; // hull and status flags public Vector mBoundMin; // bounding box for entity->entity collisions public Vector mBoundMax; // bounding box for entity->entity collisions public Var mTriggerRange; public Var mPush; public Var mFloorDist; // distance to the floor - A6.23 or above public int mSMask; // nosend_... flags - A6.20 or above public int mClientID; // client # that has created this entity or view pointer for a layer entity [MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)] public Var[] mSkills; public Var mPose; // current bones pose number public EngineMaterial mMaterial; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public int[] mInternal0; public int mSkyFlags; // sky flags public String mAttachName; public Event mEvent; // event function public Event mLocal; // client side function public Var mLayer; // layer for 2D entities and skies public int mInternal2; public String mString0; // strings public String mString1; // strings public EngineEntity mParent; // parent entity } [StructLayout(LayoutKind.Sequential)] public struct Bmap { public CLink mLink; // clink public int mWidth, mHeight; // size of the bitmap public int mBytesPerPixel; // original bytes per pixel (1..4) public IntPtr mPtr; // internal use public IntPtr mPixels; // ptr to palettized, 565, 4444, 888 or 8888 coded original image public int mFlags; // flags public IntPtr mD3DTex; // LPDIRECT3DTEXTURE9 } [StructLayout(LayoutKind.Sequential)] public struct Material { public CLink mLink; // clink public ColorRGB mAmbient; public ColorRGB mDiffuse; public ColorRGB mSpecular; public ColorRGB mEmissive; public ColorRGB mMap; public Var mAlpha; public Var mPower; // for specular reflection public Var mSunAlbedo; public Var mScale0; public Var mScale1; public Var mCycle; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public Var[] mSkills; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public float[] mMatrix; public int mFlags; public String mEffect; public int mUnused; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public EngineBmap[] mSkin; public Event mEvent; // event function } [StructLayout(LayoutKind.Sequential)] public struct VarString { public CLink mLink; // clink public String mString; // pointer to null terminated string public int mLength; // allocated length of string public int mFlags; // last bit 0 = don't save, 1 = save string at SAVE/LOAD }
[StructLayout(LayoutKind.Sequential)] public struct EngineVar { public IntPtr mVar; public Var Value { get { return (Var)Marshal.PtrToStructure(mVar, typeof(Var)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineVector { public IntPtr mVector; public Vector Value { get { return (Vector)Marshal.PtrToStructure(mVector, typeof(Vector)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineColor { public IntPtr mColor; public void GetObject(ref ColorRGB c) { c = (ColorRGB)Marshal.PtrToStructure(mColor, typeof(ColorRGB));} public ColorRGB Value { get { return (ColorRGB)Marshal.PtrToStructure(mColor, typeof(ColorRGB)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineAngle { public IntPtr mAngle; public Angle Value { get { return (Angle)Marshal.PtrToStructure(mAngle, typeof(Angle)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineEvent { public IntPtr mEvent; public Event Value { get { return (Event)Marshal.PtrToStructure(mEvent, typeof(Event)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineView { public IntPtr mView; public void GetObject(ref Viewport c) { c = (Viewport)Marshal.PtrToStructure(mView, typeof(Viewport)); } public Viewport GetValue() { return (Viewport)Marshal.PtrToStructure(mView, typeof(Viewport)); } } [StructLayout(LayoutKind.Sequential)] public struct EngineEntity { public IntPtr mEntity; public Entity Value { get { return (Entity)Marshal.PtrToStructure(mEntity, typeof(Entity)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineBmap { public IntPtr mBmap; public Bmap Value { get { return (Bmap)Marshal.PtrToStructure(mBmap, typeof(Bmap)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineMaterial { public IntPtr mMaterial; public Entity Value { get { return (Entity)Marshal.PtrToStructure(mMaterial, typeof(Entity)); } } } [StructLayout(LayoutKind.Sequential)] public struct EngineString { public IntPtr mString; public VarString Value { get { return (VarString)Marshal.PtrToStructure(mString, typeof(VarString)); } } }
Last edited by Rhuarc; 02/21/07 03:41.
|
|
|
|