|
This code is for CsGL, a C# wrapper for OpenGL, but I'm sure that the concept applies to other graphical 3D stuff.
In a 2D representation of a 3D scene (i.e. most pictures, TV, cinema, etc), a point on the 2D surface represents a line in 3D space. In openGL, this 3D space is bounded by clipping planes. The following code takes the mouse's X-Y coordinates and calculates a line (or ray) that passes through those clipping planes. Note that the OpenGL mouse Y coordinate is 'inverted' to Windows mouse Y Coordinate.
Note that the following code won't quite work 'out of the box' (I've removed some stuff to condense things), but you should be able to construct working code with little effort.
- You need the ModelView, ModelPort & Projection state, saved like the following code:
public class OGLMatrixState
{
public void Save()
{
GL.glGetDoublev(GL.GL_PROJECTION_MATRIX, savedProjectionMatrix);
GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX, savedModelviewMatrix);
GL.glGetIntegerv(GL.GL_VIEWPORT, savedViewportArray);
}
private double[] savedProjectionMatrix = new double[16];
private double[] savedModelviewMatrix = new double[16];
private int[] savedViewportArray = new int[4];
}
- You need the built-in conversion routines that OpenGL provides:
public static SEG.Line ViewXYToRay(double vX, double mouseY, OGLMatrixState matrixState)
{
double vY = matrixState.Viewport[3] - mouseY;
double pX,pY,pZ;
SEG.Point nearPt = new SEG.Point();
SEG.Point farPt = new SEG.Point();
GL.gluUnProject(vX, vY, 0.0, matrixState.Modelview, matrixState.Projection, matrixState.Viewport, out pX, out pY, out pZ);
nearPt.X = pX;
nearPt.Y = pY;
nearPt.Z = pZ;
GL.gluUnProject(vX, vY, 1.0, matrixState.Modelview, matrixState.Projection, matrixState.Viewport, out pX, out pY, out pZ);
farPt.X = pX;
farPt.Y = pY;
farPt.Z = pZ;
SEG.Line rayFromNearToFar = new SEG.Line(nearPt, farPt);
return rayFromNearToFar;
}
Hope this helps
Regards
Brewman
|
|
|
|
|
would anybody tell me how to convert text to voice in .net
|
|
|
|
|
Try namespace Microsoft.Speech5 and class SpVoiceClass.Speak(string,SpeakFlags). Microsoft.Speech5 is located in external library "speech5.dll"
Wizard_01
|
|
|
|
|
heba_zien wrote:
would anybody tell me how to convert text to voice in .net
You will need to get the Microsoft Speech SDK[^].
- Nick Parker My Blog
|
|
|
|
|
When I use Microsoft's sproxy.exe (version 7.00.9466) to create a web reference in a Visual C++ application, I get an error message: SDL1000 : Not enough storage is available to complete this operation. If I remove the fault element from the operation element, the header is generated. See wsdl below. Any ideas?
Thanks,
Rick
<?xml version = '1.0'?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns2="http://xmlns.catch.com/ws/types"
xmlns:tns="http://xmlns.catch.com/ws"
name="RemoteAccess"
targetNamespace="http://xmlns.catch.com/ws">
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://xmlns.catch.com/ws/types"
targetNamespace="http://xmlns.catch.com/ws/types">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="WebServiceException">
<sequence>
<element name="errorCode" type="int"/>
<element name="message" type="string"/></sequence></complexType>
</schema></types>
<message name="RemoteAccessProvider_endSession"/>
<message name="RemoteAccessProvider_endSessionResponse"/>
<portType name="RemoteAccessProvider">
<operation name="endSession" parameterOrder="">
<input message="tns:RemoteAccessProvider_endSession"/>
<output message="tns:RemoteAccessProvider_endSessionResponse"/>
<fault name="WebServiceException" message="tns:WebServiceException"/></operation>
</portType>
<binding name="RemoteAccessProviderBinding" type="tns:RemoteAccessProvider">
<operation name="endSession">
<input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://xmlns.catch.com/ws"/></input>
<output>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://xmlns.catch.com/ws"/></output>
<!-- Offending Code, remove and sproxy.exe works.-->
<fault name="WebServiceException">
<soap:fault encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded" namespace="http://xmlns.catch.com/ws/"/></fault>
<!-- Offending Code End -->
<soap:operation soapAction=""/></operation>
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/></binding>
<service name="RemoteAccess">
<port name="RemoteAccessProviderPort" binding="tns:RemoteAccessProviderBinding">
<soap:address xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" location="http://localhost/ws"/></port></service></definitions>
|
|
|
|
|
I have a fairly large XML document that I do not want to read into memory all at once with the XmlDocument object for parsing. Is there any way to keep the file on disk and simply conditionally read the nodes, depending on their attributes...
My XML file contains a small number of large CDATA sections, and thus, if there is a way for me to read the XML file STRUCTURE from disk without having to read the whole thing into memory, I can pick those CDATA sections out one by one, as needed....
But my guess is that it cant be done with the built in XML functionality?
--
Rob Hutchinson.
|
|
|
|
|
|
I'm trying to create a program that reads a "random" number of jpeg pictures into it and displays them like a slideshow..
but i'm not shure how to do it, since it maybe will be loaded from a cd I was thinking of buffer reading the jpeg files into memory, how do i do this?
and because there can be a different number of jpegs depending on whats passed in to the program, how do i dynamicly create the Image object?
has anyone got a hint?
Cheers
|
|
|
|
|
Leon, something like this should work:
Random r = new Random();
int imageCount = r.Next();
Image[] images = new Image[imageCount];
string[] files = Directory.GetFiles("D:\", "*.jpg");
for(int i = 0; i < imageCount; i++)
images[i] = Image.FromFile(files[i]);
A couple of thoughts though, you should clean this up, I just typed it from my head. You will want to do validation to confirm you have files by checking the length of the array and checking for null, you may also want to limit the size of the number of images you want to get where I am just generating a random number. Don't forget to check and make sure that you have enough images on the CD in relation to the random number of images you are going to display. Hope this is of some help.
[EDIT]
You may also want to make your selection of the images from the collection of images you return from Directory.GetFiles(...) more random instead of just iterating throuh the list of files. Your call, this is just the basic idea.
[/EDIT]
- Nick Parker My Blog
|
|
|
|
|
I don't thing this should be the best way, maybe you should read and draw image on demand. How does it take to load e.g. 100 jpegs ?!
in .NET is very easy :
<br />
public bool ThumbnailCallback()<br />
{<br />
return false;<br />
}<br />
public void Example_GetThumb(PaintEventArgs e)<br />
{<br />
Image.GetThumbnailImageAbort myCallback =<br />
new Image.GetThumbnailImageAbort(ThumbnailCallback);<br />
Bitmap myBitmap = new Bitmap("Climber.jpg");<br />
Image myThumbnail = myBitmap.GetThumbnailImage(<br />
40, 40, myCallback, IntPtr.Zero);<br />
e.Graphics.DrawImage(myThumbnail, 150, 75);<br />
}<br />
Wizard_01
|
|
|
|
|
I think Leon was looking for a way to generate a random collection of images in memory based on images already stored on a CD. You are simply creating a thumbnail image from an existing file, not the collection of images needed.
- Nick Parker My Blog
|
|
|
|
|
The aswers you gave me where great, I was able to make my first little program.
So Cheers, and happy coding =)
|
|
|
|
|
I need to Get the List of computers connected in the server
.
I am working in 2000 prof and my server is 2000 Advanced server. Any one having idea in c#
Aravind.S
|
|
|
|
|
check sample at .NET SKD : \Samples\Technologies\Interop\Basic\ActiveDS\
or namespace System.DirectoryServices
Wiizi
|
|
|
|
|
Hi,
I would like to fill subitems on the fly of a ContextMenu. But it seems like the dot net menuItem class does not support this. The Popup event is never fired.
I fill my contextmenu with menuitems, which only has one dummy sub menuitem. Now i need an event to remove the dummy and populate the real items.
Any hints?
.:[Greetz from Jerry Maguire]:.
|
|
|
|
|
Try this :
<br />
this.ContextMenu.Popup += new EventHandler(ContextMenu_Popup);<br />
<br />
...<br />
<br />
private void ContextMenu_Popup(object sender, EventArgs e) {<br />
this.ContextMenu.MenuItems.Add(new MenuItem("ContextMenuPopup"));<br />
}<br />
I tried and it worked.
|
|
|
|
|
Hi
thanks, i will try it, but it only works for me if the sub menuitems also fire this event.
.:[Greetz from Jerry Maguire]:.
|
|
|
|
|
If not (I don't think it does, either), then learn a lesson from COM and have your objects that need to customize the context menu implement an interface of your design. Override the context menu nature (like preventing it from popping up automatically), check for the interface of the object that's being activated, and - for example - pass the ContextMenu to an interface method in order for the implementation to customize it. Then show the popup. There's many ways you can accomplish this, but basically take the approach that the active object will modify it's own ContextMenu based on its state or the state of objects to which it's related.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
This is how I do it:
- create a ContextMenuPopup in the application (I do this in the base form, but use it for multiple forms in the same application). I think that I used the GUI designer originally:
this.contextMenuPopup = new System.Windows.Forms.ContextMenu();
- the GUI designer threw this code in; how much is actually used? dunno!
this.contextMenuPopup.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItemTitle,
this.menuItemSep1,
this.menuItemOpt1,
this.menuItemOpt2,
this.menuItemOpt3});
this.contextMenuPopup.Popup += new System.EventHandler(this.contextMenuPopup_Popup);
- In the form you want it to apply to, add:
newWindowL.GraphicControl.ContextMenu = contextMenuPopup;
- Write a menu builder
This is tricky; you need to remember that:
- each MenuItem has to be a clone, not an original, if you are "mix'n'match"ing a menu. Well, I found that it helped 'cos some items are duplicated.
- each MenuItem needs an event handler. I use a recursive method to allow multi-level context menus
-MenuItemCommand is derived from MenuItem & does a few fancy things like storing a command object (cf "Command Patterns")
The code has just been copied & pasted. Use it more for ideas/principles than 'as is'; here goes:
#region ContextMenuPopup stuff
private void contextMenuPopup_Popup(object sender, System.EventArgs e)
{
ContextMenu ctxMenu = sender as ContextMenu;
if(ctxMenu == null)
return;
Control ctl = ctxMenu.SourceControl;
if(ctl == null)
return;
// blah blah
contextMenuBuilder.SetContextOptionNames(GarageSystem.Garage, hitStruct4ContextMenu, mEditingMenus, contextMenuPopup);
}
public void SetContextOptionNames(SEComponentMaster topLevel, Structure hitStruct, Menu.MenuItemCollection theMenuCollection,
ContextMenu theContextMenu)//, MenuClicker theEventHandler)
{
MenuClicker theEventHandler = new ContextMenuBuilder.MenuClicker(menuItemDynamicContextEntry_Click);
theContextMenu.MenuItems.Clear();
MenuPlusCommand theFilteredMenu = null;
if(mHitStructure.Owner is IWall)
{
theFilteredMenu = MenuBuilderFromXML.ReturnFirstMenuItemOwnerLike(theMenuCollection[0].MenuItems, "Wall");
}
theContextMenu.MenuItems.Add(mHitStructure.Name);
theContextMenu.MenuItems.Add("-");
if(theFilteredMenu != null)
{
MenuPlusCommand theFilteredMenuCopy = theFilteredMenu;
foreach(MenuItem I in theFilteredMenuCopy.MenuItems)
theContextMenu.MenuItems.Add(I.CloneMenu());
RecursiveSetContextMenuClickEventHandler(theContextMenu.MenuItems, theContextMenu, theEventHandler);
}
}
public static void RecursiveSetContextMenuClickEventHandler(Menu.MenuItemCollection theMenuItems, ContextMenu theContextMenu, MenuClicker theEventHandler)
{
if(theMenuItems != null)
{
foreach(MenuItem I in theMenuItems)
{
MenuPlusCommand thisSubItem = I as MenuPlusCommand;
if(thisSubItem != null)
{
if(thisSubItem.Command.ToString().Length > 1)
{
thisSubItem.Click += new System.EventHandler(theEventHandler);
}
else
{
if(thisSubItem.MenuItems.Count > 0)
{
RecursiveSetContextMenuClickEventHandler(thisSubItem.MenuItems, theContextMenu, theEventHandler);
}
}
}
}
}
}
Hope this helps
Regards
Brewman
|
|
|
|
|
I've been trawling the web for days now, looking for advanced information and source code explanation on C# and COM, and have come up almost completely empty handed.
This is extreemly frustrating, and I guess I'm close to giving up on this as there seems to be no chance of me ever managaging to implement this drag'n'drop problem I have.
If anyone could direct me to any decent resources that go deep into explaining the COM and C# interface, (the COM forums seem to be practicaly dead), I would be most appreciative.
Grats all
Cata
|
|
|
|
|
Where exactly are you stuck, I know Heath has been working with you on this recently.
- Nick Parker My Blog
Last time I checked, all programmers have selective ignorance. I know nothing about 3D graphics. I know a lot about COM. VB gets under people's skin because one can be ignorant of computer architecture and ASM and still get a lot done. - Don Box
|
|
|
|
|
The translation part.
I understand marshaling etc, and creating structures, enumerations and classes that can be interpreted by C and C++, however, there are a number of strange things in the decompilation that don't make sense to what I already know.
for instance, in EnumFormatEtc the output is changed from HRESULT (translates to int), into IEnumFormatEtc. And the HREESULT is remvoed all together.
In FormatEtc class, there is an int16 variable called "dummy", and I don't know why it is there, or what it does.
So basicaly, I'd like to find the translation guide.
Will it work if I do direct translations as well? Are these things just microsoft standards?
It's all bugging me.
Your help is appreciated, as I'd really not like to give up.
Cata
|
|
|
|
|
The Catalyst wrote:
So basicaly, I'd like to find the translation guide.
There is no "translation guide". Translation is done by knowing the Win32 APIs and the .NET SDK well. For example, why are the HRESULT s translated to void when interoping? Because most COM error codes are thrown using a COMException in .NET, specifying the result code (these can even be used for success codes, like S_FALSE ). If you need that HRESULT , you have to attribute your method with the PreserveSigAttribute(true) , or specify PreserveSig=true in any DllImportAttribute attributed methods.
I'm talking about knowing what marshaling means and what it does, I'm talking about knowing how to use the MarshalAsAttribute , the DllImportAttribute , the StructLayoutAttribute , the PreserveSigAttribute , and the various COM-related attributes (where appropriate) effectively. You must read about these and understand them well.
Knowing which managed type to use for a native type is simply understanding the bit-length and matter of the two types. A native char is 8 bits and and unsigned char is 8 bits unsigned, just like a System.Byte .
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
I use net send to send messages around a LAN. The message content i pull from the TextBox. But when the textBox contains two lines more. The net send only send the first line.
I know the net send end when it see the "\n".
But don't know how to solve. Is there anyone can help?
Thanks
|
|
|
|
|
what about trying \r, seeing windows is dumb!
leppie::AllocCPArticle("Zee blog"); Seen on my Campus BBS: Linux is free...coz no-one wants to pay for it.
|
|
|
|
|