2011年1月25日火曜日

Windows Live Mail が起動しない...

唐突に、Windows Live Mail が起動しなくなった...orz
起動すると、ウィンドウが開いた直後に落ちる。
一瞬だけウィンドウの中身が表示されて、
直後にウィンドウ内が真っ白になり、
「Windows Live Mail は動作を停止しました」とメッセージが。
それ以外はエラーメッセージも何もない。

・・・と思ったら、何度も起動を試してみると、
たまーに何事もなく起動したりもする。
何が起きているのやら。

Webで検索してみると、
Windows Update が、なんかよからぬことをしてる、
っていうのがすぐに見つかったので、
その噂の "KB2454826" を探してみたが
更新プログラムの履歴にはそんなのないですよ...?
最近インストールされたとおぼしき更新を
アンインストールしてみても、改善しない。


まぁ、Gmali をメインに使ってるから、
Windows Live Mail なんぞぶっ壊れても、
何とでもなるっちゃなるんだけど・・・。

6 件のコメント:

sawai さんのコメント...

一歩二歩散歩さま。
ウェブサイト、ブログなど参考にさせてもらっています。
メールでも送らせていただいたのですが、アドバイスをいただきたくコメントいたしました。

それは OpenGL in C#(以下glsharp)でのPrimitiveのピッキングについてです。
モデルの中の一つの三角形メッシュをマウスピッキングして削除したいと考え
以下のようなコードを書いたのですが、常に返り値が0です。

List hitObjects
= Selection.Pick(tmpMesh.mesh.Primitives, renderingParams, new double[]{ mouseX,mouseY),
new double[] {0.1 , 0.1}, this.cam , glp.CurrentViewport , true , out tempTrans);

原因、解決方法共に分かっておりません。そもそもglsharpではPrimitiveのピッキングは不可能なのでしょうか。
解決方法、アドバイス等いただけませんでしょうか?

一歩二歩散歩 さんのコメント...

こんなサイトですが、参考になってるのであれば幸いです。

で、問題の件ですが、おっしゃるとおりで、残念ながら、
そもそもプリミティブ単位でのピッキングはサポートしてません。

解決方法...
Selection.Pick()でピッキングできるのは、GLSharp.ISelectableインターフェイスを実装したオブジェクトのみが対象なのですが・・・
現状では、自前でISelectableを実装するクラスを作成して、プリミティブ単位のピッキングを行うようなコードを書くしかないです。
できないことはないと思いますが、少々面倒かもしれません。
GLSharpのModel、MeshModelクラスで実装してるので、そのあたりのソースコードが実装の参考になる・・・かも、しれません。

sawai さんのコメント...

一歩二歩散歩さま。
返事ありがとうございます。
自分なりに実装してみたのですが、やはりピッキングできませんでした。もしお暇であればアドバイスをいただけませんでしょうか?
///--Primitiveを継承したPickablePrimitive
public class PickablePrimitive : Primitive, ISelectable
{
public string name = "no name";
public PickablePrimitive()
{
}
public virtual string Name
{
get { return new string(name.ToCharArray()); }
set { this.name = value; }
}

private bool selectable = true;
public bool Selectable
{
get
{
return selectable;
}
set
{
selectable = value;
}
}

void ISelectable.DrawSceneForSelectionMode(IRenderingParams rp, uint name)
{
}

ISelectable ISelectable.GettHitObject(SelectionData selectionData)
{
return this;
}
}

//----Pickingを行うScene
// Primitiveのリストから,PickablePrimitiveにできる者のみそのまま,できんのはnullにしてリスト化
List pickableList = (from p in this.triangle.Primitives select (p as PickablePrimitive)).ToList();

//// nullのやつを除去 てげてげにラムダ式
pickableList.RemoveAll((m) => m == null);
List hitObjects
= Selection.Pick(pickableList, this.renderingParams, new double[] { winX, winY }, new double[] { 1, 1 },
this.cam, glp.CurrentViewport, true,
out this.pickedTransformMatrixes);

一歩二歩散歩 さんのコメント...

確かにISelectableインターフェイスは継承してますが、
DrawSceneForSelectionMode()メソッド内でヒットさせたいものを描画しないと、ヒットしません。
さらにいうと、Primitiveオブジェクトは頂点インデックスしか持っていない(頂点の座標を直接保持しているわけではない)ので、
Meshクラスあたりを使ってどうにかするしかないでしょうね・・・。

たぶん、
Meshクラスから頂点データとプリミティブのリストを取得して、
glPushName(), glPopName(), glLoadName() という関数を使いつつ、
プリミティブを1つずつ描画するコードを自分で書くことになると思います。
Mesh.DrawFlat()あたりのコードをベースにすれば、
何とかなりそうな気もしますが・・・結構な分量(たぶん200~400行ぐらい?)になりそうです。

一歩二歩散歩 さんのコメント...

ちょっと試しに作ってみたのですが、
こんな感じでいかがでしょうか?
まだコードは荒いままですが。

PrimitivePicker.zip
使い方は、

ISelectable[] tmp = { new PrimitivePikcer( meshModel ) };
List<SelectionData> result = Selection.Pick<ISelectable>( tmp, .... );

//ヒットしたプリミティブを取得。
Primitive picked = ((PrimitivePikcer.SelectablePrimive)result [0].item).Primitive;

sawai さんのコメント...

一歩二歩散歩さま.
ありがとうございます.
午前4時の返信に,余計な仕事を増やしてしまった者として,申し訳なく思っています.
早速試してみたいと思います.
動作の確認ができましたらまたコメントいたします.

追記:個人的になメールをitsospreyへ送りました.